| OLD | NEW |
| 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/data_reduction_proxy_metric
s_observer.h" | 5 #include "chrome/browser/page_load_metrics/observers/data_reduction_proxy_metric
s_observer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/optional.h" | 9 #include "base/optional.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 bool ShouldRecordHistogram(const DataReductionProxyData* data, | 31 bool ShouldRecordHistogram(const DataReductionProxyData* data, |
| 32 const base::Optional<base::TimeDelta>& event, | 32 const base::Optional<base::TimeDelta>& event, |
| 33 const page_load_metrics::PageLoadExtraInfo& info) { | 33 const page_load_metrics::PageLoadExtraInfo& info) { |
| 34 return data && data->used_data_reduction_proxy() && | 34 return data && data->used_data_reduction_proxy() && |
| 35 WasStartedInForegroundOptionalEventInForeground(event, info); | 35 WasStartedInForegroundOptionalEventInForeground(event, info); |
| 36 } | 36 } |
| 37 | 37 |
| 38 // A macro is needed because PAGE_LOAD_HISTOGRAM creates a static instance of | 38 // A macro is needed because PAGE_LOAD_HISTOGRAM creates a static instance of |
| 39 // the histogram. A distinct histogram is needed for each place that calls | 39 // the histogram. A distinct histogram is needed for each place that calls |
| 40 // RECORD_HISTOGRAMS_FOR_SUFFIX. | 40 // RECORD_HISTOGRAMS_FOR_SUFFIX. |event| is the timing event representing when |
| 41 #define RECORD_HISTOGRAMS_FOR_SUFFIX(data, event, info, histogram_suffix) \ | 41 // |value| became available. |
| 42 #define RECORD_HISTOGRAMS_FOR_SUFFIX(data, event, value, info, \ |
| 43 histogram_suffix) \ |
| 42 do { \ | 44 do { \ |
| 43 if (ShouldRecordHistogram(data.get(), event, info)) { \ | 45 if (ShouldRecordHistogram(data.get(), event, info)) { \ |
| 44 PAGE_LOAD_HISTOGRAM( \ | 46 PAGE_LOAD_HISTOGRAM( \ |
| 45 std::string(internal::kHistogramDataReductionProxyPrefix) \ | 47 std::string(internal::kHistogramDataReductionProxyPrefix) \ |
| 46 .append(histogram_suffix), \ | 48 .append(histogram_suffix), \ |
| 47 event.value()); \ | 49 value); \ |
| 48 if (data->lofi_requested()) { \ | 50 if (data->lofi_requested()) { \ |
| 49 PAGE_LOAD_HISTOGRAM( \ | 51 PAGE_LOAD_HISTOGRAM( \ |
| 50 std::string(internal::kHistogramDataReductionProxyLoFiOnPrefix) \ | 52 std::string(internal::kHistogramDataReductionProxyLoFiOnPrefix) \ |
| 51 .append(histogram_suffix), \ | 53 .append(histogram_suffix), \ |
| 52 event.value()); \ | 54 value); \ |
| 53 } \ | 55 } \ |
| 54 } \ | 56 } \ |
| 55 } while (false) | 57 } while (false) |
| 56 | 58 |
| 57 } // namespace | 59 } // namespace |
| 58 | 60 |
| 59 namespace internal { | 61 namespace internal { |
| 60 | 62 |
| 61 const char kHistogramDataReductionProxyPrefix[] = | 63 const char kHistogramDataReductionProxyPrefix[] = |
| 62 "PageLoad.Clients.DataReductionProxy."; | 64 "PageLoad.Clients.DataReductionProxy."; |
| 63 const char kHistogramDataReductionProxyLoFiOnPrefix[] = | 65 const char kHistogramDataReductionProxyLoFiOnPrefix[] = |
| 64 "PageLoad.Clients.DataReductionProxy.LoFiOn."; | 66 "PageLoad.Clients.DataReductionProxy.LoFiOn."; |
| 65 const char kHistogramDOMContentLoadedEventFiredSuffix[] = | 67 const char kHistogramDOMContentLoadedEventFiredSuffix[] = |
| 66 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; | 68 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; |
| 67 const char kHistogramFirstLayoutSuffix[] = | 69 const char kHistogramFirstLayoutSuffix[] = |
| 68 "DocumentTiming.NavigationToFirstLayout"; | 70 "DocumentTiming.NavigationToFirstLayout"; |
| 69 const char kHistogramLoadEventFiredSuffix[] = | 71 const char kHistogramLoadEventFiredSuffix[] = |
| 70 "DocumentTiming.NavigationToLoadEventFired"; | 72 "DocumentTiming.NavigationToLoadEventFired"; |
| 71 const char kHistogramFirstContentfulPaintSuffix[] = | 73 const char kHistogramFirstContentfulPaintSuffix[] = |
| 72 "PaintTiming.NavigationToFirstContentfulPaint"; | 74 "PaintTiming.NavigationToFirstContentfulPaint"; |
| 73 const char kHistogramFirstImagePaintSuffix[] = | 75 const char kHistogramFirstImagePaintSuffix[] = |
| 74 "PaintTiming.NavigationToFirstImagePaint"; | 76 "PaintTiming.NavigationToFirstImagePaint"; |
| 75 const char kHistogramFirstPaintSuffix[] = "PaintTiming.NavigationToFirstPaint"; | 77 const char kHistogramFirstPaintSuffix[] = "PaintTiming.NavigationToFirstPaint"; |
| 76 const char kHistogramFirstTextPaintSuffix[] = | 78 const char kHistogramFirstTextPaintSuffix[] = |
| 77 "PaintTiming.NavigationToFirstTextPaint"; | 79 "PaintTiming.NavigationToFirstTextPaint"; |
| 78 const char kHistogramParseStartSuffix[] = "ParseTiming.NavigationToParseStart"; | 80 const char kHistogramParseStartSuffix[] = "ParseTiming.NavigationToParseStart"; |
| 81 const char kHistogramParseBlockedOnScriptLoadSuffix[] = |
| 82 "ParseTiming.ParseBlockedOnScriptLoad"; |
| 83 const char kHistogramParseDurationSuffix[] = "ParseTiming.ParseDuration"; |
| 79 | 84 |
| 80 } // namespace internal | 85 } // namespace internal |
| 81 | 86 |
| 82 DataReductionProxyMetricsObserver::DataReductionProxyMetricsObserver() | 87 DataReductionProxyMetricsObserver::DataReductionProxyMetricsObserver() |
| 83 : browser_context_(nullptr) {} | 88 : browser_context_(nullptr) {} |
| 84 | 89 |
| 85 DataReductionProxyMetricsObserver::~DataReductionProxyMetricsObserver() {} | 90 DataReductionProxyMetricsObserver::~DataReductionProxyMetricsObserver() {} |
| 86 | 91 |
| 87 // Check if the NavigationData indicates anything about the DataReductionProxy. | 92 // Check if the NavigationData indicates anything about the DataReductionProxy. |
| 88 void DataReductionProxyMetricsObserver::OnCommit( | 93 void DataReductionProxyMetricsObserver::OnCommit( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || | 129 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || |
| 125 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { | 130 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { |
| 126 return; | 131 return; |
| 127 } | 132 } |
| 128 // Only consider timing events that happened before the first background | 133 // Only consider timing events that happened before the first background |
| 129 // event. | 134 // event. |
| 130 base::Optional<base::TimeDelta> response_start; | 135 base::Optional<base::TimeDelta> response_start; |
| 131 base::Optional<base::TimeDelta> load_event_start; | 136 base::Optional<base::TimeDelta> load_event_start; |
| 132 base::Optional<base::TimeDelta> first_image_paint; | 137 base::Optional<base::TimeDelta> first_image_paint; |
| 133 base::Optional<base::TimeDelta> first_contentful_paint; | 138 base::Optional<base::TimeDelta> first_contentful_paint; |
| 139 base::Optional<base::TimeDelta> parse_blocked_on_script_load_duration; |
| 140 base::Optional<base::TimeDelta> parse_stop; |
| 134 if (WasStartedInForegroundOptionalEventInForeground(timing.response_start, | 141 if (WasStartedInForegroundOptionalEventInForeground(timing.response_start, |
| 135 info)) { | 142 info)) { |
| 136 response_start = timing.response_start; | 143 response_start = timing.response_start; |
| 137 } | 144 } |
| 138 if (WasStartedInForegroundOptionalEventInForeground(timing.load_event_start, | 145 if (WasStartedInForegroundOptionalEventInForeground(timing.load_event_start, |
| 139 info)) { | 146 info)) { |
| 140 load_event_start = timing.load_event_start; | 147 load_event_start = timing.load_event_start; |
| 141 } | 148 } |
| 142 if (WasStartedInForegroundOptionalEventInForeground(timing.first_image_paint, | 149 if (WasStartedInForegroundOptionalEventInForeground(timing.first_image_paint, |
| 143 info)) { | 150 info)) { |
| 144 first_image_paint = timing.first_image_paint; | 151 first_image_paint = timing.first_image_paint; |
| 145 } | 152 } |
| 146 if (WasStartedInForegroundOptionalEventInForeground( | 153 if (WasStartedInForegroundOptionalEventInForeground( |
| 147 timing.first_contentful_paint, info)) { | 154 timing.first_contentful_paint, info)) { |
| 148 first_contentful_paint = timing.first_contentful_paint; | 155 first_contentful_paint = timing.first_contentful_paint; |
| 149 } | 156 } |
| 157 if (WasStartedInForegroundOptionalEventInForeground( |
| 158 timing.parse_blocked_on_script_load_duration, info)) { |
| 159 parse_blocked_on_script_load_duration = |
| 160 timing.parse_blocked_on_script_load_duration; |
| 161 } |
| 162 if (WasStartedInForegroundOptionalEventInForeground(timing.parse_stop, |
| 163 info)) { |
| 164 parse_stop = timing.parse_stop; |
| 165 } |
| 166 |
| 150 DataReductionProxyPageLoadTiming data_reduction_proxy_timing( | 167 DataReductionProxyPageLoadTiming data_reduction_proxy_timing( |
| 151 timing.navigation_start, response_start, load_event_start, | 168 timing.navigation_start, response_start, load_event_start, |
| 152 first_image_paint, first_contentful_paint); | 169 first_image_paint, first_contentful_paint, |
| 170 parse_blocked_on_script_load_duration, parse_stop); |
| 153 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); | 171 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); |
| 154 } | 172 } |
| 155 | 173 |
| 156 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( | 174 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( |
| 157 const page_load_metrics::PageLoadTiming& timing, | 175 const page_load_metrics::PageLoadTiming& timing, |
| 158 const page_load_metrics::PageLoadExtraInfo& info) { | 176 const page_load_metrics::PageLoadExtraInfo& info) { |
| 159 RECORD_HISTOGRAMS_FOR_SUFFIX( | 177 RECORD_HISTOGRAMS_FOR_SUFFIX( |
| 160 data_, timing.dom_content_loaded_event_start, info, | 178 data_, timing.dom_content_loaded_event_start, |
| 179 timing.dom_content_loaded_event_start.value(), info, |
| 161 internal::kHistogramDOMContentLoadedEventFiredSuffix); | 180 internal::kHistogramDOMContentLoadedEventFiredSuffix); |
| 162 } | 181 } |
| 163 | 182 |
| 164 void DataReductionProxyMetricsObserver::OnLoadEventStart( | 183 void DataReductionProxyMetricsObserver::OnLoadEventStart( |
| 165 const page_load_metrics::PageLoadTiming& timing, | 184 const page_load_metrics::PageLoadTiming& timing, |
| 166 const page_load_metrics::PageLoadExtraInfo& info) { | 185 const page_load_metrics::PageLoadExtraInfo& info) { |
| 167 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.load_event_start, info, | 186 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.load_event_start, |
| 187 timing.load_event_start.value(), info, |
| 168 internal::kHistogramLoadEventFiredSuffix); | 188 internal::kHistogramLoadEventFiredSuffix); |
| 169 } | 189 } |
| 170 | 190 |
| 171 void DataReductionProxyMetricsObserver::OnFirstLayout( | 191 void DataReductionProxyMetricsObserver::OnFirstLayout( |
| 172 const page_load_metrics::PageLoadTiming& timing, | 192 const page_load_metrics::PageLoadTiming& timing, |
| 173 const page_load_metrics::PageLoadExtraInfo& info) { | 193 const page_load_metrics::PageLoadExtraInfo& info) { |
| 174 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_layout, info, | 194 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_layout, |
| 195 timing.first_layout.value(), info, |
| 175 internal::kHistogramFirstLayoutSuffix); | 196 internal::kHistogramFirstLayoutSuffix); |
| 176 } | 197 } |
| 177 | 198 |
| 178 void DataReductionProxyMetricsObserver::OnFirstPaint( | 199 void DataReductionProxyMetricsObserver::OnFirstPaint( |
| 179 const page_load_metrics::PageLoadTiming& timing, | 200 const page_load_metrics::PageLoadTiming& timing, |
| 180 const page_load_metrics::PageLoadExtraInfo& info) { | 201 const page_load_metrics::PageLoadExtraInfo& info) { |
| 181 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_paint, info, | 202 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_paint, |
| 203 timing.first_paint.value(), info, |
| 182 internal::kHistogramFirstPaintSuffix); | 204 internal::kHistogramFirstPaintSuffix); |
| 183 } | 205 } |
| 184 | 206 |
| 185 void DataReductionProxyMetricsObserver::OnFirstTextPaint( | 207 void DataReductionProxyMetricsObserver::OnFirstTextPaint( |
| 186 const page_load_metrics::PageLoadTiming& timing, | 208 const page_load_metrics::PageLoadTiming& timing, |
| 187 const page_load_metrics::PageLoadExtraInfo& info) { | 209 const page_load_metrics::PageLoadExtraInfo& info) { |
| 188 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_text_paint, info, | 210 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_text_paint, |
| 211 timing.first_text_paint.value(), info, |
| 189 internal::kHistogramFirstTextPaintSuffix); | 212 internal::kHistogramFirstTextPaintSuffix); |
| 190 } | 213 } |
| 191 | 214 |
| 192 void DataReductionProxyMetricsObserver::OnFirstImagePaint( | 215 void DataReductionProxyMetricsObserver::OnFirstImagePaint( |
| 193 const page_load_metrics::PageLoadTiming& timing, | 216 const page_load_metrics::PageLoadTiming& timing, |
| 194 const page_load_metrics::PageLoadExtraInfo& info) { | 217 const page_load_metrics::PageLoadExtraInfo& info) { |
| 195 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_image_paint, info, | 218 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_image_paint, |
| 219 timing.first_image_paint.value(), info, |
| 196 internal::kHistogramFirstImagePaintSuffix); | 220 internal::kHistogramFirstImagePaintSuffix); |
| 197 } | 221 } |
| 198 | 222 |
| 199 void DataReductionProxyMetricsObserver::OnFirstContentfulPaint( | 223 void DataReductionProxyMetricsObserver::OnFirstContentfulPaint( |
| 200 const page_load_metrics::PageLoadTiming& timing, | 224 const page_load_metrics::PageLoadTiming& timing, |
| 201 const page_load_metrics::PageLoadExtraInfo& info) { | 225 const page_load_metrics::PageLoadExtraInfo& info) { |
| 202 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_contentful_paint, info, | 226 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_contentful_paint, |
| 227 timing.first_contentful_paint.value(), info, |
| 203 internal::kHistogramFirstContentfulPaintSuffix); | 228 internal::kHistogramFirstContentfulPaintSuffix); |
| 204 } | 229 } |
| 205 | 230 |
| 206 void DataReductionProxyMetricsObserver::OnParseStart( | 231 void DataReductionProxyMetricsObserver::OnParseStart( |
| 207 const page_load_metrics::PageLoadTiming& timing, | 232 const page_load_metrics::PageLoadTiming& timing, |
| 208 const page_load_metrics::PageLoadExtraInfo& info) { | 233 const page_load_metrics::PageLoadExtraInfo& info) { |
| 209 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_start, info, | 234 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_start, |
| 235 timing.parse_start.value(), info, |
| 210 internal::kHistogramParseStartSuffix); | 236 internal::kHistogramParseStartSuffix); |
| 211 } | 237 } |
| 212 | 238 |
| 239 void DataReductionProxyMetricsObserver::OnParseStop( |
| 240 const page_load_metrics::PageLoadTiming& timing, |
| 241 const page_load_metrics::PageLoadExtraInfo& info) { |
| 242 base::TimeDelta parse_duration = |
| 243 timing.parse_stop.value() - timing.parse_start.value(); |
| 244 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_stop, parse_duration, info, |
| 245 internal::kHistogramParseDurationSuffix); |
| 246 RECORD_HISTOGRAMS_FOR_SUFFIX( |
| 247 data_, timing.parse_stop, |
| 248 timing.parse_blocked_on_script_load_duration.value(), info, |
| 249 internal::kHistogramParseBlockedOnScriptLoadSuffix); |
| 250 } |
| 251 |
| 213 DataReductionProxyPingbackClient* | 252 DataReductionProxyPingbackClient* |
| 214 DataReductionProxyMetricsObserver::GetPingbackClient() const { | 253 DataReductionProxyMetricsObserver::GetPingbackClient() const { |
| 215 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( | 254 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( |
| 216 browser_context_) | 255 browser_context_) |
| 217 ->data_reduction_proxy_service() | 256 ->data_reduction_proxy_service() |
| 218 ->pingback_client(); | 257 ->pingback_client(); |
| 219 } | 258 } |
| 220 | 259 |
| 221 } // namespace data_reduction_proxy | 260 } // namespace data_reduction_proxy |
| OLD | NEW |