Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6682)

Unified Diff: chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc

Issue 2039363003: FirstMeaningfulPaint UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
index 4cdc73f92eb24c8bb6258533f2fccfd523006ca1..66c014ac2fe71b9c6fe48ba4971dbc023c8a0fc6 100644
--- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
@@ -62,6 +62,13 @@ PageLoadType GetPageLoadType(ui::PageTransition transition) {
return LOAD_TYPE_NONE;
}
+enum FirstMeaningfulPaintStatus {
+ FMP_RECORDED,
+ FMP_DID_NOT_REACH_NETWORK_STABLE,
+ FMP_USER_INTERACTION_BEFORE_FMP,
+ FMP_ENUM_MAX
Charlie Harrison 2016/08/04 02:18:29 nit: page_load_metrics component uses LAST_VALUE i
Kunihiko Sakamoto 2016/08/04 02:56:14 Not LAST_VALUE but LAST_ENTRY right? Done.
Charlie Harrison 2016/08/04 18:27:27 Oops yes :P thanks.
+};
+
} // namespace
namespace internal {
@@ -99,6 +106,11 @@ const char kHistogramFirstContentfulPaint[] =
"PageLoad.PaintTiming.NavigationToFirstContentfulPaint";
const char kBackgroundHistogramFirstContentfulPaint[] =
"PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Background";
+const char kHistogramFirstMeaningfulPaint[] =
+ "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint";
+const char kBackgroundHistogramFirstMeaningfulPaint[] =
Charlie Harrison 2016/08/04 02:18:29 I am slightly opposed to adding background paint h
Kunihiko Sakamoto 2016/08/04 02:56:14 If no one looks at existing ones, no reason to add
+ "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint."
+ "Background";
const char kHistogramParseStartToFirstContentfulPaint[] =
Charlie Harrison 2016/08/04 02:18:29 Do you mind adding a ParseStartToFirstMeaningfulPa
Kunihiko Sakamoto 2016/08/04 02:56:14 Added.
"PageLoad.PaintTiming.ParseStartToFirstContentfulPaint";
const char kBackgroundHistogramParseStartToFirstContentfulPaint[] =
@@ -107,6 +119,11 @@ const char kHistogramParseStart[] =
"PageLoad.ParseTiming.NavigationToParseStart";
const char kBackgroundHistogramParseStart[] =
"PageLoad.ParseTiming.NavigationToParseStart.Background";
+const char kHistogramFirstMeaningfulPaintToNetworkStable[] =
+ "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintToNetworkStable";
+const char kBackgroundHistogramFirstMeaningfulPaintToNetworkStable[] =
+ "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintToNetworkStable."
+ "Background";
const char kHistogramParseDuration[] = "PageLoad.ParseTiming.ParseDuration";
const char kBackgroundHistogramParseDuration[] =
"PageLoad.ParseTiming.ParseDuration.Background";
@@ -161,11 +178,15 @@ const char kHistogramForegroundToFirstPaint[] =
const char kRapporMetricsNameCoarseTiming[] =
"PageLoad.CoarseTiming.NavigationToFirstContentfulPaint";
+const char kHistogramFirstMeaningfulPaintStatus[] =
+ "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus";
+
} // namespace internal
CorePageLoadMetricsObserver::CorePageLoadMetricsObserver()
: transition_(ui::PAGE_TRANSITION_LINK),
- initiated_by_user_gesture_(false) {}
+ initiated_by_user_gesture_(false),
+ had_first_paint_(false) {}
CorePageLoadMetricsObserver::~CorePageLoadMetricsObserver() {}
@@ -173,6 +194,7 @@ void CorePageLoadMetricsObserver::OnCommit(
content::NavigationHandle* navigation_handle) {
transition_ = navigation_handle->GetPageTransition();
initiated_by_user_gesture_ = navigation_handle->HasUserGesture();
+ navigation_start_ = navigation_handle->NavigationStart();
}
void CorePageLoadMetricsObserver::OnDomContentLoadedEventStart(
@@ -217,6 +239,8 @@ void CorePageLoadMetricsObserver::OnFirstLayout(
void CorePageLoadMetricsObserver::OnFirstPaint(
const page_load_metrics::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) {
+ had_first_paint_ = true;
+
if (WasStartedInForegroundOptionalEventInForeground(timing.first_paint,
info)) {
PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstPaint,
@@ -311,6 +335,37 @@ void CorePageLoadMetricsObserver::OnFirstContentfulPaint(
}
}
+void CorePageLoadMetricsObserver::OnFirstMeaningfulPaint(
+ const page_load_metrics::PageLoadTiming& timing,
+ const page_load_metrics::PageLoadExtraInfo& info) {
+ base::TimeTicks fmp =
+ navigation_start_ + timing.first_meaningful_paint.value();
+ if (first_user_interaction_after_first_paint_.is_null() ||
+ fmp < first_user_interaction_after_first_paint_) {
+ base::TimeDelta time_since_fmp = base::TimeTicks::Now() - fmp;
+ if (WasStartedInForegroundOptionalEventInForeground(
+ timing.first_meaningful_paint, info)) {
+ PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint,
+ timing.first_meaningful_paint.value());
+ PAGE_LOAD_HISTOGRAM(
+ internal::kHistogramFirstMeaningfulPaintToNetworkStable,
+ time_since_fmp);
+ } else {
+ PAGE_LOAD_HISTOGRAM(
+ internal::kBackgroundHistogramFirstMeaningfulPaint,
+ timing.first_meaningful_paint.value());
+ PAGE_LOAD_HISTOGRAM(
+ internal::kBackgroundHistogramFirstMeaningfulPaintToNetworkStable,
+ time_since_fmp);
+ }
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ FMP_RECORDED, FMP_ENUM_MAX);
+ } else {
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ FMP_USER_INTERACTION_BEFORE_FMP, FMP_ENUM_MAX);
+ }
+}
+
void CorePageLoadMetricsObserver::OnParseStart(
const page_load_metrics::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) {
@@ -396,6 +451,14 @@ void CorePageLoadMetricsObserver::OnFailedProvisionalLoad(
}
}
+void CorePageLoadMetricsObserver::OnUserInput(
+ const blink::WebInputEvent& event) {
+ if (had_first_paint_ && first_user_interaction_after_first_paint_.is_null() &&
+ event.type != blink::WebInputEvent::MouseMove) {
+ first_user_interaction_after_first_paint_ = base::TimeTicks::Now();
+ }
+}
+
void CorePageLoadMetricsObserver::RecordTimingHistograms(
const page_load_metrics::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) {
@@ -431,6 +494,11 @@ void CorePageLoadMetricsObserver::RecordTimingHistograms(
PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstForeground,
info.first_foreground_time.value());
}
+
+ if (timing.first_paint && !timing.first_meaningful_paint) {
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ FMP_DID_NOT_REACH_NETWORK_STABLE, FMP_ENUM_MAX);
+ }
}
void CorePageLoadMetricsObserver::RecordRappor(

Powered by Google App Engine
This is Rietveld 408576698