OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_observer.h" | 5 #include "chrome/browser/prerender/prerender_observer.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
8 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
9 #include "base/time.h" | 9 #include "base/time.h" |
10 #include "chrome/browser/prerender/prerender_manager.h" | 10 #include "chrome/browser/prerender/prerender_manager.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 base::Histogram::kUmaTargetedHistogramFlag); | 73 base::Histogram::kUmaTargetedHistogramFlag); |
74 } | 74 } |
75 base::Histogram* count_hover_events() { return count_hover_events_; } | 75 base::Histogram* count_hover_events() { return count_hover_events_; } |
76 base::Histogram* time_hover_until_click() { return time_hover_until_click_; } | 76 base::Histogram* time_hover_until_click() { return time_hover_until_click_; } |
77 | 77 |
78 private: | 78 private: |
79 base::Histogram* count_hover_events_; | 79 base::Histogram* count_hover_events_; |
80 base::Histogram* time_hover_until_click_; | 80 base::Histogram* time_hover_until_click_; |
81 }; | 81 }; |
82 | 82 |
83 enum PAGEVIEW_EVENTS { | |
84 PAGEVIEW_EVENT_NEW_URL = 0, | |
85 PAGEVIEW_EVENT_TOP_SITE_NEW_URL = 1, | |
86 PAGEVIEW_EVENT_LOAD_START = 2, | |
87 PAGEVIEW_EVENT_TOP_SITE_LOAD_START = 3, | |
88 PAGEVIEW_EVENT_MAX = 4 | |
89 }; | |
90 | |
91 void RecordPageviewEvent(PAGEVIEW_EVENTS event) { | |
92 UMA_HISTOGRAM_ENUMERATION("Prerender.PageviewEvents", | |
93 event, PAGEVIEW_EVENT_MAX); | |
94 } | |
95 | |
96 } // namespace | 83 } // namespace |
97 | 84 |
98 class PrerenderObserver::HoverData { | 85 class PrerenderObserver::HoverData { |
99 public: | 86 public: |
100 void SetHoverThreshold(int threshold_ms) { | 87 void SetHoverThreshold(int threshold_ms) { |
101 hover_threshold_ = base::TimeDelta::FromMilliseconds(threshold_ms); | 88 hover_threshold_ = base::TimeDelta::FromMilliseconds(threshold_ms); |
102 histograms_.reset(new PerHoverThresholdHistograms(threshold_ms)); | 89 histograms_.reset(new PerHoverThresholdHistograms(threshold_ms)); |
103 } | 90 } |
104 | 91 |
105 void RecordHover(const GURL& url) { | 92 void RecordHover(const GURL& url) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 last_hovers_(new HoverData[kNumHoverThresholds]) { | 173 last_hovers_(new HoverData[kNumHoverThresholds]) { |
187 for (int i = 0; i < kNumHoverThresholds; i++) | 174 for (int i = 0; i < kNumHoverThresholds; i++) |
188 last_hovers_[i].SetHoverThreshold(kMinHoverThresholdsMs[i]); | 175 last_hovers_[i].SetHoverThreshold(kMinHoverThresholdsMs[i]); |
189 } | 176 } |
190 | 177 |
191 PrerenderObserver::~PrerenderObserver() { | 178 PrerenderObserver::~PrerenderObserver() { |
192 } | 179 } |
193 | 180 |
194 void PrerenderObserver::ProvisionalChangeToMainFrameUrl(const GURL& url, | 181 void PrerenderObserver::ProvisionalChangeToMainFrameUrl(const GURL& url, |
195 bool has_opener_set) { | 182 bool has_opener_set) { |
196 RecordPageviewEvent(PAGEVIEW_EVENT_NEW_URL); | |
197 if (IsTopSite(url)) | |
198 RecordPageviewEvent(PAGEVIEW_EVENT_TOP_SITE_NEW_URL); | |
199 if (!tab_->delegate()) | 183 if (!tab_->delegate()) |
200 return; // PrerenderManager needs a delegate to handle the swap. | 184 return; // PrerenderManager needs a delegate to handle the swap. |
201 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | 185 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); |
202 if (!prerender_manager) | 186 if (!prerender_manager) |
203 return; | 187 return; |
204 if (prerender_manager->IsTabContentsPrerendering(tab_contents())) | 188 if (prerender_manager->IsTabContentsPrerendering(tab_contents())) |
205 return; | 189 return; |
206 prerender_manager->MarkTabContentsAsNotPrerendered(tab_contents()); | 190 prerender_manager->MarkTabContentsAsNotPrerendered(tab_contents()); |
207 MaybeUsePrerenderedPage(url, has_opener_set); | 191 MaybeUsePrerenderedPage(url, has_opener_set); |
208 } | 192 } |
209 | 193 |
210 bool PrerenderObserver::OnMessageReceived(const IPC::Message& message) { | 194 bool PrerenderObserver::OnMessageReceived(const IPC::Message& message) { |
211 IPC_BEGIN_MESSAGE_MAP(PrerenderObserver, message) | 195 IPC_BEGIN_MESSAGE_MAP(PrerenderObserver, message) |
212 IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame, | 196 IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame, |
213 OnDidStartProvisionalLoadForFrame) | 197 OnDidStartProvisionalLoadForFrame) |
214 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateTargetURL, OnMsgUpdateTargetURL) | 198 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateTargetURL, OnMsgUpdateTargetURL) |
215 IPC_END_MESSAGE_MAP() | 199 IPC_END_MESSAGE_MAP() |
216 return false; | 200 return false; |
217 } | 201 } |
218 | 202 |
219 void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id, | 203 void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id, |
220 bool is_main_frame, | 204 bool is_main_frame, |
221 bool has_opener_set, | 205 bool has_opener_set, |
222 const GURL& url) { | 206 const GURL& url) { |
223 if (is_main_frame) { | 207 if (is_main_frame) { |
224 RecordPageviewEvent(PAGEVIEW_EVENT_LOAD_START); | |
225 if (IsTopSite(url)) | |
226 RecordPageviewEvent(PAGEVIEW_EVENT_TOP_SITE_LOAD_START); | |
227 | |
228 // Record the beginning of a new PPLT navigation. | 208 // Record the beginning of a new PPLT navigation. |
229 pplt_load_start_ = base::TimeTicks::Now(); | 209 pplt_load_start_ = base::TimeTicks::Now(); |
230 | 210 |
231 // Update hover stats. | 211 // Update hover stats. |
232 for (int i = 0; i < kNumHoverThresholds; i++) | 212 for (int i = 0; i < kNumHoverThresholds; i++) |
233 last_hovers_[i].RecordNavigation(url); | 213 last_hovers_[i].RecordNavigation(url); |
234 | 214 |
235 MaybeLogCurrentHover(current_hover_url_ == url); | 215 MaybeLogCurrentHover(current_hover_url_ == url); |
236 } | 216 } |
237 } | 217 } |
(...skipping 16 matching lines...) Expand all Loading... |
254 // Compute the PPLT metric and report it in a histogram, if needed. | 234 // Compute the PPLT metric and report it in a histogram, if needed. |
255 if (!pplt_load_start_.is_null() && !IsPrerendering()) { | 235 if (!pplt_load_start_.is_null() && !IsPrerendering()) { |
256 PrerenderManager::RecordPerceivedPageLoadTime( | 236 PrerenderManager::RecordPerceivedPageLoadTime( |
257 base::TimeTicks::Now() - pplt_load_start_, tab_contents()); | 237 base::TimeTicks::Now() - pplt_load_start_, tab_contents()); |
258 } | 238 } |
259 | 239 |
260 // Reset the PPLT metric. | 240 // Reset the PPLT metric. |
261 pplt_load_start_ = base::TimeTicks(); | 241 pplt_load_start_ = base::TimeTicks(); |
262 } | 242 } |
263 | 243 |
264 PrerenderManager* PrerenderObserver::MaybeGetPrerenderManager() const { | 244 PrerenderManager* PrerenderObserver::MaybeGetPrerenderManager() { |
265 Profile* profile = | 245 Profile* profile = |
266 Profile::FromBrowserContext(tab_contents()->browser_context()); | 246 Profile::FromBrowserContext(tab_contents()->browser_context()); |
267 return profile->GetPrerenderManager(); | 247 return profile->GetPrerenderManager(); |
268 } | 248 } |
269 | 249 |
270 bool PrerenderObserver::MaybeUsePrerenderedPage(const GURL& url, | 250 bool PrerenderObserver::MaybeUsePrerenderedPage(const GURL& url, |
271 bool has_opener_set) { | 251 bool has_opener_set) { |
272 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); | 252 PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); |
273 if (!prerender_manager) | 253 if (!prerender_manager) |
274 return false; | 254 return false; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 UMA_HISTOGRAM_ENUMERATION("Prerender.HoverStats_TimeUntilClicked", | 296 UMA_HISTOGRAM_ENUMERATION("Prerender.HoverStats_TimeUntilClicked", |
317 elapsed_ms, num_buckets); | 297 elapsed_ms, num_buckets); |
318 } else { | 298 } else { |
319 UMA_HISTOGRAM_ENUMERATION("Prerender.HoverStats_TimeUntilDiscarded", | 299 UMA_HISTOGRAM_ENUMERATION("Prerender.HoverStats_TimeUntilDiscarded", |
320 elapsed_ms, num_buckets); | 300 elapsed_ms, num_buckets); |
321 } | 301 } |
322 | 302 |
323 current_hover_url_ = GURL(); | 303 current_hover_url_ = GURL(); |
324 } | 304 } |
325 | 305 |
326 bool PrerenderObserver::IsTopSite(const GURL& url) const { | |
327 PrerenderManager* pm = MaybeGetPrerenderManager(); | |
328 return (pm && pm->IsTopSite(url)); | |
329 } | |
330 | |
331 } // namespace prerender | 306 } // namespace prerender |
OLD | NEW |