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 4cdc73f92eb24c8bb6258533f2fccfd523006ca1..4d370224e48a8738d99baa149b6692af7939cc24 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 |
| +}; |
| + |
| } // namespace |
| namespace internal { |
| @@ -99,6 +106,10 @@ const char kHistogramFirstContentfulPaint[] = |
| "PageLoad.PaintTiming.NavigationToFirstContentfulPaint"; |
| const char kBackgroundHistogramFirstContentfulPaint[] = |
| "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Background"; |
| +const char kHistogramFirstMeaningfulPaint[] = |
| + "PageLoad.PaintTiming.NavigationToFirstMeaningfulPaint"; |
|
Bryan McQuade
2016/08/03 21:44:58
given that these are currently experimental, I'm i
Kunihiko Sakamoto
2016/08/04 01:47:36
Yeah it's a nice idea, thanks.
Done.
|
| +const char kBackgroundHistogramFirstMeaningfulPaint[] = |
| + "PageLoad.PaintTiming.NavigationToFirstMeaningfulPaint.Background"; |
|
Bryan McQuade
2016/08/03 21:44:58
same experimental here?
Kunihiko Sakamoto
2016/08/04 01:47:36
Done.
|
| const char kHistogramParseStartToFirstContentfulPaint[] = |
| "PageLoad.PaintTiming.ParseStartToFirstContentfulPaint"; |
| const char kBackgroundHistogramParseStartToFirstContentfulPaint[] = |
| @@ -107,6 +118,10 @@ const char kHistogramParseStart[] = |
| "PageLoad.ParseTiming.NavigationToParseStart"; |
| const char kBackgroundHistogramParseStart[] = |
| "PageLoad.ParseTiming.NavigationToParseStart.Background"; |
| +const char kHistogramFirstMeaningfulPaintToNetworkStable[] = |
| + "PageLoad.PaintTiming.FirstMeaningfulPaintToNetworkStable"; |
| +const char kBackgroundHistogramFirstMeaningfulPaintToNetworkStable[] = |
| + "PageLoad.PaintTiming.FirstMeaningfulPaintToNetworkStable.Background"; |
| const char kHistogramParseDuration[] = "PageLoad.ParseTiming.ParseDuration"; |
| const char kBackgroundHistogramParseDuration[] = |
| "PageLoad.ParseTiming.ParseDuration.Background"; |
| @@ -161,11 +176,15 @@ const char kHistogramForegroundToFirstPaint[] = |
| const char kRapporMetricsNameCoarseTiming[] = |
| "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint"; |
| +const char kHistogramFirstMeaningfulPaintStatus[] = |
| + "PageLoad.PaintTiming.FirstMeaningfulPaintStatus"; |
|
Bryan McQuade
2016/08/03 21:44:58
experimental
Kunihiko Sakamoto
2016/08/04 01:47:36
Done.
|
| + |
| } // 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 +192,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 +237,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 +333,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 +449,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 +492,11 @@ void CorePageLoadMetricsObserver::RecordTimingHistograms( |
| PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstForeground, |
| info.first_foreground_time.value()); |
| } |
| + |
| + if (!timing.first_meaningful_paint) { |
|
Bryan McQuade
2016/08/03 21:44:58
let's only record this if we actually got a first_
Kunihiko Sakamoto
2016/08/04 01:47:36
Done.
|
| + UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus, |
| + FMP_DID_NOT_REACH_NETWORK_STABLE, FMP_ENUM_MAX); |
| + } |
| } |
| void CorePageLoadMetricsObserver::RecordRappor( |