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

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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 89
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) {
99 // Determine the navigation type.
100 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
101 if (prerender_manager &&
102 prerender_manager->IsWebContentsPrerendering(web_contents(), &origin_)) {
103 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
104 } else {
105 navigation_type_ = NAVIGATION_TYPE_NORMAL;
106 }
107
108 if (render_frame_host->GetParent()) 108 if (render_frame_host->GetParent())
109 return; 109 return;
110 110
111 // Record PPLT state for the beginning of a new navigation. 111 // Record PPLT state for the beginning of a new navigation.
112 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 112 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
113 actual_load_start_ = base::TimeTicks(); 113 actual_load_start_ = base::TimeTicks();
114 114
115 if (next_load_is_control_prerender_) { 115 if (next_load_is_control_prerender_) {
116 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_); 116 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
117 navigation_type_ = NAVIGATION_TYPE_WOULD_HAVE_BEEN_PRERENDERED; 117 navigation_type_ = NAVIGATION_TYPE_WOULD_HAVE_BEEN_PRERENDERED;
(...skipping 30 matching lines...) Expand all
148 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 148 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
149 if (!prerender_manager) 149 if (!prerender_manager)
150 return false; 150 return false;
151 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); 151 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL);
152 } 152 }
153 153
154 void PrerenderTabHelper::PrerenderSwappedIn() { 154 void PrerenderTabHelper::PrerenderSwappedIn() {
155 // Ensure we are not prerendering any more. 155 // Ensure we are not prerendering any more.
156 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_); 156 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_);
157 DCHECK(!IsPrerendering()); 157 DCHECK(!IsPrerendering());
158 last_swap_ = GetTimeTicksFromPrerenderManager();
158 if (pplt_load_start_.is_null()) { 159 if (pplt_load_start_.is_null()) {
159 // If we have already finished loading, report a 0 PPLT. 160 // If we have already finished loading, report a 0 PPLT.
160 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0); 161 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0);
161 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
162 } else { 162 } else {
163 // If we have not finished loading yet, record the actual load start, and 163 // If we have not finished loading yet, record the actual load start, and
164 // rebase the start time to now. 164 // rebase the start time to now.
165 actual_load_start_ = pplt_load_start_; 165 actual_load_start_ = pplt_load_start_;
166 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 166 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
167 } 167 }
168 } 168 }
169 169
170 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) { 170 void PrerenderTabHelper::WouldHavePrerenderedNextLoad(Origin origin) {
171 next_load_is_control_prerender_ = true; 171 next_load_is_control_prerender_ = true;
172 next_load_origin_ = origin; 172 next_load_origin_ = origin;
173 } 173 }
174 174
175 void PrerenderTabHelper::RecordPerceivedPageLoadTime( 175 void PrerenderTabHelper::RecordPerceivedPageLoadTime(
176 base::TimeDelta perceived_page_load_time, 176 base::TimeDelta perceived_page_load_time,
177 double fraction_plt_elapsed_at_swap_in) { 177 double fraction_plt_elapsed_at_swap_in) {
178 DCHECK(!IsPrerendering()); 178 DCHECK(!IsPrerendering());
179 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 179 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
180 if (!prerender_manager) 180 if (!prerender_manager)
181 return; 181 return;
182 182
183 // Note: it is possible for |next_load_is_control_prerender_| to be true at 183 // Note: it is possible for |next_load_is_control_prerender_| to be true at
184 // this point. This does not affect the classification of the current load, 184 // this point. This does not affect the classification of the current load,
185 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED 185 // but only the next load. (This occurs if a WOULD_HAVE_BEEN_PRERENDERED
186 // navigation interrupts and aborts another navigation.) 186 // navigation interrupts and aborts another navigation.)
187 prerender_manager->RecordPerceivedPageLoadTime( 187 prerender_manager->RecordPerceivedPageLoadTime(
188 origin_, navigation_type_, perceived_page_load_time, 188 origin_, navigation_type_, perceived_page_load_time,
189 fraction_plt_elapsed_at_swap_in, url_); 189 fraction_plt_elapsed_at_swap_in, url_);
190
191 // Reset state for the next navigation.
192 navigation_type_ = NAVIGATION_TYPE_NORMAL;
193 origin_ = ORIGIN_NONE;
194 } 190 }
195 191
196 } // namespace prerender 192 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698