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