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"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_histograms.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_origin.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace autofill {
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct PasswordForm;
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace password_manager {
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass PasswordManager;
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderManager;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderTabHelper is responsible for recording perceived pageload times
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to compare PLT's with prerendering enabled and disabled.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderTabHelper
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::WebContentsObserver,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::WebContentsUserData<PrerenderTabHelper> {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum Event {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_LOGGED_IN_TABLE_REQUESTED = 0,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_LOGGED_IN_TABLE_PRESENT = 1,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_MAINFRAME_CHANGE = 2,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_MAINFRAME_CHANGE_DOMAIN_LOGGED_IN = 3,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_MAINFRAME_COMMIT = 4,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_MAINFRAME_COMMIT_DOMAIN_LOGGED_IN = 5,
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_LOGIN_ACTION_ADDED = 6,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EVENT_LOGIN_ACTION_ADDED_PW_EMPTY = 7,
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EVENT_MAX_VALUE
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static void CreateForWebContentsWithPasswordManager(
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::WebContents* web_contents,
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      password_manager::PasswordManager* password_manager);
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrerenderTabHelper();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::WebContentsObserver implementation.
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DidGetRedirectForResourceRequest(
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RenderViewHost* render_view_host,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const content::ResourceRedirectDetails& details) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStopLoading(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStartProvisionalLoadForFrame(
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHost* render_frame_host,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_error_page,
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool is_iframe_srcdoc) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidCommitProvisionalLoadForFrame(
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHost* render_frame_host,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PageTransition transition_type) OVERRIDE;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called when the URL of the main frame changed, either when the load
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // commits, or a redirect happens.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void MainFrameUrlDidChange(const GURL& url);
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Called when a password form has been submitted.
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PasswordSubmitted(const autofill::PasswordForm& form);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when this prerendered WebContents has just been swapped in.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrerenderSwappedIn();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Called when a control prerender is resolved. Applies to the next load.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void WouldHavePrerenderedNextLoad(Origin origin);
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PrerenderTabHelper(content::WebContents* web_contents,
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     password_manager::PasswordManager* password_manager);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class content::WebContentsUserData<PrerenderTabHelper>;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RecordEvent(Event event) const;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RecordEventIfLoggedInURL(Event event, const GURL& url);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RecordEventIfLoggedInURLResult(Event event, scoped_ptr<bool> is_present,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      scoped_ptr<bool> lookup_succeeded);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RecordPerceivedPageLoadTime(
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::TimeDelta perceived_page_load_time,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      double fraction_plt_elapsed_at_swap_in);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves the PrerenderManager, or NULL, if none was found.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderManager* MaybeGetPrerenderManager() const;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the WebContents being observed is currently prerendering.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrerendering();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The type the current pending navigation, if there is one. If the tab is a
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // prerender before swap, the value is always NAVIGATION_TYPE_PRERENDERED,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // even if the prerender is not currently loading.
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigationType navigation_type_;
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If |navigation_type_| is not NAVIGATION_TYPE_NORMAL, the origin of the
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // relevant prerender. Otherwise, ORIGIN_NONE.
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Origin origin_;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // True if the next load will be associated with a control prerender. This
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // extra state is needed because control prerenders are resolved before the
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // actual load begins. |next_load_origin_| gives the origin of the control
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // prerender.
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool next_load_is_control_prerender_;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Origin next_load_origin_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // System time at which the current load was started for the purpose of
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the perceived page load time (PPLT). If null, there is no current
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // load.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks pplt_load_start_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // System time at which the actual pageload started (pre-swapin), if
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a applicable (in cases when a prerender that was still loading was
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // swapped in).
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks actual_load_start_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current URL being loaded.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::WeakPtrFactory<PrerenderTabHelper> weak_factory_;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrerenderTabHelper);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace prerender
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_TAB_HELPER_H_
139