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

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 e48b4cd4f88a9195eaa82e2c3b910e2bf037d2f5..d60b8cf031ccb7f6d3ddf2f50118cb578f90e045 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
@@ -63,6 +63,12 @@ PageLoadType GetPageLoadType(ui::PageTransition transition) {
return LOAD_TYPE_NONE;
}
+void RecordFirstMeaningfulPaintStatus(
+ internal::FirstMeaningfulPaintStatus status) {
+ UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
+ status, internal::FIRST_MEANINGFUL_PAINT_LAST_ENTRY);
+}
+
} // namespace
namespace internal {
@@ -100,6 +106,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 +118,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";
@@ -178,12 +190,16 @@ const char kHistogramTotalRequestsParseStop[] =
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() {}
@@ -191,6 +207,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) {
@@ -241,6 +258,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,
@@ -346,6 +365,35 @@ void CorePageLoadMetricsObserver::OnFirstContentfulPaint(
}
}
+void CorePageLoadMetricsObserver::OnFirstMeaningfulPaint(
+ const page_load_metrics::PageLoadTiming& timing,
+ const page_load_metrics::PageLoadExtraInfo& info) {
+ base::TimeTicks paint =
+ navigation_start_ + timing.first_meaningful_paint.value();
+ if (first_user_interaction_after_first_paint_.is_null() ||
+ paint < 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() - paint);
+ RecordFirstMeaningfulPaintStatus(
+ internal::FIRST_MEANINGFUL_PAINT_RECORDED);
+ } else {
+ RecordFirstMeaningfulPaintStatus(
+ internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
+ }
+ } else {
+ RecordFirstMeaningfulPaintStatus(
+ internal::FIRST_MEANINGFUL_PAINT_USER_INTERACTION_BEFORE_FMP);
+ }
+}
+
void CorePageLoadMetricsObserver::OnParseStart(
const page_load_metrics::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) {
@@ -459,6 +507,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) {
@@ -494,6 +550,11 @@ void CorePageLoadMetricsObserver::RecordTimingHistograms(
PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstForeground,
info.first_foreground_time.value());
}
+
+ if (timing.first_paint && !timing.first_meaningful_paint) {
+ RecordFirstMeaningfulPaintStatus(
+ internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE);
+ }
}
void CorePageLoadMetricsObserver::RecordRappor(

Powered by Google App Engine
This is Rietveld 408576698