Chromium Code Reviews| Index: chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc |
| diff --git a/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5057c7345d3db2bd3c7f702a043dc81d8c5583a9 |
| --- /dev/null |
| +++ b/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc |
| @@ -0,0 +1,117 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h" |
| + |
| +#include <algorithm> |
| + |
| +#include "chrome/browser/page_load_metrics/page_load_metrics_util.h" |
| + |
| +namespace { |
| + |
| +const char kSearchFirstContentfulPaint[] = |
| + "Omnibox.SuggestionUsed.Search.NavigationToFirstContentfulPaint"; |
| +const char kURLFirstContentfulPaint[] = |
| + "Omnibox.SuggestionUsed.URL.NavigationToFirstContentfulPaint"; |
| +const char kPrerenderSearchFirstContentfulPaint[] = |
| + "Omnibox.SuggestionUsed.Search.ForegroundToFirstContentfulPaint.Prerender"; |
| +const char kPrerenderURLFirstContentfulPaint[] = |
| + "Omnibox.SuggestionUsed.URL.ForegroundToFirstContentfulPaint.Prerender"; |
| + |
| +const char kSearchFirstMeaningfulPaint[] = |
| + "Omnibox.SuggestionUsed.Search.Experimental." |
| + "NavigationToFirstMeaningfulPaint"; |
| +const char kURLFirstMeaningfulPaint[] = |
| + "Omnibox.SuggestionUsed.URL.Experimental.NavigationToFirstMeaningfulPaint"; |
| +const char kPrerenderSearchFirstMeaningfulPaint[] = |
| + "Omnibox.SuggestionUsed.Search.Experimental." |
| + "ForegroundToFirstMeaningfulPaint.Prerender"; |
| +const char kPrerenderURLFirstMeaningfulPaint[] = |
| + "Omnibox.SuggestionUsed.URL.Experimental." |
| + "ForegroundToFirstMeaningfulPaint.Prerender"; |
| + |
| +const char kPrerenderSearchNavigationToFirstForeground[] = |
| + "Omnibox.SuggestionUsed.Search.NavigationToFirstForeground.Prerender"; |
| +const char kPrerenderURLNavigationToFirstForeground[] = |
| + "Omnibox.SuggestionUsed.URL.NavigationToFirstForeground.Prerender"; |
|
Mark P
2017/03/29 23:17:07
Is it expected that search and URL navigations to
lpy
2017/03/31 20:42:03
If I understand correctly, non-prerender means we
Bryan McQuade
2017/04/03 19:34:34
Navigation time is the time we start the prerender
Mark P
2017/04/03 23:19:15
Acknowledged.
|
| + |
| +} // namespace |
| + |
| +OmniboxSuggestionUsedMetricsObserver::OmniboxSuggestionUsedMetricsObserver( |
| + bool is_prerender) |
| + : is_prerender_(is_prerender) {} |
| + |
| +OmniboxSuggestionUsedMetricsObserver::~OmniboxSuggestionUsedMetricsObserver() {} |
| + |
| +page_load_metrics::PageLoadMetricsObserver::ObservePolicy |
| +OmniboxSuggestionUsedMetricsObserver::OnHidden( |
| + const page_load_metrics::PageLoadTiming& timing, |
| + const page_load_metrics::PageLoadExtraInfo& info) { |
| + return STOP_OBSERVING; |
| +} |
| + |
| +page_load_metrics::PageLoadMetricsObserver::ObservePolicy |
| +OmniboxSuggestionUsedMetricsObserver::OnCommit( |
| + content::NavigationHandle* navigation_handle) { |
| + transition_type_ = navigation_handle->GetPageTransition(); |
| + return (transition_type_ & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0 |
| + ? CONTINUE_OBSERVING |
| + : STOP_OBSERVING; |
| +} |
| + |
| +void OmniboxSuggestionUsedMetricsObserver::OnFirstContentfulPaint( |
| + const page_load_metrics::PageLoadTiming& timing, |
| + const page_load_metrics::PageLoadExtraInfo& info) { |
| + base::TimeDelta fcp = timing.first_contentful_paint.value(); |
| + |
| + if (info.started_in_foreground) { |
| + if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_GENERATED)) { |
| + PAGE_LOAD_HISTOGRAM(kSearchFirstContentfulPaint, fcp); |
| + } else if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_TYPED)) { |
| + PAGE_LOAD_HISTOGRAM(kURLFirstContentfulPaint, fcp); |
| + } |
| + } else if (is_prerender_ && info.first_foreground_time) { |
|
Mark P
2017/03/29 23:17:07
Are all prerenders started in the background, even
Mark P
2017/03/29 23:17:07
Why do you need to condition on info.first_foregro
lpy
2017/03/31 20:42:03
Bryan@, any idea about this question?
lpy
2017/03/31 20:42:03
If I understand correctly, since pages are not sup
Bryan McQuade
2017/04/03 19:34:34
Yes, this is my understanding - the WebContents ho
|
| + base::TimeDelta perceived_fcp = |
| + std::max(base::TimeDelta(), fcp - info.first_foreground_time.value()); |
|
Mark P
2017/03/29 23:17:07
optional:
This only makes sense to me if first_con
lpy
2017/03/31 20:42:03
Yes, they are both based on navigation start.
For
|
| + if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_GENERATED)) { |
| + PAGE_LOAD_HISTOGRAM(kPrerenderSearchFirstContentfulPaint, perceived_fcp); |
| + PAGE_LOAD_HISTOGRAM(kPrerenderSearchNavigationToFirstForeground, |
|
Mark P
2017/03/29 23:17:07
Is it safe to assume (as this code does) that all
lpy
2017/03/31 20:42:03
If I understand correctly, if we don't observe a f
Bryan McQuade
2017/04/03 19:34:34
Not all pages that are foregrounded will observe a
Mark P
2017/04/03 23:19:15
Thanks for the explanation. I don't think new com
|
| + info.first_foreground_time.value()); |
| + } else if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_TYPED)) { |
| + PAGE_LOAD_HISTOGRAM(kPrerenderURLFirstContentfulPaint, perceived_fcp); |
| + PAGE_LOAD_HISTOGRAM(kPrerenderURLNavigationToFirstForeground, |
| + info.first_foreground_time.value()); |
| + } |
| + } |
| +} |
| + |
| +void OmniboxSuggestionUsedMetricsObserver::OnFirstMeaningfulPaint( |
| + const page_load_metrics::PageLoadTiming& timing, |
| + const page_load_metrics::PageLoadExtraInfo& info) { |
| + base::TimeDelta fmp = timing.first_meaningful_paint.value(); |
| + |
| + if (info.started_in_foreground) { |
| + if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_GENERATED)) { |
| + PAGE_LOAD_HISTOGRAM(kSearchFirstMeaningfulPaint, fmp); |
| + } else if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_TYPED)) { |
| + PAGE_LOAD_HISTOGRAM(kURLFirstMeaningfulPaint, fmp); |
| + } |
| + } else if (is_prerender_ && info.first_foreground_time) { |
| + base::TimeDelta perceived_fmp = |
| + std::max(base::TimeDelta(), fmp - info.first_foreground_time.value()); |
| + if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_GENERATED)) { |
| + PAGE_LOAD_HISTOGRAM(kPrerenderSearchFirstMeaningfulPaint, perceived_fmp); |
| + } else if (ui::PageTransitionCoreTypeIs(transition_type_, |
| + ui::PAGE_TRANSITION_TYPED)) { |
| + PAGE_LOAD_HISTOGRAM(kPrerenderURLFirstMeaningfulPaint, perceived_fmp); |
| + } |
| + } |
| +} |