Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: chrome/browser/prerender/prerender_local_predictor.h

Issue 23622012: Integrate the LocalPredictor with the Prerender Service. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
22 namespace base {
23 class DictionaryValue;
24 }
25
20 namespace content { 26 namespace content {
21 class SessionStorageNamespace; 27 class SessionStorageNamespace;
22 class WebContents; 28 class WebContents;
23 } 29 }
24 30
25 namespace gfx { 31 namespace gfx {
26 class Size; 32 class Size;
27 } 33 }
28 34
29 namespace prerender { 35 namespace prerender {
30 36
31 class PrerenderHandle; 37 class PrerenderHandle;
32 class PrerenderManager; 38 class PrerenderManager;
33 39
34 // PrerenderLocalPredictor maintains local browsing history to make prerender 40 // PrerenderLocalPredictor maintains local browsing history to make prerender
35 // predictions. 41 // predictions.
36 // At this point, the class is not actually creating prerenders, but just 42 // At this point, the class is not actually creating prerenders, but just
37 // recording timing stats about the effect prerendering would have. 43 // recording timing stats about the effect prerendering would have.
38 class PrerenderLocalPredictor : public history::VisitDatabaseObserver { 44 class PrerenderLocalPredictor : public history::VisitDatabaseObserver,
45 public net::URLFetcherDelegate {
39 public: 46 public:
40 struct LocalPredictorURLInfo; 47 struct LocalPredictorURLInfo;
41 struct LocalPredictorURLLookupInfo; 48 struct CandidatePrerenderInfo;
42 enum Event { 49 enum Event {
43 EVENT_CONSTRUCTED = 0, 50 EVENT_CONSTRUCTED = 0,
44 EVENT_INIT_SCHEDULED = 1, 51 EVENT_INIT_SCHEDULED = 1,
45 EVENT_INIT_STARTED = 2, 52 EVENT_INIT_STARTED = 2,
46 EVENT_INIT_FAILED_NO_HISTORY = 3, 53 EVENT_INIT_FAILED_NO_HISTORY = 3,
47 EVENT_INIT_SUCCEEDED = 4, 54 EVENT_INIT_SUCCEEDED = 4,
48 EVENT_ADD_VISIT = 5, 55 EVENT_ADD_VISIT = 5,
49 EVENT_ADD_VISIT_INITIALIZED = 6, 56 EVENT_ADD_VISIT_INITIALIZED = 6,
50 EVENT_ADD_VISIT_PRERENDER_IDENTIFIED = 7, 57 EVENT_ADD_VISIT_PRERENDER_IDENTIFIED = 7,
51 EVENT_ADD_VISIT_RELEVANT_TRANSITION = 8, 58 EVENT_ADD_VISIT_RELEVANT_TRANSITION = 8,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 EVENT_TAB_HELPER_URL_SEEN = 46, 96 EVENT_TAB_HELPER_URL_SEEN = 46,
90 EVENT_TAB_HELPER_URL_SEEN_MATCH = 47, 97 EVENT_TAB_HELPER_URL_SEEN_MATCH = 47,
91 EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH = 48, 98 EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH = 48,
92 EVENT_PRERENDER_URL_LOOKUP_MULTIPLE_SOURCE_WEBCONTENTS_FOUND = 49, 99 EVENT_PRERENDER_URL_LOOKUP_MULTIPLE_SOURCE_WEBCONTENTS_FOUND = 49,
93 EVENT_CONTINUE_PRERENDER_CHECK_ON_SIDE_EFFECT_FREE_WHITELIST = 50, 100 EVENT_CONTINUE_PRERENDER_CHECK_ON_SIDE_EFFECT_FREE_WHITELIST = 50,
94 EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL = 51, 101 EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL = 51,
95 EVENT_ISSUE_PRERENDER_ALREADY_PRERENDERING = 52, 102 EVENT_ISSUE_PRERENDER_ALREADY_PRERENDERING = 52,
96 EVENT_ISSUE_PRERENDER_NEW_PRERENDER = 53, 103 EVENT_ISSUE_PRERENDER_NEW_PRERENDER = 53,
97 EVENT_ISSUE_PRERENDER_CANCELLED_OLD_PRERENDER = 54, 104 EVENT_ISSUE_PRERENDER_CANCELLED_OLD_PRERENDER = 54,
98 EVENT_CONTINUE_PRERENDER_CHECK_FALLTHROUGH_PRERENDERING = 55, 105 EVENT_CONTINUE_PRERENDER_CHECK_FALLTHROUGH_PRERENDERING = 55,
106 EVENT_PRERENDER_URL_LOOKUP_SUCCESS = 56,
107 EVENT_PRERENDER_SERVICE_DISABLED = 57,
108 EVENT_PRERENDER_SERVICE_ISSUED_LOOKUP = 58,
109 EVENT_PRERENDER_SERVICE_LOOKUP_TIMED_OUT = 59,
110 EVENT_PRERENDER_SERVICE_RECEIVED_RESULT = 60,
111 EVENT_PRERENDER_SERVICE_NO_RECORD_FOR_RESULT = 61,
112 EVENT_PRERENDER_SERVICE_PARSED_CORRECTLY = 62,
113 EVENT_PRERENDER_SERVICE_PARSE_ERROR = 63,
114 EVENT_PRERENDER_SERVICE_PARSE_ERROR_INCORRECT_JSON = 64,
115 EVENT_PRERENDER_SERVICE_HINTING_TIMED_OUT = 65,
116 EVENT_PRERENDER_SERVICE_HINTING_URL_LOOKUP_TIMED_OUT = 66,
117 EVENT_PRERENDER_SERVICE_CANDIDATE_URL_LOOKUP_TIMED_OUT = 67,
118 EVENT_CONTINUE_PRERENDER_CHECK_ON_SERVICE_WHITELIST = 68,
99 EVENT_MAX_VALUE 119 EVENT_MAX_VALUE
100 }; 120 };
101 121
102 // A PrerenderLocalPredictor is owned by the PrerenderManager specified 122 // A PrerenderLocalPredictor is owned by the PrerenderManager specified
103 // in the constructor. It will be destoryed at the time its owning 123 // in the constructor. It will be destoryed at the time its owning
104 // PrerenderManager is destroyed. 124 // PrerenderManager is destroyed.
105 explicit PrerenderLocalPredictor(PrerenderManager* prerender_manager); 125 explicit PrerenderLocalPredictor(PrerenderManager* prerender_manager);
106 virtual ~PrerenderLocalPredictor(); 126 virtual ~PrerenderLocalPredictor();
107 127
108 void Shutdown(); 128 void Shutdown();
109 129
110 // history::VisitDatabaseObserver implementation 130 // history::VisitDatabaseObserver implementation
111 virtual void OnAddVisit(const history::BriefVisitInfo& info) OVERRIDE; 131 virtual void OnAddVisit(const history::BriefVisitInfo& info) OVERRIDE;
112 132
113 void OnGetInitialVisitHistory( 133 void OnGetInitialVisitHistory(
114 scoped_ptr<std::vector<history::BriefVisitInfo> > visit_history); 134 scoped_ptr<std::vector<history::BriefVisitInfo> > visit_history);
115 135
116 void OnPLTEventForURL(const GURL& url, base::TimeDelta page_load_time); 136 void OnPLTEventForURL(const GURL& url, base::TimeDelta page_load_time);
117 137
118 void OnTabHelperURLSeen(const GURL& url, content::WebContents* web_contents); 138 void OnTabHelperURLSeen(const GURL& url, content::WebContents* web_contents);
119 139
140 // net::URLFetcherDelegate implementation:
141 void virtual OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
142
120 private: 143 private:
121 struct PrerenderProperties; 144 struct PrerenderProperties;
122 HistoryService* GetHistoryIfExists() const; 145 HistoryService* GetHistoryIfExists() const;
123 void Init(); 146 void Init();
124 bool IsPrerenderStillValid(PrerenderProperties* prerender) const; 147 bool IsPrerenderStillValid(PrerenderProperties* prerender) const;
125 bool DoesPrerenderMatchPLTRecord(PrerenderProperties* prerender, 148 bool DoesPrerenderMatchPLTRecord(PrerenderProperties* prerender,
126 const GURL& url, 149 const GURL& url,
127 base::TimeDelta plt) const; 150 base::TimeDelta plt) const;
128 void RecordEvent(Event event) const; 151 void RecordEvent(Event event) const;
129 152
130 void OnLookupURL(scoped_ptr<LocalPredictorURLLookupInfo> info); 153 void OnLookupURL(scoped_ptr<CandidatePrerenderInfo> info);
154
155 // Lookup the prerender candidate in the Prerender Service (if applicable).
156 void DoPrerenderServiceCheck(scoped_ptr<CandidatePrerenderInfo> info);
157
158 // Lookup the prerender candidate in the LoggedIn Predictor.
159 void DoLoggedInLookup(scoped_ptr<CandidatePrerenderInfo> info);
131 160
132 // Returns an element of issued_prerenders_, which should be replaced 161 // Returns an element of issued_prerenders_, which should be replaced
133 // by a new prerender of the priority indicated, or NULL, if the priority 162 // by a new prerender of the priority indicated, or NULL, if the priority
134 // is too low. 163 // is too low.
135 PrerenderProperties* GetIssuedPrerenderSlotForPriority(double priority); 164 PrerenderProperties* GetIssuedPrerenderSlotForPriority(double priority);
136 165
137 void ContinuePrerenderCheck( 166 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; 167 void LogCandidateURLStats(const GURL& url) const;
142 void IssuePrerender(scoped_refptr<content::SessionStorageNamespace> 168 void IssuePrerender(scoped_ptr<CandidatePrerenderInfo> info,
143 session_storage_namespace, 169 scoped_ptr<LocalPredictorURLInfo> url_info,
144 scoped_ptr<gfx::Size> size,
145 scoped_ptr<LocalPredictorURLInfo> info,
146 PrerenderProperties* prerender_properties); 170 PrerenderProperties* prerender_properties);
171 void MaybeCancelURLFetcher(net::URLFetcher* fetcher);
172 // Returns true if the parsed response is semantically correct and could
173 // be fully applied.
174 bool ApplyParsedPrerenderServiceResponse(
175 base::DictionaryValue* dict,
176 CandidatePrerenderInfo* info,
177 bool* hinting_timed_out,
178 bool* hinting_url_lookup_timed_out,
179 bool* candidate_url_lookup_timed_out);
180 typedef std::map<net::URLFetcher*, CandidatePrerenderInfo*>
181 OutstandingFetchers;
182 OutstandingFetchers outstanding_prerender_service_requests_;
147 PrerenderManager* prerender_manager_; 183 PrerenderManager* prerender_manager_;
148 base::OneShotTimer<PrerenderLocalPredictor> timer_; 184 base::OneShotTimer<PrerenderLocalPredictor> timer_;
149 185
150 // Delay after which to initialize, to avoid putting to much load on the 186 // Delay after which to initialize, to avoid putting to much load on the
151 // database thread early on when Chrome is starting up. 187 // database thread early on when Chrome is starting up.
152 static const int kInitDelayMs = 5 * 1000; 188 static const int kInitDelayMs = 5 * 1000;
153 189
154 // Whether we're registered with the history service as a 190 // Whether we're registered with the history service as a
155 // history::VisitDatabaseObserver. 191 // history::VisitDatabaseObserver.
156 bool is_visit_database_observer_; 192 bool is_visit_database_observer_;
(...skipping 10 matching lines...) Expand all
167 base::hash_set<int64> url_whitelist_; 203 base::hash_set<int64> url_whitelist_;
168 204
169 base::WeakPtrFactory<PrerenderLocalPredictor> weak_factory_; 205 base::WeakPtrFactory<PrerenderLocalPredictor> weak_factory_;
170 206
171 DISALLOW_COPY_AND_ASSIGN(PrerenderLocalPredictor); 207 DISALLOW_COPY_AND_ASSIGN(PrerenderLocalPredictor);
172 }; 208 };
173 209
174 } // namespace prerender 210 } // namespace prerender
175 211
176 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ 212 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_field_trial.cc ('k') | chrome/browser/prerender/prerender_local_predictor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698