Chromium Code Reviews| 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( |