| 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..d193bf4fdc4e3456c8c029bf7f32f3a9414841a0 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,14 @@ PageLoadType GetPageLoadType(ui::PageTransition transition) {
|
| return LOAD_TYPE_NONE;
|
| }
|
|
|
| +enum FirstMeaningfulPaintStatus {
|
| + FMP_RECORDED,
|
| + FMP_BACKGROUNDED,
|
| + FMP_DID_NOT_REACH_NETWORK_STABLE,
|
| + FMP_USER_INTERACTION_BEFORE_FMP,
|
| + FMP_LAST_ENTRY
|
| +};
|
| +
|
| } // namespace
|
|
|
| namespace internal {
|
| @@ -99,6 +107,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[] =
|
| @@ -107,6 +119,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";
|
| @@ -161,11 +175,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 +191,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 +236,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 +332,35 @@ 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_) {
|
| + 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,
|
| + FMP_RECORDED, FMP_LAST_ENTRY);
|
| + } else {
|
| + UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
|
| + FMP_BACKGROUNDED, FMP_LAST_ENTRY);
|
| + }
|
| + } else {
|
| + UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus,
|
| + FMP_USER_INTERACTION_BEFORE_FMP, FMP_LAST_ENTRY);
|
| + }
|
| +}
|
| +
|
| void CorePageLoadMetricsObserver::OnParseStart(
|
| const page_load_metrics::PageLoadTiming& timing,
|
| const page_load_metrics::PageLoadExtraInfo& info) {
|
| @@ -396,6 +446,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 +489,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_LAST_ENTRY);
|
| + }
|
| }
|
|
|
| void CorePageLoadMetricsObserver::RecordRappor(
|
|
|