15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/prerender/prerender_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/prerender_messages.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/document_state.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_frame.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DocumentState; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Updates the visibility state of the RenderFrame. Must be called whenever 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// prerendering starts or finishes and the page is about to be show. At both 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// those times, the RenderFrame is hidden. 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UpdateVisibilityState(content::RenderFrame* render_frame) { 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(jam): until the prerendering code works on frames instead of views, we 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // have to do this awkward check. 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderView* render_view = render_frame->GetRenderView(); 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_view->GetMainRenderFrame() == render_frame) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view->GetWebView()->setVisibilityState( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view->GetVisibilityState(), false); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrerenderHelper::PrerenderHelper(content::RenderFrame* render_frame) 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : content::RenderFrameObserver(render_frame), 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderFrameObserverTracker<PrerenderHelper>(render_frame) { 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateVisibilityState(render_frame); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrerenderHelper::~PrerenderHelper() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static. 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrerenderHelper::IsPrerendering(const content::RenderFrame* render_frame) { 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return PrerenderHelper::Get(render_frame) != NULL; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PrerenderHelper::OnMessageReceived( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PrerenderHelper, message) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrerenderMsg_SetIsPrerendering, OnSetIsPrerendering) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false on ViewMsg_SetIsPrerendering so other observers can see the 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrerenderHelper::OnSetIsPrerendering(bool is_prerendering) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Immediately after construction, |this| may receive the message that 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // triggered its creation. If so, ignore it. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_prerendering) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderFrame* frame = render_frame(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |this| must be deleted so PrerenderHelper::IsPrerendering returns false 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the visibility state is updated, so the visibility state string will 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not be "prerendered". 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateVisibilityState(frame); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 77