Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(861)

Unified Diff: chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc

Issue 2744983002: [Page Load Metrics] Add page load metrics for omnibox. (Closed)
Patch Set: Addressed comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698