Home | History | Annotate | Download | only in prerender
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/renderer/prerender/prerender_helper.h"
      6 
      7 #include "base/metrics/field_trial.h"
      8 #include "base/metrics/histogram.h"
      9 #include "chrome/common/prerender_messages.h"
     10 #include "content/public/renderer/document_state.h"
     11 #include "content/public/renderer/render_view.h"
     12 #include "third_party/WebKit/public/web/WebFrame.h"
     13 #include "third_party/WebKit/public/web/WebView.h"
     14 
     15 using content::DocumentState;
     16 
     17 namespace {
     18 
     19 // Updates the visibility state of the RenderView.  Must be called whenever
     20 // prerendering starts or finishes and the page is about to be show.  At both
     21 // those times, the RenderView is hidden.
     22 void UpdateVisibilityState(content::RenderView* render_view) {
     23   if (render_view->GetWebView()) {
     24     render_view->GetWebView()->setVisibilityState(
     25         render_view->GetVisibilityState(), false);
     26   }
     27 }
     28 
     29 }  // namespace
     30 
     31 namespace prerender {
     32 
     33 PrerenderHelper::PrerenderHelper(content::RenderView* render_view)
     34     : content::RenderViewObserver(render_view),
     35       content::RenderViewObserverTracker<PrerenderHelper>(render_view) {
     36   UpdateVisibilityState(render_view);
     37 }
     38 
     39 PrerenderHelper::~PrerenderHelper() {
     40 }
     41 
     42 // static.
     43 bool PrerenderHelper::IsPrerendering(const content::RenderView* render_view) {
     44   return PrerenderHelper::Get(render_view) != NULL;
     45 }
     46 
     47 bool PrerenderHelper::OnMessageReceived(
     48     const IPC::Message& message) {
     49   IPC_BEGIN_MESSAGE_MAP(PrerenderHelper, message)
     50     IPC_MESSAGE_HANDLER(PrerenderMsg_SetIsPrerendering, OnSetIsPrerendering)
     51   IPC_END_MESSAGE_MAP()
     52   // Return false on ViewMsg_SetIsPrerendering so other observers can see the
     53   // message.
     54   return false;
     55 }
     56 
     57 void PrerenderHelper::OnSetIsPrerendering(bool is_prerendering) {
     58   // Immediately after construction, |this| may receive the message that
     59   // triggered its creation.  If so, ignore it.
     60   if (is_prerendering)
     61     return;
     62 
     63   content::RenderView* view = render_view();
     64   // |this| must be deleted so PrerenderHelper::IsPrerendering returns false
     65   // when the visibility state is updated, so the visibility state string will
     66   // not be "prerendered".
     67   delete this;
     68 
     69   UpdateVisibilityState(view);
     70 }
     71 
     72 }  // namespace prerender
     73