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

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

Issue 1077433002: Remove PrerenderLocalPredictor, part 1. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
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/bind.h" 7 #include "base/bind.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "chrome/browser/password_manager/chrome_password_manager_client.h" 10 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
mmenke 2015/04/09 16:29:05 No longer needed.
davidben 2015/04/09 20:43:00 Done.
11 #include "chrome/browser/prerender/prerender_histograms.h" 11 #include "chrome/browser/prerender/prerender_histograms.h"
12 #include "chrome/browser/prerender/prerender_local_predictor.h"
13 #include "chrome/browser/prerender/prerender_manager.h" 12 #include "chrome/browser/prerender/prerender_manager.h"
14 #include "chrome/browser/prerender/prerender_manager_factory.h" 13 #include "chrome/browser/prerender/prerender_manager_factory.h"
15 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
16 #include "components/password_manager/core/browser/password_manager.h" 15 #include "components/password_manager/core/browser/password_manager.h"
mmenke 2015/04/09 16:29:05 No longer needed.
davidben 2015/04/09 20:43:00 Done.
17 #include "content/public/browser/navigation_details.h" 16 #include "content/public/browser/navigation_details.h"
18 #include "content/public/browser/navigation_entry.h" 17 #include "content/public/browser/navigation_entry.h"
19 #include "content/public/browser/render_frame_host.h" 18 #include "content/public/browser/render_frame_host.h"
20 #include "content/public/browser/resource_request_details.h" 19 #include "content/public/browser/resource_request_details.h"
21 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
22 #include "content/public/common/frame_navigate_params.h" 21 #include "content/public/common/frame_navigate_params.h"
23 22
24 using content::WebContents; 23 using content::WebContents;
25 24
26 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper); 25 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper);
27 26
28 namespace prerender { 27 namespace prerender {
29 28
30 namespace {
31
32 void ReportTabHelperURLSeenToLocalPredictor(
33 PrerenderManager* prerender_manager,
34 const GURL& url,
35 WebContents* web_contents) {
36 if (!prerender_manager)
37 return;
38 PrerenderLocalPredictor* local_predictor =
39 prerender_manager->local_predictor();
40 if (!local_predictor)
41 return;
42 local_predictor->OnTabHelperURLSeen(url, web_contents);
43 }
44
45 } // namespace
46
47 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents) 29 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents)
48 : content::WebContentsObserver(web_contents), 30 : content::WebContentsObserver(web_contents),
49 origin_(ORIGIN_NONE), 31 origin_(ORIGIN_NONE),
50 next_load_is_control_prerender_(false), 32 next_load_is_control_prerender_(false),
51 next_load_origin_(ORIGIN_NONE), 33 next_load_origin_(ORIGIN_NONE),
52 weak_factory_(this) { 34 weak_factory_(this) {
53 ChromePasswordManagerClient* client =
54 ChromePasswordManagerClient::FromWebContents(web_contents);
55 // May be NULL during testing.
56 if (client) {
57 client->GetPasswordManager()->AddSubmissionCallback(base::Bind(
58 &PrerenderTabHelper::PasswordSubmitted, weak_factory_.GetWeakPtr()));
59 }
60
61 // Determine if this is a prerender. 35 // Determine if this is a prerender.
62 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 36 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
63 if (prerender_manager && 37 if (prerender_manager &&
64 prerender_manager->IsWebContentsPrerendering(web_contents, &origin_)) { 38 prerender_manager->IsWebContentsPrerendering(web_contents, &origin_)) {
65 navigation_type_ = NAVIGATION_TYPE_PRERENDERED; 39 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
66 } else { 40 } else {
67 navigation_type_ = NAVIGATION_TYPE_NORMAL; 41 navigation_type_ = NAVIGATION_TYPE_NORMAL;
68 } 42 }
69 } 43 }
70 44
71 PrerenderTabHelper::~PrerenderTabHelper() { 45 PrerenderTabHelper::~PrerenderTabHelper() {
72 } 46 }
73 47
74 void PrerenderTabHelper::DidGetRedirectForResourceRequest( 48 void PrerenderTabHelper::DidGetRedirectForResourceRequest(
75 content::RenderFrameHost* render_frame_host, 49 content::RenderFrameHost* render_frame_host,
76 const content::ResourceRedirectDetails& details) { 50 const content::ResourceRedirectDetails& details) {
77 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME) 51 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME)
78 return; 52 return;
79 53
80 MainFrameUrlDidChange(details.new_url); 54 MainFrameUrlDidChange(details.new_url);
81 } 55 }
82 56
83 void PrerenderTabHelper::DidCommitProvisionalLoadForFrame( 57 void PrerenderTabHelper::DidCommitProvisionalLoadForFrame(
84 content::RenderFrameHost* render_frame_host, 58 content::RenderFrameHost* render_frame_host,
85 const GURL& validated_url, 59 const GURL& validated_url,
86 ui::PageTransition transition_type) { 60 ui::PageTransition transition_type) {
87 if (render_frame_host->GetParent()) 61 if (render_frame_host->GetParent())
88 return; 62 return;
89 RecordEvent(EVENT_MAINFRAME_COMMIT);
90 RecordEventIfLoggedInURL(EVENT_MAINFRAME_COMMIT_DOMAIN_LOGGED_IN,
91 validated_url);
92 url_ = validated_url; 63 url_ = validated_url;
93 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 64 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
94 if (!prerender_manager) 65 if (!prerender_manager)
95 return; 66 return;
96 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL)) 67 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL))
97 return; 68 return;
98 prerender_manager->RecordNavigation(validated_url); 69 prerender_manager->RecordNavigation(validated_url);
99 ReportTabHelperURLSeenToLocalPredictor(prerender_manager, validated_url,
100 web_contents());
101 } 70 }
102 71
103 void PrerenderTabHelper::DidStopLoading() { 72 void PrerenderTabHelper::DidStopLoading() {
104 // Compute the PPLT metric and report it in a histogram, if needed. If the 73 // Compute the PPLT metric and report it in a histogram, if needed. If the
105 // page is still prerendering, record the not swapped in page load time 74 // page is still prerendering, record the not swapped in page load time
106 // instead. 75 // instead.
107 if (!pplt_load_start_.is_null()) { 76 if (!pplt_load_start_.is_null()) {
108 base::TimeTicks now = base::TimeTicks::Now(); 77 base::TimeTicks now = base::TimeTicks::Now();
109 if (IsPrerendering()) { 78 if (IsPrerendering()) {
110 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 79 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 origin_ = next_load_origin_; 125 origin_ = next_load_origin_;
157 next_load_is_control_prerender_ = false; 126 next_load_is_control_prerender_ = false;
158 next_load_origin_ = ORIGIN_NONE; 127 next_load_origin_ = ORIGIN_NONE;
159 } 128 }
160 129
161 MainFrameUrlDidChange(validated_url); 130 MainFrameUrlDidChange(validated_url);
162 } 131 }
163 132
164 void PrerenderTabHelper::MainFrameUrlDidChange(const GURL& url) { 133 void PrerenderTabHelper::MainFrameUrlDidChange(const GURL& url) {
165 url_ = url; 134 url_ = url;
166 RecordEvent(EVENT_MAINFRAME_CHANGE);
167 RecordEventIfLoggedInURL(EVENT_MAINFRAME_CHANGE_DOMAIN_LOGGED_IN, url);
168 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
169 if (!prerender_manager)
170 return;
171 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL))
172 return;
173 ReportTabHelperURLSeenToLocalPredictor(prerender_manager, url,
174 web_contents());
175 }
176
177 void PrerenderTabHelper::PasswordSubmitted(const autofill::PasswordForm& form) {
178 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
179 if (prerender_manager) {
180 prerender_manager->RecordLikelyLoginOnURL(form.origin);
181 RecordEvent(EVENT_LOGIN_ACTION_ADDED);
182 if (form.password_value.empty())
183 RecordEvent(EVENT_LOGIN_ACTION_ADDED_PW_EMPTY);
184 }
185 } 135 }
186 136
187 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { 137 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const {
188 return PrerenderManagerFactory::GetForProfile( 138 return PrerenderManagerFactory::GetForProfile(
189 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); 139 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
190 } 140 }
191 141
192 bool PrerenderTabHelper::IsPrerendering() { 142 bool PrerenderTabHelper::IsPrerendering() {
193 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 143 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
194 if (!prerender_manager) 144 if (!prerender_manager)
(...skipping 15 matching lines...) Expand all
210 actual_load_start_ = pplt_load_start_; 160 actual_load_start_ = pplt_load_start_;
211 pplt_load_start_ = base::TimeTicks::Now(); 161 pplt_load_start_ = base::TimeTicks::Now();
212 } 162 }
213 } 163 }
214 164
215 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) { 165 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) {
216 next_load_is_control_prerender_ = true; 166 next_load_is_control_prerender_ = true;
217 next_load_origin_ = origin; 167 next_load_origin_ = origin;
218 } 168 }
219 169
220 void PrerenderTabHelper::RecordEvent(PrerenderTabHelper::Event event) const {
221 UMA_HISTOGRAM_ENUMERATION("Prerender.TabHelperEvent",
222 event, PrerenderTabHelper::EVENT_MAX_VALUE);
223 }
224
225 void PrerenderTabHelper::RecordEventIfLoggedInURL(
226 PrerenderTabHelper::Event event, const GURL& url) {
227 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
228 if (!prerender_manager)
229 return;
230 scoped_ptr<bool> is_present(new bool);
231 scoped_ptr<bool> lookup_succeeded(new bool);
232 bool* is_present_ptr = is_present.get();
233 bool* lookup_succeeded_ptr = lookup_succeeded.get();
234 prerender_manager->CheckIfLikelyLoggedInOnURL(
235 url,
236 is_present_ptr,
237 lookup_succeeded_ptr,
238 base::Bind(&PrerenderTabHelper::RecordEventIfLoggedInURLResult,
239 weak_factory_.GetWeakPtr(),
240 event,
241 base::Passed(&is_present),
242 base::Passed(&lookup_succeeded)));
243 }
244
245 void PrerenderTabHelper::RecordEventIfLoggedInURLResult(
246 PrerenderTabHelper::Event event,
247 scoped_ptr<bool> is_present,
248 scoped_ptr<bool> lookup_succeeded) {
249 if (*lookup_succeeded && *is_present)
250 RecordEvent(event);
251 }
252
253 void PrerenderTabHelper::RecordPerceivedPageLoadTime( 170 void PrerenderTabHelper::RecordPerceivedPageLoadTime(
254 base::TimeDelta perceived_page_load_time, 171 base::TimeDelta perceived_page_load_time,
255 double fraction_plt_elapsed_at_swap_in) { 172 double fraction_plt_elapsed_at_swap_in) {
256 DCHECK(!IsPrerendering()); 173 DCHECK(!IsPrerendering());
257 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 174 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
258 if (!prerender_manager) 175 if (!prerender_manager)
259 return; 176 return;
260 177
261 // Note: it is possible for |next_load_is_control_prerender_| to be true at 178 // Note: it is possible for |next_load_is_control_prerender_| to be true at
262 // this point. This does not affect the classification of the current load, 179 // this point. This does not affect the classification of the current load,
263 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED 180 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED
264 // navigation interrupts and aborts another navigation.) 181 // navigation interrupts and aborts another navigation.)
265 prerender_manager->RecordPerceivedPageLoadTime( 182 prerender_manager->RecordPerceivedPageLoadTime(
266 origin_, navigation_type_, perceived_page_load_time, 183 origin_, navigation_type_, perceived_page_load_time,
267 fraction_plt_elapsed_at_swap_in, url_); 184 fraction_plt_elapsed_at_swap_in, url_);
268 185
269 // Reset state for the next navigation. 186 // Reset state for the next navigation.
270 navigation_type_ = NAVIGATION_TYPE_NORMAL; 187 navigation_type_ = NAVIGATION_TYPE_NORMAL;
271 origin_ = ORIGIN_NONE; 188 origin_ = ORIGIN_NONE;
272 } 189 }
273 190
274 } // namespace prerender 191 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698