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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: comments Created 4 years 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 115
116 if (next_load_is_control_prerender_) { 116 if (next_load_is_control_prerender_) {
117 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_); 117 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
118 navigation_type_ = NAVIGATION_TYPE_WOULD_HAVE_BEEN_PRERENDERED; 118 navigation_type_ = NAVIGATION_TYPE_WOULD_HAVE_BEEN_PRERENDERED;
(...skipping 30 matching lines...) Expand all
149 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 149 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
150 if (!prerender_manager) 150 if (!prerender_manager)
151 return false; 151 return false;
152 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); 152 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL);
153 } 153 }
154 154
155 void PrerenderTabHelper::PrerenderSwappedIn() { 155 void PrerenderTabHelper::PrerenderSwappedIn() {
156 // Ensure we are not prerendering any more. 156 // Ensure we are not prerendering any more.
157 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_); 157 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_);
158 DCHECK(!IsPrerendering()); 158 DCHECK(!IsPrerendering());
159 last_swap_ = GetTimeTicksFromPrerenderManager();
159 if (pplt_load_start_.is_null()) { 160 if (pplt_load_start_.is_null()) {
160 // If we have already finished loading, report a 0 PPLT. 161 // If we have already finished loading, report a 0 PPLT.
161 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0); 162 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0);
162 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
163 } else { 163 } else {
164 // If we have not finished loading yet, record the actual load start, and 164 // If we have not finished loading yet, record the actual load start, and
165 // rebase the start time to now. 165 // rebase the start time to now.
166 actual_load_start_ = pplt_load_start_; 166 actual_load_start_ = pplt_load_start_;
167 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 167 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
168 } 168 }
169 } 169 }
170 170
171 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) { 171 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) {
172 next_load_is_control_prerender_ = true; 172 next_load_is_control_prerender_ = true;
173 next_load_origin_ = origin; 173 next_load_origin_ = origin;
174 } 174 }
175 175
176 void PrerenderTabHelper::RecordPerceivedPageLoadTime( 176 void PrerenderTabHelper::RecordPerceivedPageLoadTime(
177 base::TimeDelta perceived_page_load_time, 177 base::TimeDelta perceived_page_load_time,
178 double fraction_plt_elapsed_at_swap_in) { 178 double fraction_plt_elapsed_at_swap_in) {
179 DCHECK(!IsPrerendering()); 179 DCHECK(!IsPrerendering());
180 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 180 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
181 if (!prerender_manager) 181 if (!prerender_manager)
182 return; 182 return;
183 183
184 // Note: it is possible for |next_load_is_control_prerender_| to be true at 184 // 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, 185 // 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 186 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED
187 // navigation interrupts and aborts another navigation.) 187 // navigation interrupts and aborts another navigation.)
188 prerender_manager->RecordPerceivedPageLoadTime( 188 prerender_manager->RecordPerceivedPageLoadTime(
189 origin_, navigation_type_, perceived_page_load_time, 189 origin_, navigation_type_, perceived_page_load_time,
190 fraction_plt_elapsed_at_swap_in, url_); 190 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 } 191 }
196 192
197 } // namespace prerender 193 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698