Chromium Code Reviews| Index: chrome/browser/metrics/first_web_contents_profiler.cc |
| diff --git a/chrome/browser/metrics/first_web_contents_profiler.cc b/chrome/browser/metrics/first_web_contents_profiler.cc |
| index b64c09bf20c356996f998b2a0f07fd233a436d16..0727d418b488a1ead35c180070ce9449075040db 100644 |
| --- a/chrome/browser/metrics/first_web_contents_profiler.cc |
| +++ b/chrome/browser/metrics/first_web_contents_profiler.cc |
| @@ -21,8 +21,10 @@ |
| #include "components/metrics/proto/profiler_event.pb.h" |
| #include "components/startup_metric_utils/startup_metric_utils.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/navigation_details.h" |
| namespace { |
| + |
| // The initial delay for responsiveness prober in milliseconds. |
| const int kInitialDelayMs = 20; |
| @@ -115,6 +117,7 @@ FirstWebContentsProfiler::FirstWebContentsProfiler( |
| content::WebContents* web_contents, |
| Delegate* delegate) |
| : content::WebContentsObserver(web_contents), |
| + initial_entry_committed_(false), |
| collected_paint_metric_(false), |
| collected_load_metric_(false), |
| delegate_(delegate), |
| @@ -131,7 +134,7 @@ void FirstWebContentsProfiler::DidFirstVisuallyNonEmptyPaint() { |
| if (collected_paint_metric_) |
| return; |
| if (startup_metric_utils::WasNonBrowserUIDisplayed()) { |
| - FinishedCollectingMetrics(); |
| + FinishedCollectingMetrics(FinishReason::ABANDON_BLOCKING_UI); |
| return; |
| } |
| @@ -162,14 +165,14 @@ void FirstWebContentsProfiler::DidFirstVisuallyNonEmptyPaint() { |
| base::TimeDelta::FromSeconds(10)); |
| if (IsFinishedCollectingMetrics()) |
| - FinishedCollectingMetrics(); |
| + FinishedCollectingMetrics(FinishReason::DONE); |
| } |
| void FirstWebContentsProfiler::DocumentOnLoadCompletedInMainFrame() { |
| if (collected_load_metric_) |
| return; |
| if (startup_metric_utils::WasNonBrowserUIDisplayed()) { |
| - FinishedCollectingMetrics(); |
| + FinishedCollectingMetrics(FinishReason::ABANDON_BLOCKING_UI); |
| return; |
| } |
| @@ -177,18 +180,50 @@ void FirstWebContentsProfiler::DocumentOnLoadCompletedInMainFrame() { |
| startup_metric_utils::RecordFirstWebContentsMainFrameLoad(base::Time::Now()); |
| if (IsFinishedCollectingMetrics()) |
| - FinishedCollectingMetrics(); |
| + FinishedCollectingMetrics(FinishReason::DONE); |
| +} |
| + |
| +void FirstWebContentsProfiler::NavigationEntryCommitted( |
| + const content::LoadCommittedDetails& load_details) { |
| + // Stop profiling on any navigation to a different page as it (1) is no longer |
|
rkaplow
2015/10/20 20:08:30
text seems good but I would break this is up, a lo
gab
2015/10/20 20:16:21
Kept sentence, but re-ordered in bullet points, WD
|
| + // a fair timing and (2) can cause http://crbug.com/525209 where one of the |
| + // timing heuristics (e.g. first paint) didn't fire for the initial content |
| + // but fires after a lot of idle time when the user finally navigates to |
| + // another page that does trigger it. |
| + if (load_details.is_navigation_to_different_page()) { |
| + if (initial_entry_committed_) |
| + FinishedCollectingMetrics(FinishReason::ABANDON_NAVIGATION); |
| + else |
| + initial_entry_committed_ = true; |
| + } |
| +} |
| + |
| +void FirstWebContentsProfiler::WasHidden() { |
| + // Stop profiling if the content gets hidden as its load may be deprioritized |
| + // and timing it becomes meaningless. |
| + FinishedCollectingMetrics(FinishReason::ABANDON_CONTENT_HIDDEN); |
| } |
| void FirstWebContentsProfiler::WebContentsDestroyed() { |
| - FinishedCollectingMetrics(); |
| + FinishedCollectingMetrics(FinishReason::ABANDON_CONTENT_DESTROYED); |
| } |
| bool FirstWebContentsProfiler::IsFinishedCollectingMetrics() { |
| return collected_paint_metric_ && collected_load_metric_; |
| } |
| -void FirstWebContentsProfiler::FinishedCollectingMetrics() { |
| +void FirstWebContentsProfiler::FinishedCollectingMetrics( |
| + FinishReason finish_reason) { |
| + UMA_HISTOGRAM_ENUMERATION("Startup.FirstWebContents.FinishReason", |
| + finish_reason, FinishReason::COUNT); |
| + if (!collected_paint_metric_) { |
| + UMA_HISTOGRAM_ENUMERATION("Startup.FirstWebContents.FinishReason_NoPaint", |
| + finish_reason, FinishReason::COUNT); |
| + } |
| + if (!collected_load_metric_) { |
| + UMA_HISTOGRAM_ENUMERATION("Startup.FirstWebContents.FinishReason_NoLoad", |
| + finish_reason, FinishReason::COUNT); |
| + } |
| delegate_->ProfilerFinishedCollectingMetrics(); |
| } |