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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: clarify page load metric test Created 3 years, 12 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_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 weak_factory_(this) { 27 weak_factory_(this) {}
28 // Determine if this is a prerender.
29 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
30 if (prerender_manager &&
31 prerender_manager->IsWebContentsPrerendering(web_contents, &origin_)) {
32 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
33 } else {
34 navigation_type_ = NAVIGATION_TYPE_NORMAL;
35 }
36 }
37 28
38 PrerenderTabHelper::~PrerenderTabHelper() { 29 PrerenderTabHelper::~PrerenderTabHelper() {
39 } 30 }
40 31
41 void PrerenderTabHelper::DidGetRedirectForResourceRequest( 32 void PrerenderTabHelper::DidGetRedirectForResourceRequest(
42 const content::ResourceRedirectDetails& details) { 33 const content::ResourceRedirectDetails& details) {
43 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME) 34 if (details.resource_type != content::RESOURCE_TYPE_MAIN_FRAME)
44 return; 35 return;
45 36
46 MainFrameUrlDidChange(details.new_url); 37 MainFrameUrlDidChange(details.new_url);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 87
97 // Reset the PPLT metric. 88 // Reset the PPLT metric.
98 pplt_load_start_ = base::TimeTicks(); 89 pplt_load_start_ = base::TimeTicks();
99 actual_load_start_ = base::TimeTicks(); 90 actual_load_start_ = base::TimeTicks();
100 } 91 }
101 92
102 void PrerenderTabHelper::DidStartProvisionalLoadForFrame( 93 void PrerenderTabHelper::DidStartProvisionalLoadForFrame(
103 content::RenderFrameHost* render_frame_host, 94 content::RenderFrameHost* render_frame_host,
104 const GURL& validated_url, 95 const GURL& validated_url,
105 bool is_error_page) { 96 bool is_error_page) {
97 // Determine the navigation type.
98 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
99 if (prerender_manager &&
100 prerender_manager->IsWebContentsPrerendering(web_contents(), &origin_)) {
101 navigation_type_ = NAVIGATION_TYPE_PRERENDERED;
102 } else {
103 navigation_type_ = NAVIGATION_TYPE_NORMAL;
104 }
105
106 if (render_frame_host->GetParent()) 106 if (render_frame_host->GetParent())
107 return; 107 return;
108 108
109 // Record PPLT state for the beginning of a new navigation. 109 // Record PPLT state for the beginning of a new navigation.
110 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 110 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
111 actual_load_start_ = base::TimeTicks(); 111 actual_load_start_ = base::TimeTicks();
112 112
113 MainFrameUrlDidChange(validated_url); 113 MainFrameUrlDidChange(validated_url);
114 } 114 }
115 115
(...skipping 22 matching lines...) Expand all
138 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 138 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
139 if (!prerender_manager) 139 if (!prerender_manager)
140 return false; 140 return false;
141 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); 141 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL);
142 } 142 }
143 143
144 void PrerenderTabHelper::PrerenderSwappedIn() { 144 void PrerenderTabHelper::PrerenderSwappedIn() {
145 // Ensure we are not prerendering any more. 145 // Ensure we are not prerendering any more.
146 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_); 146 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_);
147 DCHECK(!IsPrerendering()); 147 DCHECK(!IsPrerendering());
148 swap_ticks_ = GetTimeTicksFromPrerenderManager();
148 if (pplt_load_start_.is_null()) { 149 if (pplt_load_start_.is_null()) {
149 // If we have already finished loading, report a 0 PPLT. 150 // If we have already finished loading, report a 0 PPLT.
150 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0); 151 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0);
151 DCHECK_EQ(NAVIGATION_TYPE_NORMAL, navigation_type_);
152 } else { 152 } else {
153 // If we have not finished loading yet, record the actual load start, and 153 // If we have not finished loading yet, record the actual load start, and
154 // rebase the start time to now. 154 // rebase the start time to now.
155 actual_load_start_ = pplt_load_start_; 155 actual_load_start_ = pplt_load_start_;
156 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); 156 pplt_load_start_ = GetTimeTicksFromPrerenderManager();
157 } 157 }
158 } 158 }
159 159
160 void PrerenderTabHelper::RecordPerceivedPageLoadTime( 160 void PrerenderTabHelper::RecordPerceivedPageLoadTime(
161 base::TimeDelta perceived_page_load_time, 161 base::TimeDelta perceived_page_load_time,
162 double fraction_plt_elapsed_at_swap_in) { 162 double fraction_plt_elapsed_at_swap_in) {
163 DCHECK(!IsPrerendering()); 163 DCHECK(!IsPrerendering());
164 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); 164 PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
165 if (!prerender_manager) 165 if (!prerender_manager)
166 return; 166 return;
167 167
168 prerender_manager->RecordPerceivedPageLoadTime( 168 prerender_manager->RecordPerceivedPageLoadTime(
169 origin_, navigation_type_, perceived_page_load_time, 169 origin_, navigation_type_, perceived_page_load_time,
170 fraction_plt_elapsed_at_swap_in, url_); 170 fraction_plt_elapsed_at_swap_in, url_);
171
172 // Reset state for the next navigation.
173 navigation_type_ = NAVIGATION_TYPE_NORMAL;
174 origin_ = ORIGIN_NONE;
175 } 171 }
176 172
177 } // namespace prerender 173 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698