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 eb81d4042bdfd64439d6d3e0216e29b2518f2a35..958c65d3663a8520ccc55032b439045b8105b980 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 { |
| @@ -154,6 +161,10 @@ const char kHistogramFirstContentfulPaintImmediate[] = |
| "PageLoad.PaintTiming.NavigationToFirstContentfulPaint"; |
| const char kBackgroundHistogramFirstContentfulPaintImmediate[] = |
| "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Background"; |
| +const char kHistogramFirstMeaningfulPaintImmediate[] = |
| + "PageLoad.PaintTiming.NavigationToFirstMeaningfulPaint"; |
| +const char kBackgroundHistogramFirstMeaningfulPaintImmediate[] = |
| + "PageLoad.PaintTiming.NavigationToFirstMeaningfulPaint.Background"; |
| const char kHistogramParseStartToFirstContentfulPaintImmediate[] = |
| "PageLoad.PaintTiming.ParseStartToFirstContentfulPaint"; |
| const char kBackgroundHistogramParseStartToFirstContentfulPaintImmediate[] = |
| @@ -162,6 +173,10 @@ const char kHistogramParseStartImmediate[] = |
| "PageLoad.ParseTiming.NavigationToParseStart"; |
| const char kBackgroundHistogramParseStartImmediate[] = |
| "PageLoad.ParseTiming.NavigationToParseStart.Background"; |
| +const char kHistogramFirstMeaningfulPaintToNetworkStable[] = |
| + "PageLoad.PaintTiming.FirstMeaningfulPaintToNetworkStable"; |
| +const char kBackgroundHistogramFirstMeaningfulPaintToNetworkStable[] = |
| + "PageLoad.PaintTiming.FirstMeaningfulPaintToNetworkStable.Background"; |
| const char kHistogramParseDurationImmediate[] = |
| "PageLoad.ParseTiming.ParseDuration"; |
| const char kBackgroundHistogramParseDurationImmediate[] = |
| @@ -218,6 +233,9 @@ const char kHistogramForegroundToFirstPaint[] = |
| const char kRapporMetricsNameCoarseTiming[] = |
| "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint"; |
| +const char kHistogramFirstMeaningfulPaintStatus[] = |
| + "PageLoad.PaintTiming.FirstMeaningfulPaintStatus"; |
| + |
| } // namespace internal |
| CorePageLoadMetricsObserver::CorePageLoadMetricsObserver() |
| @@ -356,6 +374,35 @@ void CorePageLoadMetricsObserver::OnFirstContentfulPaint( |
| } |
| } |
| +void CorePageLoadMetricsObserver::OnFirstMeaningfulPaint( |
| + const page_load_metrics::PageLoadTiming& timing, |
| + const page_load_metrics::PageLoadExtraInfo& info) { |
| + base::Time stamp = |
|
Bryan McQuade
2016/07/29 15:02:26
Ah, we need to get rid of the base::Time for navig
Kunihiko Sakamoto
2016/08/01 08:52:07
Done.
|
| + timing.navigation_start + timing.first_meaningful_paint.value(); |
| + if (!first_user_interaction_time_ || stamp < first_user_interaction_time_) { |
|
Bryan McQuade
2016/07/29 15:02:26
I'm not sure I agree that FMP should only be recor
Kunihiko Sakamoto
2016/08/01 08:52:07
Since current implementation has fairly long layou
|
| + if (WasStartedInForegroundOptionalEventInForeground( |
| + timing.first_meaningful_paint, info)) { |
| + PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintImmediate, |
| + timing.first_meaningful_paint.value()); |
| + PAGE_LOAD_HISTOGRAM( |
| + internal::kHistogramFirstMeaningfulPaintToNetworkStable, |
| + base::Time::Now() - stamp); |
| + } else { |
| + PAGE_LOAD_HISTOGRAM( |
| + internal::kBackgroundHistogramFirstMeaningfulPaintImmediate, |
| + timing.first_meaningful_paint.value()); |
| + PAGE_LOAD_HISTOGRAM( |
| + internal::kBackgroundHistogramFirstMeaningfulPaintToNetworkStable, |
| + base::Time::Now() - stamp); |
| + } |
| + 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) { |
| @@ -444,6 +491,14 @@ void CorePageLoadMetricsObserver::OnFailedProvisionalLoad( |
| } |
| } |
| +void CorePageLoadMetricsObserver::OnUserInput( |
| + const blink::WebInputEvent& event) { |
| + if (!first_user_interaction_time_ && |
| + event.type != blink::WebInputEvent::MouseMove) { |
| + first_user_interaction_time_ = base::Time::Now(); |
|
Bryan McQuade
2016/07/29 15:02:26
same - I'm hoping we can remove this, but we shoul
Kunihiko Sakamoto
2016/08/01 08:52:06
Done.
|
| + } |
| +} |
| + |
| void CorePageLoadMetricsObserver::RecordTimingHistograms( |
| const page_load_metrics::PageLoadTiming& timing, |
| const page_load_metrics::PageLoadExtraInfo& info) { |
| @@ -621,6 +676,11 @@ void CorePageLoadMetricsObserver::RecordTimingHistograms( |
| PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstForeground, |
| info.first_foreground_time.value()); |
| } |
| + |
| + if (!timing.first_meaningful_paint) { |
| + UMA_HISTOGRAM_ENUMERATION(internal::kHistogramFirstMeaningfulPaintStatus, |
| + FMP_DID_NOT_REACH_NETWORK_STABLE, FMP_ENUM_MAX); |
| + } |
| } |
| void CorePageLoadMetricsObserver::RecordRappor( |