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

Side by Side Diff: chrome/browser/prerender/prerender_tab_helper.cc

Issue 14065014: Add the LoggedIn Predictor, to detect which websites a user is likely (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 8 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
« no previous file with comments | « chrome/browser/prerender/prerender_tab_helper.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "chrome/browser/prerender/prerender_tab_helper.h" 5 #include "chrome/browser/prerender/prerender_tab_helper.h"
6 6
7 #include "base/metrics/histogram.h" 7 #include "base/metrics/histogram.h"
8 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_number_conversions.h"
9 #include "base/time.h" 9 #include "base/time.h"
10 #include "chrome/browser/predictors/logged_in_predictor_table.h"
10 #include "chrome/browser/prerender/prerender_histograms.h" 11 #include "chrome/browser/prerender/prerender_histograms.h"
11 #include "chrome/browser/prerender/prerender_manager.h" 12 #include "chrome/browser/prerender/prerender_manager.h"
12 #include "chrome/browser/prerender/prerender_manager_factory.h" 13 #include "chrome/browser/prerender/prerender_manager_factory.h"
13 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
15 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/navigation_details.h"
17 #include "content/public/browser/navigation_entry.h"
14 #include "content/public/browser/render_view_host.h" 18 #include "content/public/browser/render_view_host.h"
15 #include "content/public/browser/web_contents.h" 19 #include "content/public/browser/web_contents.h"
16 #include "content/public/browser/web_contents_view.h" 20 #include "content/public/browser/web_contents_view.h"
21 #include "content/public/common/frame_navigate_params.h"
17 #include "skia/ext/platform_canvas.h" 22 #include "skia/ext/platform_canvas.h"
18 #include "third_party/skia/include/core/SkBitmap.h" 23 #include "third_party/skia/include/core/SkBitmap.h"
19 #include "ui/gfx/rect.h" 24 #include "ui/gfx/rect.h"
20 25
21 using content::WebContents; 26 using content::WebContents;
22 27
23 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper); 28 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper);
24 29
25 namespace prerender { 30 namespace prerender {
26 31
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // and the WebContents that it was swapped into. 126 // and the WebContents that it was swapped into.
122 scoped_ptr<SkBitmap> bitmap_; 127 scoped_ptr<SkBitmap> bitmap_;
123 WebContents* bitmap_web_contents_; 128 WebContents* bitmap_web_contents_;
124 129
125 base::WeakPtrFactory<PixelStats> weak_factory_; 130 base::WeakPtrFactory<PixelStats> weak_factory_;
126 131
127 PrerenderTabHelper* tab_helper_; 132 PrerenderTabHelper* tab_helper_;
128 }; 133 };
129 134
130 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents) 135 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents)
131 : content::WebContentsObserver(web_contents) { 136 : content::WebContentsObserver(web_contents),
137 weak_factory_(this) {
132 } 138 }
133 139
134 PrerenderTabHelper::~PrerenderTabHelper() { 140 PrerenderTabHelper::~PrerenderTabHelper() {
135 } 141 }
136 142
137 void PrerenderTabHelper::ProvisionalChangeToMainFrameUrl( 143 void PrerenderTabHelper::ProvisionalChangeToMainFrameUrl(
138 const GURL& url, 144 const GURL& url,
139 content::RenderViewHost* render_view_host) { 145 content::RenderViewHost* render_view_host) {
140 url_ = url; 146 url_ = url;
147 RecordEvent(EVENT_MAINFRAME_CHANGE);
148 RecordEventIfLoggedInURL(EVENT_MAINFRAME_CHANGE_DOMAIN_LOGGED_IN, url);
141 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 149 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
142 if (!prerender_manager) 150 if (!prerender_manager)
143 return; 151 return;
144 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL)) 152 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL))
145 return; 153 return;
146 prerender_manager->MarkWebContentsAsNotPrerendered(web_contents()); 154 prerender_manager->MarkWebContentsAsNotPrerendered(web_contents());
147 } 155 }
148 156
149 void PrerenderTabHelper::DidCommitProvisionalLoadForFrame( 157 void PrerenderTabHelper::DidCommitProvisionalLoadForFrame(
150 int64 frame_id, 158 int64 frame_id,
151 bool is_main_frame, 159 bool is_main_frame,
152 const GURL& validated_url, 160 const GURL& validated_url,
153 content::PageTransition transition_type, 161 content::PageTransition transition_type,
154 content::RenderViewHost* render_view_host) { 162 content::RenderViewHost* render_view_host) {
155 if (!is_main_frame) 163 if (!is_main_frame)
156 return; 164 return;
165 RecordEvent(EVENT_MAINFRAME_COMMIT);
166 RecordEventIfLoggedInURL(EVENT_MAINFRAME_COMMIT_DOMAIN_LOGGED_IN,
167 validated_url);
157 url_ = validated_url; 168 url_ = validated_url;
158 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 169 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
159 if (!prerender_manager) 170 if (!prerender_manager)
160 return; 171 return;
161 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL)) 172 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL))
162 return; 173 return;
163 prerender_manager->RecordNavigation(validated_url); 174 prerender_manager->RecordNavigation(validated_url);
164 } 175 }
165 176
166 void PrerenderTabHelper::DidStopLoading( 177 void PrerenderTabHelper::DidStopLoading(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 bool is_error_page, 214 bool is_error_page,
204 bool is_iframe_srcdoc, 215 bool is_iframe_srcdoc,
205 content::RenderViewHost* render_view_host) { 216 content::RenderViewHost* render_view_host) {
206 if (is_main_frame) { 217 if (is_main_frame) {
207 // Record the beginning of a new PPLT navigation. 218 // Record the beginning of a new PPLT navigation.
208 pplt_load_start_ = base::TimeTicks::Now(); 219 pplt_load_start_ = base::TimeTicks::Now();
209 actual_load_start_ = base::TimeTicks(); 220 actual_load_start_ = base::TimeTicks();
210 } 221 }
211 } 222 }
212 223
224 void PrerenderTabHelper::DidNavigateAnyFrame(
225 const content::LoadCommittedDetails& details,
226 const content::FrameNavigateParams& params) {
227 scoped_refptr<predictors::LoggedInPredictorTable> logged_in_table =
228 MaybeGetLoggedInTable();
229 if (params.password_form.origin.is_valid() && logged_in_table.get()) {
230 content::BrowserThread::PostTask(
231 content::BrowserThread::DB, FROM_HERE,
232 base::Bind(&predictors::LoggedInPredictorTable::Add,
233 logged_in_table,
234 params.url));
235 RecordEvent(EVENT_LOGIN_ACTION_ADDED);
236 }
237 }
238
213 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { 239 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const {
214 return PrerenderManagerFactory::GetForProfile( 240 return PrerenderManagerFactory::GetForProfile(
215 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); 241 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
216 } 242 }
217 243
244 scoped_refptr<predictors::LoggedInPredictorTable>
245 PrerenderTabHelper::MaybeGetLoggedInTable() const {
246 RecordEvent(EVENT_LOGGED_IN_TABLE_REQUESTED);
247 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
248 if (prerender_manager) {
249 predictors::LoggedInPredictorTable* result =
250 prerender_manager->logged_in_predictor_table();
251 if (result)
252 RecordEvent(EVENT_LOGGED_IN_TABLE_PRESENT);
253 return result;
254 }
255 return NULL;
256 }
257
218 bool PrerenderTabHelper::IsPrerendering() { 258 bool PrerenderTabHelper::IsPrerendering() {
219 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 259 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
220 if (!prerender_manager) 260 if (!prerender_manager)
221 return false; 261 return false;
222 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); 262 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL);
223 } 263 }
224 264
225 bool PrerenderTabHelper::IsPrerendered() { 265 bool PrerenderTabHelper::IsPrerendered() {
226 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 266 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
227 if (!prerender_manager) 267 if (!prerender_manager)
(...skipping 14 matching lines...) Expand all
242 } else { 282 } else {
243 // If we have not finished loading yet, record the actual load start, and 283 // If we have not finished loading yet, record the actual load start, and
244 // rebase the start time to now. 284 // rebase the start time to now.
245 actual_load_start_ = pplt_load_start_; 285 actual_load_start_ = pplt_load_start_;
246 pplt_load_start_ = base::TimeTicks::Now(); 286 pplt_load_start_ = base::TimeTicks::Now();
247 if (pixel_stats_.get()) 287 if (pixel_stats_.get())
248 pixel_stats_->GetBitmap(PixelStats::BITMAP_SWAP_IN, web_contents()); 288 pixel_stats_->GetBitmap(PixelStats::BITMAP_SWAP_IN, web_contents());
249 } 289 }
250 } 290 }
251 291
292 void PrerenderTabHelper::RecordEvent(PrerenderTabHelper::Event event) const {
293 UMA_HISTOGRAM_ENUMERATION("Prerender.TabHelperEvent",
294 event, PrerenderTabHelper::EVENT_MAX_VALUE);
295 }
296
297 void PrerenderTabHelper::RecordEventIfLoggedInURL(
298 PrerenderTabHelper::Event event, const GURL& url) {
299 scoped_refptr<predictors::LoggedInPredictorTable> logged_in_table =
300 MaybeGetLoggedInTable();
301 if (!logged_in_table.get())
302 return;
303 scoped_ptr<bool> is_present(new bool);
304 scoped_ptr<bool> lookup_succeeded(new bool);
305 bool* is_present_ptr = is_present.get();
306 bool* lookup_succeeded_ptr = lookup_succeeded.get();
307 content::BrowserThread::PostTaskAndReply(
308 content::BrowserThread::DB, FROM_HERE,
309 base::Bind(&predictors::LoggedInPredictorTable::HasUserLoggedIn,
310 logged_in_table,
311 url,
312 is_present_ptr,
313 lookup_succeeded_ptr),
314 base::Bind(&PrerenderTabHelper::RecordEventIfLoggedInURLResult,
315 weak_factory_.GetWeakPtr(),
316 event,
317 base::Passed(&is_present),
318 base::Passed(&lookup_succeeded)));
319 }
320
321 void PrerenderTabHelper::RecordEventIfLoggedInURLResult(
322 PrerenderTabHelper::Event event,
323 scoped_ptr<bool> is_present,
324 scoped_ptr<bool> lookup_succeeded) {
325 if (*lookup_succeeded && *is_present)
326 RecordEvent(event);
327 }
328
252 } // namespace prerender 329 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_tab_helper.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698