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

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: rebase 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"
11 #include "chrome/browser/prerender/prerender_histograms.h" 10 #include "chrome/browser/prerender/prerender_histograms.h"
12 #include "chrome/browser/prerender/prerender_local_predictor.h"
13 #include "chrome/browser/prerender/prerender_manager.h" 11 #include "chrome/browser/prerender/prerender_manager.h"
14 #include "chrome/browser/prerender/prerender_manager_factory.h" 12 #include "chrome/browser/prerender/prerender_manager_factory.h"
15 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
16 #include "components/password_manager/core/browser/password_manager.h"
17 #include "content/public/browser/navigation_details.h"
18 #include "content/public/browser/navigation_entry.h"
19 #include "content/public/browser/render_frame_host.h" 14 #include "content/public/browser/render_frame_host.h"
20 #include "content/public/browser/resource_request_details.h" 15 #include "content/public/browser/resource_request_details.h"
21 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
22 #include "content/public/common/frame_navigate_params.h"
23 17
24 using content::WebContents; 18 using content::WebContents;
25 19
26 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper); 20 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper);
27 21
28 namespace prerender { 22 namespace prerender {
29 23
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) 24 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents)
48 : content::WebContentsObserver(web_contents), 25 : content::WebContentsObserver(web_contents),
49 origin_(ORIGIN_NONE), 26 origin_(ORIGIN_NONE),
50 next_load_is_control_prerender_(false), 27 next_load_is_control_prerender_(false),
51 next_load_origin_(ORIGIN_NONE), 28 next_load_origin_(ORIGIN_NONE),
52 weak_factory_(this) { 29 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. 30 // Determine if this is a prerender.
62 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 31 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
63 if (prerender_manager && 32 if (prerender_manager &&
64 prerender_manager->IsWebContentsPrerendering(web_contents, &origin_)) { 33 prerender_manager->IsWebContentsPrerendering(web_contents, &origin_)) {
65 navigation_type_ = NAVIGATION_TYPE_PRERENDERED; 34 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
66 } else { 35 } else {
67 navigation_type_ = NAVIGATION_TYPE_NORMAL; 36 navigation_type_ = NAVIGATION_TYPE_NORMAL;
68 } 37 }
69 } 38 }
70 39
71 PrerenderTabHelper::~PrerenderTabHelper() { 40 PrerenderTabHelper::~PrerenderTabHelper() {
72 } 41 }
73 42
74 void PrerenderTabHelper::DidGetRedirectForResourceRequest( 43 void PrerenderTabHelper::DidGetRedirectForResourceRequest(
75 content::RenderFrameHost* render_frame_host, 44 content::RenderFrameHost* render_frame_host,
76 const content::ResourceRedirectDetails& details) { 45 const content::ResourceRedirectDetails& details) {
77 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME) 46 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME)
78 return; 47 return;
79 48
80 MainFrameUrlDidChange(details.new_url); 49 MainFrameUrlDidChange(details.new_url);
81 } 50 }
82 51
83 void PrerenderTabHelper::DidCommitProvisionalLoadForFrame( 52 void PrerenderTabHelper::DidCommitProvisionalLoadForFrame(
84 content::RenderFrameHost* render_frame_host, 53 content::RenderFrameHost* render_frame_host,
85 const GURL& validated_url, 54 const GURL& validated_url,
86 ui::PageTransition transition_type) { 55 ui::PageTransition transition_type) {
87 if (render_frame_host->GetParent()) 56 if (render_frame_host->GetParent())
88 return; 57 return;
89 RecordEvent(EVENT_MAINFRAME_COMMIT);
90 RecordEventIfLoggedInURL(EVENT_MAINFRAME_COMMIT_DOMAIN_LOGGED_IN,
91 validated_url);
92 url_ = validated_url; 58 url_ = validated_url;
93 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 59 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
94 if (!prerender_manager) 60 if (!prerender_manager)
95 return; 61 return;
96 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL)) 62 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL))
97 return; 63 return;
98 prerender_manager->RecordNavigation(validated_url); 64 prerender_manager->RecordNavigation(validated_url);
99 ReportTabHelperURLSeenToLocalPredictor(prerender_manager, validated_url,
100 web_contents());
101 } 65 }
102 66
103 void PrerenderTabHelper::DidStopLoading() { 67 void PrerenderTabHelper::DidStopLoading() {
104 // Compute the PPLT metric and report it in a histogram, if needed. If the 68 // 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 69 // page is still prerendering, record the not swapped in page load time
106 // instead. 70 // instead.
107 if (!pplt_load_start_.is_null()) { 71 if (!pplt_load_start_.is_null()) {
108 base::TimeTicks now = base::TimeTicks::Now(); 72 base::TimeTicks now = base::TimeTicks::Now();
109 if (IsPrerendering()) { 73 if (IsPrerendering()) {
110 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 74 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 origin_ = next_load_origin_; 120 origin_ = next_load_origin_;
157 next_load_is_control_prerender_ = false; 121 next_load_is_control_prerender_ = false;
158 next_load_origin_ = ORIGIN_NONE; 122 next_load_origin_ = ORIGIN_NONE;
159 } 123 }
160 124
161 MainFrameUrlDidChange(validated_url); 125 MainFrameUrlDidChange(validated_url);
162 } 126 }
163 127
164 void PrerenderTabHelper::MainFrameUrlDidChange(const GURL& url) { 128 void PrerenderTabHelper::MainFrameUrlDidChange(const GURL& url) {
165 url_ = url; 129 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 } 130 }
186 131
187 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { 132 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const {
188 return PrerenderManagerFactory::GetForProfile( 133 return PrerenderManagerFactory::GetForProfile(
189 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); 134 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
190 } 135 }
191 136
192 bool PrerenderTabHelper::IsPrerendering() { 137 bool PrerenderTabHelper::IsPrerendering() {
193 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 138 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
194 if (!prerender_manager) 139 if (!prerender_manager)
(...skipping 15 matching lines...) Expand all
210 actual_load_start_ = pplt_load_start_; 155 actual_load_start_ = pplt_load_start_;
211 pplt_load_start_ = base::TimeTicks::Now(); 156 pplt_load_start_ = base::TimeTicks::Now();
212 } 157 }
213 } 158 }
214 159
215 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) { 160 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) {
216 next_load_is_control_prerender_ = true; 161 next_load_is_control_prerender_ = true;
217 next_load_origin_ = origin; 162 next_load_origin_ = origin;
218 } 163 }
219 164
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( 165 void PrerenderTabHelper::RecordPerceivedPageLoadTime(
254 base::TimeDelta perceived_page_load_time, 166 base::TimeDelta perceived_page_load_time,
255 double fraction_plt_elapsed_at_swap_in) { 167 double fraction_plt_elapsed_at_swap_in) {
256 DCHECK(!IsPrerendering()); 168 DCHECK(!IsPrerendering());
257 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 169 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
258 if (!prerender_manager) 170 if (!prerender_manager)
259 return; 171 return;
260 172
261 // Note: it is possible for |next_load_is_control_prerender_| to be true at 173 // 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, 174 // 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 175 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED
264 // navigation interrupts and aborts another navigation.) 176 // navigation interrupts and aborts another navigation.)
265 prerender_manager->RecordPerceivedPageLoadTime( 177 prerender_manager->RecordPerceivedPageLoadTime(
266 origin_, navigation_type_, perceived_page_load_time, 178 origin_, navigation_type_, perceived_page_load_time,
267 fraction_plt_elapsed_at_swap_in, url_); 179 fraction_plt_elapsed_at_swap_in, url_);
268 180
269 // Reset state for the next navigation. 181 // Reset state for the next navigation.
270 navigation_type_ = NAVIGATION_TYPE_NORMAL; 182 navigation_type_ = NAVIGATION_TYPE_NORMAL;
271 origin_ = ORIGIN_NONE; 183 origin_ = ORIGIN_NONE;
272 } 184 }
273 185
274 } // namespace prerender 186 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_tab_helper.h ('k') | chrome/browser/prerender/prerender_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698