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