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..86fd62067fc4039e35f52940c4372c8bfc2e93db 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,51 @@ void FirstWebContentsProfiler::DocumentOnLoadCompletedInMainFrame() { |
startup_metric_utils::RecordFirstWebContentsMainFrameLoad(base::Time::Now()); |
if (IsFinishedCollectingMetrics()) |
- FinishedCollectingMetrics(); |
+ FinishedCollectingMetrics(FinishReason::DONE); |
+} |
+ |
+void FirstWebContentsProfiler::NavigationEntryCommitted( |
+ const content::LoadCommittedDetails& load_details) { |
+ // Abandon profiling on any navigation to a different page as it: |
+ // (1) is no longer 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::ENUM_MAX); |
+ if (!collected_paint_metric_) { |
+ UMA_HISTOGRAM_ENUMERATION("Startup.FirstWebContents.FinishReason_NoPaint", |
+ finish_reason, FinishReason::ENUM_MAX); |
+ } |
+ if (!collected_load_metric_) { |
+ UMA_HISTOGRAM_ENUMERATION("Startup.FirstWebContents.FinishReason_NoLoad", |
+ finish_reason, FinishReason::ENUM_MAX); |
+ } |
delegate_->ProfilerFinishedCollectingMetrics(); |
} |