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

Side by Side Diff: chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc

Issue 2880323003: Various cleaups for AMP page load metrics. (Closed)
Patch Set: address comments Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/page_load_metrics/observers/amp_page_load_metrics_obser ver.h" 5 #include "chrome/browser/page_load_metrics/observers/amp_page_load_metrics_obser ver.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/optional.h" 9 #include "base/optional.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/time/time.h" 11 #include "base/time/time.h"
12 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" 12 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
13 #include "chrome/common/page_load_metrics/page_load_timing.h" 13 #include "chrome/common/page_load_metrics/page_load_timing.h"
14 #include "components/google/core/browser/google_util.h" 14 #include "components/google/core/browser/google_util.h"
15 #include "content/public/browser/navigation_handle.h" 15 #include "content/public/browser/navigation_handle.h"
16 #include "url/gurl.h" 16 #include "url/gurl.h"
17 17
18 namespace { 18 namespace {
19 19
20 using AMPViewType = AMPPageLoadMetricsObserver::AMPViewType;
21
22 #define RECORD_HISTOGRAM_FOR_TYPE(name, amp_view_type, value) \
RyanSturm 2017/05/16 16:12:22 Slight nit: This macro is defined before kHistogr
Bryan McQuade 2017/05/16 17:29:20 Done
23 do { \
24 PAGE_LOAD_HISTOGRAM(std::string(kHistogramPrefix).append(name), value); \
25 switch (amp_view_type) { \
26 case AMPViewType::AMP_CACHE: \
27 PAGE_LOAD_HISTOGRAM( \
28 std::string(kHistogramPrefix).append("AmpCache.").append(name), \
29 value); \
30 break; \
31 case AMPViewType::GOOGLE_SEARCH_AMP_VIEWER: \
32 PAGE_LOAD_HISTOGRAM(std::string(kHistogramPrefix) \
33 .append("GoogleSearch.") \
34 .append(name), \
35 value); \
36 break; \
37 case AMPViewType::GOOGLE_NEWS_AMP_VIEWER: \
38 PAGE_LOAD_HISTOGRAM( \
39 std::string(kHistogramPrefix).append("GoogleNews.").append(name), \
40 value); \
41 break; \
42 case AMPViewType::NONE: \
43 NOTREACHED(); \
44 break; \
45 } \
46 } while (false)
47
48 const char kHistogramPrefix[] = "PageLoad.Clients.AMP.";
49
20 const char kHistogramAMPDOMContentLoadedEventFired[] = 50 const char kHistogramAMPDOMContentLoadedEventFired[] =
21 "PageLoad.Clients.AMPCache2.DocumentTiming." 51 "DocumentTiming.NavigationToDOMContentLoadedEventFired";
22 "NavigationToDOMContentLoadedEventFired";
23 const char kHistogramAMPFirstLayout[] = 52 const char kHistogramAMPFirstLayout[] =
24 "PageLoad.Clients.AMPCache2.DocumentTiming.NavigationToFirstLayout"; 53 "DocumentTiming.NavigationToFirstLayout";
25 const char kHistogramAMPLoadEventFired[] = 54 const char kHistogramAMPLoadEventFired[] =
26 "PageLoad.Clients.AMPCache2.DocumentTiming.NavigationToLoadEventFired"; 55 "DocumentTiming.NavigationToLoadEventFired";
27 const char kHistogramAMPFirstContentfulPaint[] = 56 const char kHistogramAMPFirstContentfulPaint[] =
28 "PageLoad.Clients.AMPCache2.PaintTiming." 57 "PaintTiming.NavigationToFirstContentfulPaint";
29 "NavigationToFirstContentfulPaint"; 58 const char kHistogramAMPParseStart[] = "ParseTiming.NavigationToParseStart";
30 const char kHistogramAMPParseStart[] =
31 "PageLoad.Clients.AMPCache2.ParseTiming.NavigationToParseStart";
32 59
33 // Host pattern for AMP Cache URLs. 60 // Host pattern for AMP Cache URLs.
34 // See https://developers.google.com/amp/cache/overview#amp-cache-url-format 61 // See https://developers.google.com/amp/cache/overview#amp-cache-url-format
35 // for a definition of the format of AMP Cache URLs. 62 // for a definition of the format of AMP Cache URLs.
36 const char kAmpCacheHost[] = "cdn.ampproject.org"; 63 const char kAmpCacheHostSuffix[] = "cdn.ampproject.org";
37
38 // Pattern for the path of Google AMP Viewer URLs.
39 const char kGoogleAmpViewerPathPattern[] = "/amp/";
40
41 bool IsAMPCacheURL(const GURL& url) {
42 return url.host() == kAmpCacheHost ||
43 (google_util::IsGoogleDomainUrl(
44 url, google_util::DISALLOW_SUBDOMAIN,
45 google_util::DISALLOW_NON_STANDARD_PORTS) &&
46 base::StartsWith(url.path(), kGoogleAmpViewerPathPattern,
47 base::CompareCase::SENSITIVE));
48 }
49 64
50 } // namespace 65 } // namespace
51 66
52 AMPPageLoadMetricsObserver::AMPPageLoadMetricsObserver() {} 67 AMPPageLoadMetricsObserver::AMPPageLoadMetricsObserver() {}
53 68
54 AMPPageLoadMetricsObserver::~AMPPageLoadMetricsObserver() {} 69 AMPPageLoadMetricsObserver::~AMPPageLoadMetricsObserver() {}
55 70
56 page_load_metrics::PageLoadMetricsObserver::ObservePolicy 71 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
57 AMPPageLoadMetricsObserver::OnCommit( 72 AMPPageLoadMetricsObserver::OnCommit(
58 content::NavigationHandle* navigation_handle) { 73 content::NavigationHandle* navigation_handle) {
59 return IsAMPCacheURL(navigation_handle->GetURL()) ? CONTINUE_OBSERVING 74 view_type_ = GetAMPViewType(navigation_handle->GetURL());
60 : STOP_OBSERVING; 75 return (view_type_ != AMPViewType::NONE) ? CONTINUE_OBSERVING
76 : STOP_OBSERVING;
61 } 77 }
62 78
63 void AMPPageLoadMetricsObserver::OnDomContentLoadedEventStart( 79 void AMPPageLoadMetricsObserver::OnDomContentLoadedEventStart(
64 const page_load_metrics::PageLoadTiming& timing, 80 const page_load_metrics::PageLoadTiming& timing,
65 const page_load_metrics::PageLoadExtraInfo& info) { 81 const page_load_metrics::PageLoadExtraInfo& info) {
66 if (!WasStartedInForegroundOptionalEventInForeground( 82 if (!WasStartedInForegroundOptionalEventInForeground(
67 timing.document_timing.dom_content_loaded_event_start, info)) { 83 timing.document_timing.dom_content_loaded_event_start, info)) {
68 return; 84 return;
69 } 85 }
70 PAGE_LOAD_HISTOGRAM( 86 RECORD_HISTOGRAM_FOR_TYPE(
71 kHistogramAMPDOMContentLoadedEventFired, 87 kHistogramAMPDOMContentLoadedEventFired, view_type_,
72 timing.document_timing.dom_content_loaded_event_start.value()); 88 timing.document_timing.dom_content_loaded_event_start.value());
73 } 89 }
74 90
75 void AMPPageLoadMetricsObserver::OnLoadEventStart( 91 void AMPPageLoadMetricsObserver::OnLoadEventStart(
76 const page_load_metrics::PageLoadTiming& timing, 92 const page_load_metrics::PageLoadTiming& timing,
77 const page_load_metrics::PageLoadExtraInfo& info) { 93 const page_load_metrics::PageLoadExtraInfo& info) {
78 if (!WasStartedInForegroundOptionalEventInForeground( 94 if (!WasStartedInForegroundOptionalEventInForeground(
79 timing.document_timing.load_event_start, info)) { 95 timing.document_timing.load_event_start, info)) {
80 return; 96 return;
81 } 97 }
82 PAGE_LOAD_HISTOGRAM(kHistogramAMPLoadEventFired, 98 RECORD_HISTOGRAM_FOR_TYPE(kHistogramAMPLoadEventFired, view_type_,
83 timing.document_timing.load_event_start.value()); 99 timing.document_timing.load_event_start.value());
84 } 100 }
85 101
86 void AMPPageLoadMetricsObserver::OnFirstLayout( 102 void AMPPageLoadMetricsObserver::OnFirstLayout(
87 const page_load_metrics::PageLoadTiming& timing, 103 const page_load_metrics::PageLoadTiming& timing,
88 const page_load_metrics::PageLoadExtraInfo& info) { 104 const page_load_metrics::PageLoadExtraInfo& info) {
89 if (!WasStartedInForegroundOptionalEventInForeground( 105 if (!WasStartedInForegroundOptionalEventInForeground(
90 timing.document_timing.first_layout, info)) { 106 timing.document_timing.first_layout, info)) {
91 return; 107 return;
92 } 108 }
93 PAGE_LOAD_HISTOGRAM(kHistogramAMPFirstLayout, 109 RECORD_HISTOGRAM_FOR_TYPE(kHistogramAMPFirstLayout, view_type_,
94 timing.document_timing.first_layout.value()); 110 timing.document_timing.first_layout.value());
95 } 111 }
96 112
97 void AMPPageLoadMetricsObserver::OnFirstContentfulPaintInPage( 113 void AMPPageLoadMetricsObserver::OnFirstContentfulPaintInPage(
98 const page_load_metrics::PageLoadTiming& timing, 114 const page_load_metrics::PageLoadTiming& timing,
99 const page_load_metrics::PageLoadExtraInfo& info) { 115 const page_load_metrics::PageLoadExtraInfo& info) {
100 if (!WasStartedInForegroundOptionalEventInForeground( 116 if (!WasStartedInForegroundOptionalEventInForeground(
101 timing.paint_timing.first_contentful_paint, info)) { 117 timing.paint_timing.first_contentful_paint, info)) {
102 return; 118 return;
103 } 119 }
104 PAGE_LOAD_HISTOGRAM(kHistogramAMPFirstContentfulPaint, 120 RECORD_HISTOGRAM_FOR_TYPE(kHistogramAMPFirstContentfulPaint, view_type_,
105 timing.paint_timing.first_contentful_paint.value()); 121 timing.paint_timing.first_contentful_paint.value());
106 } 122 }
107 123
108 void AMPPageLoadMetricsObserver::OnParseStart( 124 void AMPPageLoadMetricsObserver::OnParseStart(
109 const page_load_metrics::PageLoadTiming& timing, 125 const page_load_metrics::PageLoadTiming& timing,
110 const page_load_metrics::PageLoadExtraInfo& info) { 126 const page_load_metrics::PageLoadExtraInfo& info) {
111 if (!WasStartedInForegroundOptionalEventInForeground( 127 if (!WasStartedInForegroundOptionalEventInForeground(
112 timing.parse_timing.parse_start, info)) { 128 timing.parse_timing.parse_start, info)) {
113 return; 129 return;
114 } 130 }
115 PAGE_LOAD_HISTOGRAM(kHistogramAMPParseStart, 131 RECORD_HISTOGRAM_FOR_TYPE(kHistogramAMPParseStart, view_type_,
116 timing.parse_timing.parse_start.value()); 132 timing.parse_timing.parse_start.value());
117 } 133 }
134
135 // static
136 AMPPageLoadMetricsObserver::AMPViewType
137 AMPPageLoadMetricsObserver::GetAMPViewType(const GURL& url) {
138 if (base::EndsWith(url.host(), kAmpCacheHostSuffix,
139 base::CompareCase::INSENSITIVE_ASCII)) {
140 return AMPViewType::AMP_CACHE;
141 }
142
143 base::Optional<std::string> google_hostname_prefix =
144 page_load_metrics::GetGoogleHostnamePrefix(url);
145 if (!google_hostname_prefix.has_value())
146 return AMPViewType::NONE;
147
148 if (google_hostname_prefix.value() == "www" &&
149 base::StartsWith(url.path_piece(), "/amp/",
150 base::CompareCase::SENSITIVE)) {
151 return AMPViewType::GOOGLE_SEARCH_AMP_VIEWER;
152 }
153
154 if (google_hostname_prefix.value() == "news" &&
155 url.path_piece() == "/news/amp") {
156 return AMPViewType::GOOGLE_NEWS_AMP_VIEWER;
157 }
158 return AMPViewType::NONE;
159 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698