Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ | 5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ |
| 6 #define CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ | 6 #define CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ |
| 7 | 7 |
| 8 #include <map> | |
| 8 #include <vector> | 9 #include <vector> |
| 9 | 10 |
| 10 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 11 #include "base/memory/scoped_vector.h" | 12 #include "base/memory/scoped_vector.h" |
| 12 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
| 13 #include "base/timer/timer.h" | 14 #include "base/timer/timer.h" |
| 14 #include "chrome/browser/common/cancelable_request.h" | 15 #include "chrome/browser/common/cancelable_request.h" |
| 15 #include "chrome/browser/history/visit_database.h" | 16 #include "chrome/browser/history/visit_database.h" |
| 17 #include "net/url_request/url_fetcher_delegate.h" | |
| 16 #include "url/gurl.h" | 18 #include "url/gurl.h" |
| 17 | 19 |
| 18 class HistoryService; | 20 class HistoryService; |
| 19 | 21 |
| 20 namespace content { | 22 namespace content { |
| 21 class SessionStorageNamespace; | 23 class SessionStorageNamespace; |
| 22 class WebContents; | 24 class WebContents; |
| 23 } | 25 } |
| 24 | 26 |
| 25 namespace gfx { | 27 namespace gfx { |
| 26 class Size; | 28 class Size; |
| 27 } | 29 } |
| 28 | 30 |
| 29 namespace prerender { | 31 namespace prerender { |
| 30 | 32 |
| 31 class PrerenderHandle; | 33 class PrerenderHandle; |
| 32 class PrerenderManager; | 34 class PrerenderManager; |
| 33 | 35 |
| 34 // PrerenderLocalPredictor maintains local browsing history to make prerender | 36 // PrerenderLocalPredictor maintains local browsing history to make prerender |
| 35 // predictions. | 37 // predictions. |
| 36 // At this point, the class is not actually creating prerenders, but just | 38 // At this point, the class is not actually creating prerenders, but just |
| 37 // recording timing stats about the effect prerendering would have. | 39 // recording timing stats about the effect prerendering would have. |
| 38 class PrerenderLocalPredictor : public history::VisitDatabaseObserver { | 40 class PrerenderLocalPredictor : public history::VisitDatabaseObserver, |
| 41 public net::URLFetcherDelegate { | |
| 39 public: | 42 public: |
| 40 struct LocalPredictorURLInfo; | 43 struct LocalPredictorURLInfo; |
| 41 struct LocalPredictorURLLookupInfo; | 44 struct CandidatePrerenderInfo; |
| 42 enum Event { | 45 enum Event { |
| 43 EVENT_CONSTRUCTED = 0, | 46 EVENT_CONSTRUCTED = 0, |
| 44 EVENT_INIT_SCHEDULED = 1, | 47 EVENT_INIT_SCHEDULED = 1, |
| 45 EVENT_INIT_STARTED = 2, | 48 EVENT_INIT_STARTED = 2, |
| 46 EVENT_INIT_FAILED_NO_HISTORY = 3, | 49 EVENT_INIT_FAILED_NO_HISTORY = 3, |
| 47 EVENT_INIT_SUCCEEDED = 4, | 50 EVENT_INIT_SUCCEEDED = 4, |
| 48 EVENT_ADD_VISIT = 5, | 51 EVENT_ADD_VISIT = 5, |
| 49 EVENT_ADD_VISIT_INITIALIZED = 6, | 52 EVENT_ADD_VISIT_INITIALIZED = 6, |
| 50 EVENT_ADD_VISIT_PRERENDER_IDENTIFIED = 7, | 53 EVENT_ADD_VISIT_PRERENDER_IDENTIFIED = 7, |
| 51 EVENT_ADD_VISIT_RELEVANT_TRANSITION = 8, | 54 EVENT_ADD_VISIT_RELEVANT_TRANSITION = 8, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 EVENT_TAB_HELPER_URL_SEEN = 46, | 92 EVENT_TAB_HELPER_URL_SEEN = 46, |
| 90 EVENT_TAB_HELPER_URL_SEEN_MATCH = 47, | 93 EVENT_TAB_HELPER_URL_SEEN_MATCH = 47, |
| 91 EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH = 48, | 94 EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH = 48, |
| 92 EVENT_PRERENDER_URL_LOOKUP_MULTIPLE_SOURCE_WEBCONTENTS_FOUND = 49, | 95 EVENT_PRERENDER_URL_LOOKUP_MULTIPLE_SOURCE_WEBCONTENTS_FOUND = 49, |
| 93 EVENT_CONTINUE_PRERENDER_CHECK_ON_SIDE_EFFECT_FREE_WHITELIST = 50, | 96 EVENT_CONTINUE_PRERENDER_CHECK_ON_SIDE_EFFECT_FREE_WHITELIST = 50, |
| 94 EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL = 51, | 97 EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL = 51, |
| 95 EVENT_ISSUE_PRERENDER_ALREADY_PRERENDERING = 52, | 98 EVENT_ISSUE_PRERENDER_ALREADY_PRERENDERING = 52, |
| 96 EVENT_ISSUE_PRERENDER_NEW_PRERENDER = 53, | 99 EVENT_ISSUE_PRERENDER_NEW_PRERENDER = 53, |
| 97 EVENT_ISSUE_PRERENDER_CANCELLED_OLD_PRERENDER = 54, | 100 EVENT_ISSUE_PRERENDER_CANCELLED_OLD_PRERENDER = 54, |
| 98 EVENT_CONTINUE_PRERENDER_CHECK_FALLTHROUGH_PRERENDERING = 55, | 101 EVENT_CONTINUE_PRERENDER_CHECK_FALLTHROUGH_PRERENDERING = 55, |
| 102 EVENT_PRERENDER_URL_LOOKUP_SUCCESS = 56, | |
| 103 EVENT_PRERENDER_SERVICE_DISABLED = 57, | |
| 104 EVENT_PRERENDER_SERVICE_ISSUED_LOOKUP = 58, | |
| 105 EVENT_PRERENDER_SERVICE_LOOKUP_TIMED_OUT = 59, | |
| 106 EVENT_PRERENDER_SERVICE_RECEIVED_RESULT = 60, | |
| 107 EVENT_PRERENDER_SERVICE_NO_RECORD_FOR_RESULT = 61, | |
| 108 EVENT_PRERENDER_SERVICE_PARSED_CORRECTLY = 62, | |
| 109 EVENT_PRERENDER_SERVICE_PARSE_ERROR = 63, | |
| 110 EVENT_PRERENDER_SERVICE_PARSE_ERROR_INCORRECT_JSON = 64, | |
| 111 EVENT_PRERENDER_SERVICE_HINTING_TIMED_OUT = 65, | |
| 112 EVENT_PRERENDER_SERVICE_HINTING_URL_LOOKUP_TIMED_OUT = 66, | |
| 113 EVENT_PRERENDER_SERVICE_CANDIDATE_URL_LOOKUP_TIMED_OUT = 67, | |
| 114 EVENT_CONTINUE_PRERENDER_CHECK_ON_SERVICE_WHITELIST = 68, | |
| 99 EVENT_MAX_VALUE | 115 EVENT_MAX_VALUE |
| 100 }; | 116 }; |
| 101 | 117 |
| 102 // A PrerenderLocalPredictor is owned by the PrerenderManager specified | 118 // A PrerenderLocalPredictor is owned by the PrerenderManager specified |
| 103 // in the constructor. It will be destoryed at the time its owning | 119 // in the constructor. It will be destoryed at the time its owning |
| 104 // PrerenderManager is destroyed. | 120 // PrerenderManager is destroyed. |
| 105 explicit PrerenderLocalPredictor(PrerenderManager* prerender_manager); | 121 explicit PrerenderLocalPredictor(PrerenderManager* prerender_manager); |
| 106 virtual ~PrerenderLocalPredictor(); | 122 virtual ~PrerenderLocalPredictor(); |
| 107 | 123 |
| 108 void Shutdown(); | 124 void Shutdown(); |
| 109 | 125 |
| 110 // history::VisitDatabaseObserver implementation | 126 // history::VisitDatabaseObserver implementation |
| 111 virtual void OnAddVisit(const history::BriefVisitInfo& info) OVERRIDE; | 127 virtual void OnAddVisit(const history::BriefVisitInfo& info) OVERRIDE; |
| 112 | 128 |
| 113 void OnGetInitialVisitHistory( | 129 void OnGetInitialVisitHistory( |
| 114 scoped_ptr<std::vector<history::BriefVisitInfo> > visit_history); | 130 scoped_ptr<std::vector<history::BriefVisitInfo> > visit_history); |
| 115 | 131 |
| 116 void OnPLTEventForURL(const GURL& url, base::TimeDelta page_load_time); | 132 void OnPLTEventForURL(const GURL& url, base::TimeDelta page_load_time); |
| 117 | 133 |
| 118 void OnTabHelperURLSeen(const GURL& url, content::WebContents* web_contents); | 134 void OnTabHelperURLSeen(const GURL& url, content::WebContents* web_contents); |
| 119 | 135 |
| 136 void virtual OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; | |
|
jam
2013/08/30 20:34:30
usually we write
// net::URLFetcherDelegate imple
tburkard
2013/08/30 20:59:01
Done.
| |
| 137 | |
| 120 private: | 138 private: |
| 121 struct PrerenderProperties; | 139 struct PrerenderProperties; |
| 122 HistoryService* GetHistoryIfExists() const; | 140 HistoryService* GetHistoryIfExists() const; |
| 123 void Init(); | 141 void Init(); |
| 124 bool IsPrerenderStillValid(PrerenderProperties* prerender) const; | 142 bool IsPrerenderStillValid(PrerenderProperties* prerender) const; |
| 125 bool DoesPrerenderMatchPLTRecord(PrerenderProperties* prerender, | 143 bool DoesPrerenderMatchPLTRecord(PrerenderProperties* prerender, |
| 126 const GURL& url, | 144 const GURL& url, |
| 127 base::TimeDelta plt) const; | 145 base::TimeDelta plt) const; |
| 128 void RecordEvent(Event event) const; | 146 void RecordEvent(Event event) const; |
| 129 | 147 |
| 130 void OnLookupURL(scoped_ptr<LocalPredictorURLLookupInfo> info); | 148 void OnLookupURL(scoped_ptr<CandidatePrerenderInfo> info); |
| 149 | |
| 150 // Lookup the prerender candidate in the Prerender Service (if applicable). | |
| 151 void DoPrerenderServiceCheck(scoped_ptr<CandidatePrerenderInfo> info); | |
| 152 | |
| 153 // Lookup the prerender candidate in the LoggedIn Predictor. | |
| 154 void DoLoggedInLookup(scoped_ptr<CandidatePrerenderInfo> info); | |
| 131 | 155 |
| 132 // Returns an element of issued_prerenders_, which should be replaced | 156 // Returns an element of issued_prerenders_, which should be replaced |
| 133 // by a new prerender of the priority indicated, or NULL, if the priority | 157 // by a new prerender of the priority indicated, or NULL, if the priority |
| 134 // is too low. | 158 // is too low. |
| 135 PrerenderProperties* GetIssuedPrerenderSlotForPriority(double priority); | 159 PrerenderProperties* GetIssuedPrerenderSlotForPriority(double priority); |
| 136 | 160 |
| 137 void ContinuePrerenderCheck( | 161 void ContinuePrerenderCheck(scoped_ptr<CandidatePrerenderInfo> info); |
| 138 scoped_refptr<content::SessionStorageNamespace> session_storage_namespace, | |
| 139 scoped_ptr<gfx::Size> size, | |
| 140 scoped_ptr<LocalPredictorURLLookupInfo> info); | |
| 141 void LogCandidateURLStats(const GURL& url) const; | 162 void LogCandidateURLStats(const GURL& url) const; |
| 142 void IssuePrerender(scoped_refptr<content::SessionStorageNamespace> | 163 void IssuePrerender(scoped_ptr<CandidatePrerenderInfo> info, |
| 143 session_storage_namespace, | 164 scoped_ptr<LocalPredictorURLInfo> url_info, |
| 144 scoped_ptr<gfx::Size> size, | |
| 145 scoped_ptr<LocalPredictorURLInfo> info, | |
| 146 PrerenderProperties* prerender_properties); | 165 PrerenderProperties* prerender_properties); |
| 166 void MaybeCancelURLFetcher(net::URLFetcher* fetcher); | |
| 167 typedef std::map<net::URLFetcher*, CandidatePrerenderInfo*> | |
| 168 OutstandingFetchers; | |
|
jam
2013/08/30 20:34:30
indent
tburkard
2013/08/30 20:59:01
Done.
| |
| 169 OutstandingFetchers outstanding_prerender_service_requests_; | |
| 147 PrerenderManager* prerender_manager_; | 170 PrerenderManager* prerender_manager_; |
| 148 base::OneShotTimer<PrerenderLocalPredictor> timer_; | 171 base::OneShotTimer<PrerenderLocalPredictor> timer_; |
| 149 | 172 |
| 150 // Delay after which to initialize, to avoid putting to much load on the | 173 // Delay after which to initialize, to avoid putting to much load on the |
| 151 // database thread early on when Chrome is starting up. | 174 // database thread early on when Chrome is starting up. |
| 152 static const int kInitDelayMs = 5 * 1000; | 175 static const int kInitDelayMs = 5 * 1000; |
| 153 | 176 |
| 154 // Whether we're registered with the history service as a | 177 // Whether we're registered with the history service as a |
| 155 // history::VisitDatabaseObserver. | 178 // history::VisitDatabaseObserver. |
| 156 bool is_visit_database_observer_; | 179 bool is_visit_database_observer_; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 167 base::hash_set<int64> url_whitelist_; | 190 base::hash_set<int64> url_whitelist_; |
| 168 | 191 |
| 169 base::WeakPtrFactory<PrerenderLocalPredictor> weak_factory_; | 192 base::WeakPtrFactory<PrerenderLocalPredictor> weak_factory_; |
| 170 | 193 |
| 171 DISALLOW_COPY_AND_ASSIGN(PrerenderLocalPredictor); | 194 DISALLOW_COPY_AND_ASSIGN(PrerenderLocalPredictor); |
| 172 }; | 195 }; |
| 173 | 196 |
| 174 } // namespace prerender | 197 } // namespace prerender |
| 175 | 198 |
| 176 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ | 199 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ |
| OLD | NEW |