prerender_tab_helper.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_TAB_HELPER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PRERENDER_PRERENDER_TAB_HELPER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderManager;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderTabHelper is responsible for recording perceived pageload times
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to compare PLT's with prerendering enabled and disabled.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderTabHelper
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::WebContentsObserver,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::WebContentsUserData<PrerenderTabHelper> {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrerenderTabHelper();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::WebContentsObserver implementation.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ProvisionalChangeToMainFrameUrl(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& opener_url,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStopLoading(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStartProvisionalLoadForFrame(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 frame_id,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 parent_frame_id,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_main_frame,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_error_page,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidCommitProvisionalLoadForFrame(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 frame_id,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_main_frame,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PageTransition transition_type,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when this prerendered TabContents has just been swapped in.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrerenderSwappedIn();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PrerenderTabHelper(content::WebContents* web_contents);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class content::WebContentsUserData<PrerenderTabHelper>;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper class to compute pixel-based stats on the paint progress
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between when a prerendered page is swapped in and when the onload event
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fires.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class PixelStats;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PixelStats> pixel_stats_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves the PrerenderManager, or NULL, if none was found.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderManager* MaybeGetPrerenderManager() const;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the WebContents being observed is currently prerendering.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrerendering();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the WebContents being observed was prerendered.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrerendered();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // System time at which the current load was started for the purpose of
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the perceived page load time (PPLT).
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks pplt_load_start_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // System time at which the actual pageload started (pre-swapin), if
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a applicable (in cases when a prerender that was still loading was
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // swapped in).
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks actual_load_start_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current URL being loaded.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrerenderTabHelper);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace prerender
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_TAB_HELPER_H_
86