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

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

Issue 13903018: 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
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 predictors::LoggedInPredictorTable* logged_in_table = MaybeGetLoggedInTable();
228 if (params.password_form.origin.is_valid() && logged_in_table) {
229 content::BrowserThread::PostTask(
230 content::BrowserThread::DB, FROM_HERE,
231 base::Bind(&predictors::LoggedInPredictorTable::Add,
232 logged_in_table,
233 params.url));
234 RecordEvent(EVENT_LOGIN_ACTION_ADDED);
235 }
236 }
237
213 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { 238 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const {
214 return PrerenderManagerFactory::GetForProfile( 239 return PrerenderManagerFactory::GetForProfile(
215 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); 240 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
216 } 241 }
217 242
243 predictors::LoggedInPredictorTable* PrerenderTabHelper::
244 MaybeGetLoggedInTable() const {
Shishir 2013/04/16 21:22:04 Breakup after the return param
tburkard 2013/04/16 21:47:19 Done.
245 RecordEvent(EVENT_LOGGED_IN_TABLE_REQUESTED);
246 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
247 if (prerender_manager) {
248 predictors::LoggedInPredictorTable* result =
249 prerender_manager->logged_in_predictor_table();
250 if (result)
251 RecordEvent(EVENT_LOGGED_IN_TABLE_PRESENT);
252 return result;
253 }
254 return NULL;
255 }
256
218 bool PrerenderTabHelper::IsPrerendering() { 257 bool PrerenderTabHelper::IsPrerendering() {
219 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 258 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
220 if (!prerender_manager) 259 if (!prerender_manager)
221 return false; 260 return false;
222 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); 261 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL);
223 } 262 }
224 263
225 bool PrerenderTabHelper::IsPrerendered() { 264 bool PrerenderTabHelper::IsPrerendered() {
226 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 265 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
227 if (!prerender_manager) 266 if (!prerender_manager)
(...skipping 14 matching lines...) Expand all
242 } else { 281 } else {
243 // If we have not finished loading yet, record the actual load start, and 282 // If we have not finished loading yet, record the actual load start, and
244 // rebase the start time to now. 283 // rebase the start time to now.
245 actual_load_start_ = pplt_load_start_; 284 actual_load_start_ = pplt_load_start_;
246 pplt_load_start_ = base::TimeTicks::Now(); 285 pplt_load_start_ = base::TimeTicks::Now();
247 if (pixel_stats_.get()) 286 if (pixel_stats_.get())
248 pixel_stats_->GetBitmap(PixelStats::BITMAP_SWAP_IN, web_contents()); 287 pixel_stats_->GetBitmap(PixelStats::BITMAP_SWAP_IN, web_contents());
249 } 288 }
250 } 289 }
251 290
291 void PrerenderTabHelper::RecordEvent(PrerenderTabHelper::Event event) const {
292 UMA_HISTOGRAM_ENUMERATION("Prerender.TabHelperEvent",
293 event, PrerenderTabHelper::EVENT_MAX_VALUE);
294 }
295
296 void PrerenderTabHelper::RecordEventIfLoggedInURL(
297 PrerenderTabHelper::Event event, const GURL& url) {
298 predictors::LoggedInPredictorTable* logged_in_table = MaybeGetLoggedInTable();
299 if (!logged_in_table)
300 return;
301 scoped_ptr<bool> is_present(new bool);
302 scoped_ptr<bool> lookup_succeeded(new bool);
303 bool* is_present_ptr = is_present.get();
304 bool* lookup_succeeded_ptr = lookup_succeeded.get();
305 content::BrowserThread::PostTaskAndReply(
306 content::BrowserThread::DB, FROM_HERE,
307 base::Bind(&predictors::LoggedInPredictorTable::Exists,
308 logged_in_table,
309 url,
310 is_present_ptr,
311 lookup_succeeded_ptr),
312 base::Bind(&PrerenderTabHelper::RecordEventIfLoggedInURLResult,
313 weak_factory_.GetWeakPtr(),
314 event,
315 base::Passed(&is_present),
316 base::Passed(&lookup_succeeded)));
317 }
318
319 void PrerenderTabHelper::RecordEventIfLoggedInURLResult(
320 PrerenderTabHelper::Event event,
321 scoped_ptr<bool> is_present,
322 scoped_ptr<bool> lookup_succeeded) {
323 if (*lookup_succeeded && *is_present)
324 RecordEvent(event);
325 }
326
252 } // namespace prerender 327 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698