OLD | NEW |
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" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 48 |
49 url_ = navigation_handle->GetURL(); | 49 url_ = navigation_handle->GetURL(); |
50 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | 50 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); |
51 if (!prerender_manager) | 51 if (!prerender_manager) |
52 return; | 52 return; |
53 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL)) | 53 if (prerender_manager->IsWebContentsPrerendering(web_contents(), NULL)) |
54 return; | 54 return; |
55 prerender_manager->RecordNavigation(url_); | 55 prerender_manager->RecordNavigation(url_); |
56 } | 56 } |
57 | 57 |
58 void PrerenderTabHelper::DidStopLoading() { | |
59 // Compute the PPLT metric and report it in a histogram, if needed. If the | |
60 // page is still prerendering, record the not swapped in page load time | |
61 // instead. | |
62 if (!pplt_load_start_.is_null()) { | |
63 base::TimeTicks now = GetTimeTicksFromPrerenderManager(); | |
64 if (IsPrerendering()) { | |
65 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | |
66 if (prerender_manager) { | |
67 prerender_manager->RecordPageLoadTimeNotSwappedIn( | |
68 origin_, now - pplt_load_start_, url_); | |
69 } else { | |
70 NOTREACHED(); | |
71 } | |
72 } else { | |
73 double fraction_elapsed_at_swapin = -1.0; | |
74 if (!actual_load_start_.is_null()) { | |
75 double plt = (now - actual_load_start_).InMillisecondsF(); | |
76 if (plt > 0.0) { | |
77 fraction_elapsed_at_swapin = 1.0 - | |
78 (now - pplt_load_start_).InMillisecondsF() / plt; | |
79 } else { | |
80 fraction_elapsed_at_swapin = 1.0; | |
81 } | |
82 DCHECK_GE(fraction_elapsed_at_swapin, 0.0); | |
83 DCHECK_LE(fraction_elapsed_at_swapin, 1.0); | |
84 } | |
85 | |
86 RecordPerceivedPageLoadTime( | |
87 now - pplt_load_start_, fraction_elapsed_at_swapin); | |
88 } | |
89 } | |
90 | |
91 // Reset the PPLT metric. | |
92 pplt_load_start_ = base::TimeTicks(); | |
93 actual_load_start_ = base::TimeTicks(); | |
94 } | |
95 | |
96 void PrerenderTabHelper::DidStartNavigation( | 58 void PrerenderTabHelper::DidStartNavigation( |
97 content::NavigationHandle* navigation_handle) { | 59 content::NavigationHandle* navigation_handle) { |
| 60 // Determine the origin. |
| 61 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); |
| 62 if (prerender_manager) |
| 63 prerender_manager->IsWebContentsPrerendering(web_contents(), &origin_); |
| 64 |
98 if (navigation_handle->IsSameDocument()) | 65 if (navigation_handle->IsSameDocument()) |
99 return; | 66 return; |
100 | 67 |
101 // Determine the navigation type. | |
102 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | |
103 if (prerender_manager && | |
104 prerender_manager->IsWebContentsPrerendering(web_contents(), &origin_)) { | |
105 navigation_type_ = NAVIGATION_TYPE_PRERENDERED; | |
106 } else { | |
107 navigation_type_ = NAVIGATION_TYPE_NORMAL; | |
108 } | |
109 | |
110 if (!navigation_handle->IsInMainFrame()) | 68 if (!navigation_handle->IsInMainFrame()) |
111 return; | 69 return; |
112 | 70 |
113 // Record PPLT state for the beginning of a new navigation. | |
114 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); | |
115 actual_load_start_ = base::TimeTicks(); | |
116 | |
117 MainFrameUrlDidChange(navigation_handle->GetURL()); | 71 MainFrameUrlDidChange(navigation_handle->GetURL()); |
118 } | 72 } |
119 | 73 |
120 void PrerenderTabHelper::MainFrameUrlDidChange(const GURL& url) { | 74 void PrerenderTabHelper::MainFrameUrlDidChange(const GURL& url) { |
121 url_ = url; | 75 url_ = url; |
122 } | 76 } |
123 | 77 |
124 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { | 78 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { |
125 return PrerenderManagerFactory::GetForBrowserContext( | 79 return PrerenderManagerFactory::GetForBrowserContext( |
126 web_contents()->GetBrowserContext()); | 80 web_contents()->GetBrowserContext()); |
(...skipping 12 matching lines...) Expand all Loading... |
139 } | 93 } |
140 | 94 |
141 bool PrerenderTabHelper::IsPrerendering() { | 95 bool PrerenderTabHelper::IsPrerendering() { |
142 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | 96 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); |
143 if (!prerender_manager) | 97 if (!prerender_manager) |
144 return false; | 98 return false; |
145 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); | 99 return prerender_manager->IsWebContentsPrerendering(web_contents(), NULL); |
146 } | 100 } |
147 | 101 |
148 void PrerenderTabHelper::PrerenderSwappedIn() { | 102 void PrerenderTabHelper::PrerenderSwappedIn() { |
149 // Ensure we are not prerendering any more. | |
150 DCHECK_EQ(NAVIGATION_TYPE_PRERENDERED, navigation_type_); | |
151 DCHECK(!IsPrerendering()); | 103 DCHECK(!IsPrerendering()); |
152 swap_ticks_ = GetTimeTicksFromPrerenderManager(); | 104 swap_ticks_ = GetTimeTicksFromPrerenderManager(); |
153 if (pplt_load_start_.is_null()) { | |
154 // If we have already finished loading, report a 0 PPLT. | |
155 RecordPerceivedPageLoadTime(base::TimeDelta(), 1.0); | |
156 } else { | |
157 // If we have not finished loading yet, record the actual load start, and | |
158 // rebase the start time to now. | |
159 actual_load_start_ = pplt_load_start_; | |
160 pplt_load_start_ = GetTimeTicksFromPrerenderManager(); | |
161 } | |
162 } | |
163 | |
164 void PrerenderTabHelper::RecordPerceivedPageLoadTime( | |
165 base::TimeDelta perceived_page_load_time, | |
166 double fraction_plt_elapsed_at_swap_in) { | |
167 DCHECK(!IsPrerendering()); | |
168 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | |
169 if (!prerender_manager) | |
170 return; | |
171 | |
172 prerender_manager->RecordPerceivedPageLoadTime( | |
173 origin_, navigation_type_, perceived_page_load_time, | |
174 fraction_plt_elapsed_at_swap_in, url_); | |
175 } | 105 } |
176 | 106 |
177 } // namespace prerender | 107 } // namespace prerender |
OLD | NEW |