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_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/history/history_service.h" 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/media/media_capture_devices_dispatcher.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/logged_in_predictor_table.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_config.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prerender/prerender_events.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_final_status.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_histograms.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_origin.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h" 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_registrar.h" 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/render_process_host_observer.h" 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/session_storage_namespace.h" 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/cookie_monster.h" 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InstantSearchPrerendererTest; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct ChromeCookieDetails; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace chrome { 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)struct NavigateParams; 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class URLRequestContextGetter; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderCondition; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderHandle; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderHistory; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderLocalPredictor; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderManager is responsible for initiating and keeping prerendered 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views of web pages. All methods must be called on the UI thread unless 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicated otherwise. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::NonThreadSafe, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public content::NotificationObserver, 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public content::RenderProcessHostObserver, 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public KeyedService, 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public MediaCaptureDevicesDispatcher::Observer { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: New values need to be appended, since they are used in histograms. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PrerenderManagerMode { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_DISABLED = 0, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_ENABLED = 1, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP = 2, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP = 3, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Obsolete: PRERENDER_MODE_EXPERIMENT_5MIN_TTL_GROUP = 4, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP = 5, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP = 6, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP = 7, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_MODE_MAX 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One or more of these flags must be passed to ClearData() to specify just 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // what data to clear. See function declaration for more information. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ClearFlags { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLEAR_PRERENDER_CONTENTS = 0x1 << 0, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLEAR_PRERENDER_HISTORY = 0x1 << 1, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLEAR_MAX = 0x1 << 2 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef predictors::LoggedInPredictorTable::LoggedInStateMap LoggedInStateMap; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID indicating that no experiment is active. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kNoExperiment = 0; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by a Profile object for the lifetime of the profile. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager(Profile* profile, PrerenderTracker* prerender_tracker); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderManager(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // From KeyedService: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Shutdown() OVERRIDE; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Entry points for adding prerenders. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a prerender for |url| if valid. |process_id| and |route_id| identify 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the RenderView that the prerender request came from. If |size| is empty, a 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default from the PrerenderConfig is used. Returns a caller-owned 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderHandle* if the URL was added, NULL if it was not. If the launching 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderView is itself prerendering, the prerender is added as a pending 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerender. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderHandle* AddPrerenderFromLinkRelPrerender( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 rel_types, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a prerender for |url| if valid. As the prerender request is coming 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from a source without a RenderViewHost (i.e., the omnibox) we don't have a 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // child or route id, or a referrer. This method uses sensible values for 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // those. The |session_storage_namespace| matches the namespace of the active 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab at the time the prerender is generated from the omnibox. Returns a 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // caller-owned PrerenderHandle*, or NULL. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderHandle* AddPrerenderFromOmnibox( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) PrerenderHandle* AddPrerenderFromLocalPredictor( 145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const GURL& url, 146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace, 147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const gfx::Size& size); 148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderHandle* AddPrerenderFromExternalRequest( 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url, 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::Referrer& referrer, 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace, 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& size); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Adds a prerender for Instant Search |url| if valid. The 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |session_storage_namespace| matches the namespace of the active tab at the 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // time the prerender is generated. Returns a caller-owned PrerenderHandle* or 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NULL. 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderHandle* AddPrerenderForInstant( 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url, 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace, 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& size); 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancels all active prerenders. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelAllPrerenders(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // If |url| matches a valid prerendered page and |params| are compatible, try 1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // to swap it and merge browsing histories. Returns |true| and updates 1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // |params->target_contents| if a prerendered page is swapped in, |false| 1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // otherwise. 1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool MaybeUsePrerenderedPage(const GURL& url, 1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::NavigateParams* params); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Moves a PrerenderContents to the pending delete list from the list of 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active prerenders when prerendering should be cancelled. 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void MoveEntryToPendingDelete(PrerenderContents* entry, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinalStatus final_status); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Records the page load time for a prerender that wasn't swapped in. 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RecordPageLoadTimeNotSwappedIn(Origin origin, 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta page_load_time, 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Records the perceived page load time for a page - effectively the time from 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user navigates to a page to when it finishes loading. The actual 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load may have started prior to navigation due to prerender hints. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be called on the UI thread. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |fraction_plt_elapsed_at_swap_in| must either be in [0.0, 1.0], or a value 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // outside that range indicating that it doesn't apply. 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RecordPerceivedPageLoadTime( 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Origin origin, 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationType navigation_type, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta perceived_page_load_time, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double fraction_plt_elapsed_at_swap_in, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set whether prerendering is currently enabled for this manager. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called on the UI thread. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |enabled| is false, existing prerendered pages will still persist until 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they time out, but new ones will not be generated. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_enabled(bool enabled); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PrerenderManagerMode GetMode(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetMode(PrerenderManagerMode mode); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* GetModeString(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsPrerenderingPossible(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ActuallyPrerendering(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool IsControlGroup(uint8 experiment_id); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsNoUseGroup(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query the list of current prerender pages to see if the given web contents 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is prerendering a page. The optional parameter |origin| is an output 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parameter which, if a prerender is found, is set to the Origin of the 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerender |web_contents|. 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool IsWebContentsPrerendering(const content::WebContents* web_contents, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin* origin) const; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Whether the PrerenderManager has an active prerender with the given url and 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // SessionStorageNamespace associated with the given WebContens. 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool HasPrerenderedUrl(GURL url, content::WebContents* web_contents) const; 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the PrerenderContents object for the given web_contents, otherwise 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // returns NULL. Note that the PrerenderContents may have been Destroy()ed, 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // but not yet deleted. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents* GetPrerenderContents( 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::WebContents* web_contents) const; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the PrerenderContents object for a given child_id, route_id pair, 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // otherwise returns NULL. Note that the PrerenderContents may have been 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Destroy()ed, but not yet deleted. 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual PrerenderContents* GetPrerenderContentsForRoute( 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int child_id, int route_id) const; 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns a list of all WebContents being prerendered. 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<content::WebContents*> GetAllPrerenderingContents() const; 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether |url| has been recently navigated to. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasRecentlyBeenNavigatedTo(Origin origin, const GURL& url); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true iff the method given is valid for prerendering. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsValidHttpMethod(const std::string& method); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true iff the scheme of the URL given is valid for prerendering. 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool DoesURLHaveValidScheme(const GURL& url); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns true iff the scheme of the subresource URL given is valid for 247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // prerendering. 248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static bool DoesSubresourceURLHaveValidScheme(const GURL& url); 249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a Value object containing the active pages being prerendered, and 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a history of pages which were prerendered. The caller is responsible for 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleting the return value. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* GetAsValue() const; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clears the data indicated by which bits of clear_flags are set. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the CLEAR_PRERENDER_CONTENTS bit is set, all active prerenders are 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cancelled and then deleted, and any WebContents queued for destruction are 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed as well. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the CLEAR_PRERENDER_HISTORY bit is set, the prerender history is 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cleared, including any entries newly created by destroying them in 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response to the CLEAR_PRERENDER_CONTENTS flag. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intended to be used when clearing the cache or history. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearData(int clear_flags); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record a final status of a prerendered page in a histogram. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This variation allows specifying whether prerendering had been started 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (necessary to flag MatchComplete dummies). 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordFinalStatusWithMatchCompleteStatus( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::MatchCompleteStatus mc_status, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus final_status) const; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Record a cookie status histogram (see prerender_histograms.h). 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RecordCookieStatus(Origin origin, 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8 experiment_id, 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int cookie_status) const; 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Record a cookie send type histogram (see prerender_histograms.h). 28323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void RecordCookieSendType(Origin origin, 28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uint8 experiment_id, 28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int cookie_send_type) const; 28623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // content::NotificationObserver 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Observe(int type, 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationSource& source, 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 292ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // MediaCaptureDevicesDispatcher::Observer 293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnCreatingAudioStream(int render_process_id, 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id) OVERRIDE; 295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Config& config() const { return config_; } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Config& mutable_config() { return config_; } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker() { return prerender_tracker_; } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool cookie_store_loaded() { return cookie_store_loaded_; } 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a condition. This is owned by the PrerenderManager. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCondition(const PrerenderCondition* condition); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Records that some visible tab navigated (or was redirected) to the 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided URL. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordNavigation(const GURL& url); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Updates the LoggedInPredictor state to reflect that a login has likely 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // on the URL provided. 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RecordLikelyLoginOnURL(const GURL& url); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Checks if the LoggedInPredictor shows that the user is likely logged on 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to the site for the URL provided. 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CheckIfLikelyLoggedInOnURL(const GURL& url, 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool* lookup_result, 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool* database_was_present, 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Closure& result_cb); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnHistoryServiceDidQueryURL(Origin origin, 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8 experiment_id, 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool success, 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const history::URLRow& url_row, 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const history::VisitVector& visits); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile() const { return profile_; } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Classes which will be tested in prerender unit browser tests should use 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // these methods to get times for comparison, so that the test framework can 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mock advancing/retarding time. 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::Time GetCurrentTime() const; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::TimeTicks GetCurrentTimeTicks() const; 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<predictors::LoggedInPredictorTable> 336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) logged_in_predictor_table() { 337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return logged_in_predictor_table_; 338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 340a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PrerenderLocalPredictor* local_predictor() { 341a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return local_predictor_.get(); 342a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 343a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notification that a cookie event happened on a render frame. Will record a 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cookie event for a given render frame, if it is being prerendered. 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If cookies were sent, all cookies must be supplied in |cookie_list|. 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void RecordCookieEvent(int process_id, 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame_id, 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& frame_url, 35123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_for_blocking_resource, 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContents::CookieEvent event, 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const net::CookieList* cookie_list); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Arranges for all session storage merges to hang indefinitely. This is used 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to reliably test various swap abort cases. 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void HangSessionStorageMergesForTesting(); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notification that a prerender has completed and its bytes should be 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // recorded. 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void RecordNetworkBytes(Origin origin, bool used, int64 prerender_bytes); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Returns whether prerendering is currently enabled for this manager. 3646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool IsEnabled() const; 3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add to the running tally of bytes transferred over the network for this 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // profile if prerendering is currently enabled. 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddProfileNetworkBytesIfEnabled(int64 bytes); 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Registers a new ProcessHost performing a prerender. Called by 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // PrerenderContents. 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void AddPrerenderProcessHost(content::RenderProcessHost* process_host); 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns whether or not |process_host| may be reused for new navigations 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // from a prerendering perspective. Currently, if Prerender Cookie Stores are 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // enabled, prerenders must be in their own processes that may not be shared. 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool MayReuseProcessHost(content::RenderProcessHost* process_host); 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // content::RenderProcessHostObserver implementation. 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void RenderProcessHostDestroyed( 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::RenderProcessHost* host) OVERRIDE; 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // To be called once the cookie store for this profile has been loaded. 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnCookieStoreLoaded(); 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For testing purposes. Issues a callback once the cookie store has been 387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // loaded. 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void set_on_cookie_store_loaded_cb_for_testing(base::Closure cb) { 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) on_cookie_store_loaded_cb_for_testing_ = cb; 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class PendingSwap; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class PrerenderData : public base::SupportsWeakPtr<PrerenderData> { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct OrderByExpiryTime; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderData(PrerenderManager* manager, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents* contents, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks expiry_time); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PrerenderData(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Turn this PrerenderData into a Match Complete replacement for itself, 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // placing the current prerender contents into |to_delete_prerenders_|. 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MakeIntoMatchCompleteReplacement(); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A new PrerenderHandle has been created for this PrerenderData. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnHandleCreated(PrerenderHandle* prerender_handle); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The launcher associated with a handle is navigating away from the context 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that launched this prerender. If the prerender is active, it may stay 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // alive briefly though, in case we we going through a redirect chain that 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will eventually land at it. 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnHandleNavigatedAway(PrerenderHandle* prerender_handle); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The launcher associated with a handle has taken explicit action to cancel 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this prerender. We may well destroy the prerender in this case if no 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // other handles continue to track it. 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnHandleCanceled(PrerenderHandle* prerender_handle); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* contents() { return contents_.get(); } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* ReleaseContents(); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int handle_count() const { return handle_count_; } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks abandon_time() const { return abandon_time_; } 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks expiry_time() const { return expiry_time_; } 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_expiry_time(base::TimeTicks expiry_time) { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiry_time_ = expiry_time; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ClearPendingSwap(); 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PendingSwap* pending_swap() { return pending_swap_.get(); } 438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void set_pending_swap(PendingSwap* pending_swap) { 439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_swap_.reset(pending_swap); 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* manager_; 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PrerenderContents> contents_; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of distinct PrerenderHandles created for |this|, including 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ones that have called PrerenderData::OnHandleNavigatedAway(), but not 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // counting the ones that have called PrerenderData::OnHandleCanceled(). For 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pending prerenders, this will always be 1, since the PrerenderManager 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only merges handles of running prerenders. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int handle_count_; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 453effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The time when OnHandleNavigatedAway was called. 454effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks abandon_time_; 455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After this time, this prerender is no longer fresh, and should be 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removed. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks expiry_time_; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If a session storage namespace merge is in progress for this object, 461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // we need to keep track of various state associated with it. 462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<PendingSwap> pending_swap_; 463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrerenderData); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // When a swap can't happen immediately, due to a sesison storage namespace 468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // merge, there will be a pending swap object while the merge is in 469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // progress. It retains all the data needed to do the merge, maintains 470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // throttles for the navigation in the target WebContents that needs to be 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // delayed, and handles all conditions which would cancel a pending swap. 472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class PendingSwap : public content::WebContentsObserver { 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PendingSwap(PrerenderManager* manager, 475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* target_contents, 476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderData* prerender_data, 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_replace_current_entry); 479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~PendingSwap(); 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* target_contents() const; 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void set_swap_successful(bool swap_successful) { 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) swap_successful_ = swap_successful; 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void BeginSwap(); 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // content::WebContentsObserver implementation. 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AboutToNavigateRenderView( 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ProvisionalChangeToMainFrameUrl( 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url, 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost* render_frame_host) OVERRIDE; 494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidCommitProvisionalLoadForFrame( 495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 frame_id, 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& frame_unique_name, 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_main_frame, 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& validated_url, 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::PageTransition transition_type, 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidFailProvisionalLoad( 502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 frame_id, 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& frame_unique_name, 504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_main_frame, 505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& validated_url, 506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int error_code, 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& error_description, 508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE; 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RecordEvent(PrerenderEvent event) const; 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnMergeCompleted(content::SessionStorageNamespace::MergeResult result); 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnMergeTimeout(); 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Prerender parameters. 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrerenderManager* manager_; 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderData* prerender_data_; 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL url_; 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_replace_current_entry_; 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::TimeTicks start_time_; 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTracker::ChildRouteIdPair target_route_id_; 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool seen_target_route_id_; 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::OneShotTimer<PendingSwap> merge_timeout_; 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool swap_successful_; 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtrFactory<PendingSwap> weak_factory_; 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetPrerenderContentsFactory( 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Factory* prerender_contents_factory); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by a PrerenderData to signal that the launcher has navigated away 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the context that launched the prerender. A user may have clicked 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a link in a page containing a <link rel=prerender> element, or the user 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // might have committed an omnibox navigation. This is used to possibly 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shorten the TTL of the prerendered page. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SourceNavigatedAway(PrerenderData* prerender_data); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Gets the request context for the profile. 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For unit tests, this will be overriden to return NULL, since it is not 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // needed. 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual net::URLRequestContextGetter* GetURLRequestContext(); 546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) friend class ::InstantSearchPrerendererTest; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PrerenderBrowserTest; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PrerenderContents; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PrerenderHandle; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class UnitTestPrerenderManager; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class OnCloseWebContentsDeleter; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct NavigationRecord; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time interval before a new prerender is allowed. 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMinTimeBetweenPrerendersMs = 500; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time window for which we record old navigations, in milliseconds. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kNavigationRecordWindowMs = 5000; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCancelPrerenderHandle(PrerenderData* prerender_data); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a prerender for |url| from |referrer| initiated from the process 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |child_id|. The |origin| specifies how the prerender was added. If |size| 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is empty, then PrerenderContents::StartPrerendering will instead use a 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default from PrerenderConfig. Returns a PrerenderHandle*, owned by the 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // caller, or NULL. 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderHandle* AddPrerender( 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartSchedulingPeriodicCleanups(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopSchedulingPeriodicCleanups(); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EvictOldestPrerendersIfNecessary(); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes stale and cancelled prerendered PrerenderContents, as well as 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents that have been replaced by prerendered WebContents. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also identifies and kills PrerenderContents that use too much 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resources. 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PeriodicCleanup(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Posts a task to call PeriodicCleanup. Results in quicker destruction of 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // objects. If |this| is deleted before the task is run, the task will 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // automatically be cancelled. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PostCleanupTask(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::TimeTicks GetExpiryTimeForNewPrerender(Origin origin) const; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks GetExpiryTimeForNavigatedAwayPrerender() const; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteOldEntries(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insures the |active_prerenders_| are sorted by increasing expiry time. Call 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after every mutation of active_prerenders_ that can possibly make it 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unsorted (e.g. an insert, or changing an expiry time). 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SortActivePrerenders(); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds the active PrerenderData object for a running prerender matching 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |url| and |session_storage_namespace|. 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderData* FindPrerenderData( 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::SessionStorageNamespace* session_storage_namespace); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Finds the active PrerenderData object currently in a PendingSwap for 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |target_contents|. Otherwise, returns NULL. 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderData* FindPrerenderDataForTargetContents( 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* target_contents); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Given the |prerender_contents|, find the iterator in active_prerenders_ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // correponding to the given prerender. 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<PrerenderData>::iterator 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindIteratorForPrerenderContents(PrerenderContents* prerender_contents); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DoesRateLimitAllowPrerender(Origin origin) const; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes old WebContents that have been replaced by prerendered ones. This 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is needed because they're replaced in a callback from the old WebContents, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so cannot immediately be deleted. 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DeleteOldWebContents(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cleans up old NavigationRecord's. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CleanUpOldNavigations(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Arrange for the given WebContents to be deleted asap. If deleter is not 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL, deletes that as well. 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ScheduleDeleteOldWebContents(content::WebContents* tab, 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnCloseWebContentsDeleter* deleter); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds to the history list. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddToHistory(PrerenderContents* contents); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a new Value representing the pages currently being prerendered. The 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // caller is responsible for delete'ing the return value. 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* GetActivePrerendersAsValue() const; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys all pending prerenders using FinalStatus. Also deletes them as 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // well as any swapped out WebContents queued for destruction. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used both on destruction, and when clearing the browsing history. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyAllContents(FinalStatus final_status); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to destroy a PrerenderContents with the specified 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // final_status, while at the same time recording that for the MatchComplete 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case, that this prerender would have been used. 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyAndMarkMatchCompleteAsUsed(PrerenderContents* prerender_contents, 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus final_status); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Records the final status a prerender in the case that a PrerenderContents 659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // was never created, and also adds a PrerenderHistory entry. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a helper function which will ultimately call 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RecordFinalStatusWthMatchCompleteStatus, using MATCH_COMPLETE_DEFAULT. 662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void RecordFinalStatusWithoutCreatingPrerenderContents( 663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, Origin origin, uint8 experiment_id, 664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FinalStatus final_status) const; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CookieChanged(ChromeCookieDetails* details); 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CookieChangedAnyCookiesLeftLookupResult(const std::string& domain_key, 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool cookies_exist); 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void LoggedInPredictorDataReceived(scoped_ptr<LoggedInStateMap> new_map); 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RecordEvent(PrerenderContents* contents, PrerenderEvent event) const; 673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Swaps a prerender |prerender_data| for |url| into the tab, replacing 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |web_contents|. Returns the new WebContents that was swapped in, or NULL 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if a swap-in was not possible. If |should_replace_current_entry| is true, 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the current history entry in |web_contents| is replaced. 678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* SwapInternal(const GURL& url, 679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* web_contents, 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderData* prerender_data, 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_replace_current_entry); 682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The configuration. 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Config config_; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies whether prerendering is currently enabled for this 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manager. The value can change dynamically during the lifetime 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the PrerenderManager. 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled_; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile that owns this PrerenderManager. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker_; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All running prerenders. Sorted by expiry time, in ascending order. 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<PrerenderData> active_prerenders_; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prerenders awaiting deletion. 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<PrerenderData> to_delete_prerenders_; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List of recent navigations in this profile, sorted by ascending 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigate_time_. 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<NavigationRecord> navigations_; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PrerenderContents::Factory> prerender_contents_factory_; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PrerenderManagerMode mode_; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A count of how many prerenders we do per session. Initialized to 0 then 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // incremented and emitted to a histogram on each successful prerender. 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int prerenders_per_session_count_; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RepeatingTimer to perform periodic cleanups of pending prerendered 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pages. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<PrerenderManager> repeating_timer_; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Track time of last prerender to limit prerender spam. 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks last_prerender_start_time_; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<content::WebContents*> old_web_contents_list_; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<OnCloseWebContentsDeleter> on_close_web_contents_deleters_; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PrerenderHistory> prerender_history_; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<const PrerenderCondition*> prerender_conditions_; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PrerenderHistograms> histograms_; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PrerenderLocalPredictor> local_predictor_; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<predictors::LoggedInPredictorTable> logged_in_predictor_table_; 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Here, we keep the logged in predictor state, but potentially a superset 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of its actual (database-backed) state, since we do not incorporate 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // browser data deletion. We do not use this for actual lookups, but only 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to query cookie data for domains we know there was a login before. 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is required to avoid a large number of cookie lookups on bulk 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // deletion of cookies. 741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LoggedInStateMap> logged_in_state_; 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationRegistrar notification_registrar_; 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 745f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::CancelableTaskTracker query_url_tracker_; 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The number of bytes transferred over the network for the profile this 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PrerenderManager is attached to. 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 profile_network_bytes_; 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The value of profile_network_bytes_ that was last recorded. 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 last_recorded_profile_network_bytes_; 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set of process hosts being prerendered. 755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) typedef std::set<content::RenderProcessHost*> PrerenderProcessSet; 756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrerenderProcessSet prerender_process_hosts_; 757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Indicates whether the cookie store for this profile has fully loaded yet. 759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool cookie_store_loaded_; 760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Closure on_cookie_store_loaded_cb_for_testing_; 762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrerenderManager); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_H_ 769