| 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 |