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

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: review comments 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 cc5c8d92380d1f58fa9c2d70d24b47ecb053dcc5..bb9bacc2ad7a1cd3b404cff960a7a5640a703f03 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
@@ -100,6 +100,10 @@ const char kHistogramFirstContentfulPaint[] =
"PageLoad.PaintTiming.NavigationToFirstContentfulPaint";
const char kBackgroundHistogramFirstContentfulPaint[] =
"PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Background";
+const char kHistogramFirstMeaningfulPaint[] =
+ "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint";
+const char kHistogramParseStartToFirstMeaningfulPaint[] =
+ "PageLoad.Experimental.PaintTiming.ParseStartToFirstMeaningfulPaint";
const char kHistogramParseStartToFirstContentfulPaint[] =
"PageLoad.PaintTiming.ParseStartToFirstContentfulPaint";
const char kBackgroundHistogramParseStartToFirstContentfulPaint[] =
@@ -108,6 +112,8 @@ const char kHistogramParseStart[] =
"PageLoad.ParseTiming.NavigationToParseStart";
const char kBackgroundHistogramParseStart[] =
"PageLoad.ParseTiming.NavigationToParseStart.Background";
+const char kHistogramFirstMeaningfulPaintToNetworkStable[] =
+ "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintToNetworkStable";
const char kHistogramParseDuration[] = "PageLoad.ParseTiming.ParseDuration";
const char kBackgroundHistogramParseDuration[] =
"PageLoad.ParseTiming.ParseDuration.Background";
@@ -171,12 +177,16 @@ 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),
- was_no_store_main_resource_(false) {}
+ was_no_store_main_resource_(false),
+ had_first_paint_(false) {}
CorePageLoadMetricsObserver::~CorePageLoadMetricsObserver() {}
@@ -184,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();
const net::HttpResponseHeaders* headers =
navigation_handle->GetResponseHeaders();
if (headers) {
@@ -234,6 +245,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,
@@ -339,6 +352,35 @@ void CorePageLoadMetricsObserver::OnFirstContentfulPaint(
}
}
+void CorePageLoadMetricsObserver::OnFirstMeaningfulPaint(
+ const page_load_metrics::PageLoadTiming& timing,
+ const page_load_metrics::PageLoadExtraInfo& info) {
+ base::TimeTicks fmp =
Ilya Sherman 2016/08/10 05:42:36 nit: I think "paint" would be a clearer name than
Kunihiko Sakamoto 2016/08/10 07:43:09 Done.
+ navigation_start_ + timing.first_meaningful_paint.value();
+ if (first_user_interaction_after_first_paint_.is_null() ||
+ fmp < first_user_interaction_after_first_paint_) {
+ if (WasStartedInForegroundOptionalEventInForeground(
+ timing.first_meaningful_paint, info)) {
+ PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint,
+ timing.first_meaningful_paint.value());
+ PAGE_LOAD_HISTOGRAM(
+ internal::kHistogramParseStartToFirstMeaningfulPaint,
+ timing.first_meaningful_paint.value() - timing.parse_start.value());
+ PAGE_LOAD_HISTOGRAM(
+ internal::kHistogramFirstMeaningfulPaintToNetworkStable,
+ base::TimeTicks::Now() - fmp);
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ internal::FMP_RECORDED, internal::FMP_LAST_ENTRY);
+ } else {
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ internal::FMP_BACKGROUNDED, internal::FMP_LAST_ENTRY);
+ }
+ } else {
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ internal::FMP_USER_INTERACTION_BEFORE_FMP, internal::FMP_LAST_ENTRY);
+ }
+}
+
void CorePageLoadMetricsObserver::OnParseStart(
const page_load_metrics::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) {
@@ -429,6 +471,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) {
@@ -464,6 +514,12 @@ 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,
+ internal::FMP_DID_NOT_REACH_NETWORK_STABLE,
+ internal::FMP_LAST_ENTRY);
Ilya Sherman 2016/08/10 05:42:36 nit: I would recommend having a wrapper function f
Kunihiko Sakamoto 2016/08/10 07:43:09 Added a wrapper function, and expanded the acronym
+ }
}
void CorePageLoadMetricsObserver::RecordRappor(

Powered by Google App Engine
This is Rietveld 408576698