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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: cleanup Created 4 years, 1 month 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_macros.h" 8 #include "base/metrics/histogram_macros.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "chrome/browser/prerender/prerender_histograms.h" 10 #include "chrome/browser/prerender/prerender_histograms.h"
11 #include "chrome/browser/prerender/prerender_manager.h" 11 #include "chrome/browser/prerender/prerender_manager.h"
12 #include "chrome/browser/prerender/prerender_manager_factory.h" 12 #include "chrome/browser/prerender/prerender_manager_factory.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "content/public/browser/render_frame_host.h" 14 #include "content/public/browser/render_frame_host.h"
15 #include "content/public/browser/resource_request_details.h" 15 #include "content/public/browser/resource_request_details.h"
16 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
17 17
18 using content::WebContents; 18 using content::WebContents;
19 19
20 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper); 20 DEFINE_WEB_CONTENTS_USER_DATA_KEY(prerender::PrerenderTabHelper);
21 21
22 namespace prerender { 22 namespace prerender {
23 23
24 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents) 24 PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents)
25 : content::WebContentsObserver(web_contents), 25 : content::WebContentsObserver(web_contents),
26 origin_(ORIGIN_NONE), 26 origin_(ORIGIN_NONE),
27 next_load_is_control_prerender_(false), 27 next_load_is_control_prerender_(false),
28 next_load_origin_(ORIGIN_NONE), 28 next_load_origin_(ORIGIN_NONE),
29 weak_factory_(this) { 29 weak_factory_(this) {}
30 // Determine if this is a prerender.
31 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
32 if (prerender_manager &&
33 prerender_manager->IsWebContentsPrerendering(web_contents, &origin_)) {
34 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
35 } else {
36 navigation_type_ = NAVIGATION_TYPE_NORMAL;
37 }
38 }
39 30
40 PrerenderTabHelper::~PrerenderTabHelper() { 31 PrerenderTabHelper::~PrerenderTabHelper() {
41 } 32 }
42 33
43 void PrerenderTabHelper::DidGetRedirectForResourceRequest( 34 void PrerenderTabHelper::DidGetRedirectForResourceRequest(
44 const content::ResourceRedirectDetails& details) { 35 const content::ResourceRedirectDetails& details) {
45 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME) 36 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME)
46 return; 37 return;
47 38
48 MainFrameUrlDidChange(details.new_url); 39 MainFrameUrlDidChange(details.new_url);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 // Reset the PPLT metric. 90 // Reset the PPLT metric.
100 pplt_load_start_ = base::TimeTicks(); 91 pplt_load_start_ = base::TimeTicks();
101 actual_load_start_ = base::TimeTicks(); 92 actual_load_start_ = base::TimeTicks();
102 } 93 }
103 94
104 void PrerenderTabHelper::DidStartProvisionalLoadForFrame( 95 void PrerenderTabHelper::DidStartProvisionalLoadForFrame(
105 content::RenderFrameHost* render_frame_host, 96 content::RenderFrameHost* render_frame_host,
106 const GURL& validated_url, 97 const GURL& validated_url,
107 bool is_error_page, 98 bool is_error_page,
108 bool is_iframe_srcdoc) { 99 bool is_iframe_srcdoc) {
100 // Determine the navigation type.
101 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
102 if (prerender_manager &&
103 prerender_manager->IsWebContentsPrerendering(web_contents(), &origin_)) {
104 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
105 } else {
106 navigation_type_ = NAVIGATION_TYPE_NORMAL;
107 }
108
109 if (render_frame_host->GetParent()) 109 if (render_frame_host->GetParent())
110 return; 110 return;
111 111
112 // Record PPLT state for the beginning of a new navigation. 112 // Record PPLT state for the beginning of a new navigation.
113 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 113 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
114 actual_load_start_ = base::TimeTicks(); 114 actual_load_start_ = base::TimeTicks();
115 last_load_ = GetTimeTicksFromPrerenderManager();
115 116
116 if (next_load_is_control_prerender_) { 117 if (next_load_is_control_prerender_) {
117 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_); 118 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
118 navigation_type_ = NAVIGATION_TYPE_WOULD_HAVE_BEEN_PRERENDERED; 119 navigation_type_ = NAVIGATION_TYPE_WOULD_HAVE_BEEN_PRERENDERED;
119 origin_ = next_load_origin_; 120 origin_ = next_load_origin_;
120 next_load_is_control_prerender_ = false; 121 next_load_is_control_prerender_ = false;
121 next_load_origin_ = ORIGIN_NONE; 122 next_load_origin_ = ORIGIN_NONE;
122 } 123 }
123 124
124 MainFrameUrlDidChange(validated_url); 125 MainFrameUrlDidChange(validated_url);
(...skipping 24 matching lines...) Expand all
149 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 150 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
150 if (!prerender_manager) 151 if (!prerender_manager)
151 return false; 152 return false;
152 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); 153 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL);
153 } 154 }
154 155
155 void PrerenderTabHelper::PrerenderSwappedIn() { 156 void PrerenderTabHelper::PrerenderSwappedIn() {
156 // Ensure we are not prerendering any more. 157 // Ensure we are not prerendering any more.
157 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_); 158 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_);
158 DCHECK(!IsPrerendering()); 159 DCHECK(!IsPrerendering());
160 last_swap_ = GetTimeTicksFromPrerenderManager();
159 if (pplt_load_start_.is_null()) { 161 if (pplt_load_start_.is_null()) {
160 // If we have already finished loading, report a 0 PPLT. 162 // If we have already finished loading, report a 0 PPLT.
161 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0); 163 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0);
162 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
163 } else { 164 } else {
164 // If we have not finished loading yet, record the actual load start, and 165 // If we have not finished loading yet, record the actual load start, and
165 // rebase the start time to now. 166 // rebase the start time to now.
166 actual_load_start_ = pplt_load_start_; 167 actual_load_start_ = pplt_load_start_;
167 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 168 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
168 } 169 }
169 } 170 }
170 171
171 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) { 172 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) {
172 next_load_is_control_prerender_ = true; 173 next_load_is_control_prerender_ = true;
173 next_load_origin_ = origin; 174 next_load_origin_ = origin;
174 } 175 }
175 176
177 bool PrerenderTabHelper::LoadToPerceivedDelta(base::TimeDelta* delta) {
178 if (!last_load_.is_null() && !last_swap_.is_null() &&
179 last_swap_ >= last_load_) {
180 if (delta) {
181 *delta = last_swap_ - last_load_;
182 }
183 return true;
184 }
185 return false;
186 }
187
176 void PrerenderTabHelper::RecordPerceivedPageLoadTime( 188 void PrerenderTabHelper::RecordPerceivedPageLoadTime(
177 base::TimeDelta perceived_page_load_time, 189 base::TimeDelta perceived_page_load_time,
178 double fraction_plt_elapsed_at_swap_in) { 190 double fraction_plt_elapsed_at_swap_in) {
179 DCHECK(!IsPrerendering()); 191 DCHECK(!IsPrerendering());
180 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 192 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
181 if (!prerender_manager) 193 if (!prerender_manager)
182 return; 194 return;
183 195
184 // Note: it is possible for |next_load_is_control_prerender_| to be true at 196 // Note: it is possible for |next_load_is_control_prerender_| to be true at
185 // this point. This does not affect the classification of the current load, 197 // this point. This does not affect the classification of the current load,
186 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED 198 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED
187 // navigation interrupts and aborts another navigation.) 199 // navigation interrupts and aborts another navigation.)
188 prerender_manager->RecordPerceivedPageLoadTime( 200 prerender_manager->RecordPerceivedPageLoadTime(
189 origin_, navigation_type_, perceived_page_load_time, 201 origin_, navigation_type_, perceived_page_load_time,
190 fraction_plt_elapsed_at_swap_in, url_); 202 fraction_plt_elapsed_at_swap_in, url_);
191
192 // Reset state for the next navigation.
193 navigation_type_ = NAVIGATION_TYPE_NORMAL;
194 origin_ = ORIGIN_NONE;
195 } 203 }
196 204
197 } // namespace prerender 205 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698