Chromium Code Reviews| 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 11 matching lines...) Expand all Loading... | |
| 22 #include "content/public/browser/browser_context.h" | 22 #include "content/public/browser/browser_context.h" |
| 23 #include "content/public/browser/navigation_data.h" | 23 #include "content/public/browser/navigation_data.h" |
| 24 #include "content/public/browser/navigation_handle.h" | 24 #include "content/public/browser/navigation_handle.h" |
| 25 #include "content/public/browser/web_contents.h" | 25 #include "content/public/browser/web_contents.h" |
| 26 #include "url/gurl.h" | 26 #include "url/gurl.h" |
| 27 | 27 |
| 28 namespace data_reduction_proxy { | 28 namespace data_reduction_proxy { |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 bool ShouldRecordHistogram(const DataReductionProxyData* data, | |
| 33 const base::Optional<base::TimeDelta>& event, | |
| 34 const page_load_metrics::PageLoadExtraInfo& info) { | |
| 35 return data && data->used_data_reduction_proxy() && | |
| 36 WasStartedInForegroundOptionalEventInForeground(event, info); | |
| 37 } | |
| 38 | |
| 39 // A macro is needed because PAGE_LOAD_HISTOGRAM creates a static instance of | 32 // A macro is needed because PAGE_LOAD_HISTOGRAM creates a static instance of |
| 40 // the histogram. A distinct histogram is needed for each place that calls | 33 // the histogram. A distinct histogram is needed for each place that calls |
| 41 // RECORD_HISTOGRAMS_FOR_SUFFIX. |event| is the timing event representing when | 34 // RECORD_HISTOGRAMS_FOR_SUFFIX. |event| is the timing event representing when |
| 42 // |value| became available. | 35 // |value| became available. |
| 43 #define RECORD_HISTOGRAMS_FOR_SUFFIX(data, event, value, info, \ | 36 #define RECORD_HISTOGRAMS_FOR_SUFFIX(data, value, histogram_suffix) \ |
| 44 histogram_suffix) \ | 37 do { \ |
| 45 do { \ | 38 PAGE_LOAD_HISTOGRAM( \ |
| 46 if (ShouldRecordHistogram(data.get(), event, info)) { \ | 39 std::string(internal::kHistogramDataReductionProxyPrefix) \ |
| 47 PAGE_LOAD_HISTOGRAM( \ | 40 .append(histogram_suffix), \ |
| 48 std::string(internal::kHistogramDataReductionProxyPrefix) \ | 41 value); \ |
| 49 .append(histogram_suffix), \ | 42 if (data->lofi_requested()) { \ |
| 50 value); \ | 43 PAGE_LOAD_HISTOGRAM( \ |
| 51 if (data->lofi_requested()) { \ | 44 std::string(internal::kHistogramDataReductionProxyLoFiOnPrefix) \ |
| 52 PAGE_LOAD_HISTOGRAM( \ | 45 .append(histogram_suffix), \ |
| 53 std::string(internal::kHistogramDataReductionProxyLoFiOnPrefix) \ | 46 value); \ |
| 54 .append(histogram_suffix), \ | 47 } \ |
| 55 value); \ | |
| 56 } \ | |
| 57 } \ | |
| 58 } while (false) | 48 } while (false) |
| 59 | 49 |
| 60 } // namespace | 50 } // namespace |
| 61 | 51 |
| 62 namespace internal { | 52 namespace internal { |
| 63 | 53 |
| 64 const char kHistogramDataReductionProxyPrefix[] = | 54 const char kHistogramDataReductionProxyPrefix[] = |
| 65 "PageLoad.Clients.DataReductionProxy."; | 55 "PageLoad.Clients.DataReductionProxy."; |
| 66 const char kHistogramDataReductionProxyLoFiOnPrefix[] = | 56 const char kHistogramDataReductionProxyLoFiOnPrefix[] = |
| 67 "PageLoad.Clients.DataReductionProxy.LoFiOn."; | 57 "PageLoad.Clients.DataReductionProxy.LoFiOn."; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 // ResourceDispatcherHostDelegate::GetNavigationData during commit. | 99 // ResourceDispatcherHostDelegate::GetNavigationData during commit. |
| 110 // Because ChromeResourceDispatcherHostDelegate always returns a | 100 // Because ChromeResourceDispatcherHostDelegate always returns a |
| 111 // ChromeNavigationData, it is safe to static_cast here. | 101 // ChromeNavigationData, it is safe to static_cast here. |
| 112 ChromeNavigationData* chrome_navigation_data = | 102 ChromeNavigationData* chrome_navigation_data = |
| 113 static_cast<ChromeNavigationData*>( | 103 static_cast<ChromeNavigationData*>( |
| 114 navigation_handle->GetNavigationData()); | 104 navigation_handle->GetNavigationData()); |
| 115 if (!chrome_navigation_data) | 105 if (!chrome_navigation_data) |
| 116 return STOP_OBSERVING; | 106 return STOP_OBSERVING; |
| 117 data_reduction_proxy::DataReductionProxyData* data = | 107 data_reduction_proxy::DataReductionProxyData* data = |
| 118 chrome_navigation_data->GetDataReductionProxyData(); | 108 chrome_navigation_data->GetDataReductionProxyData(); |
| 119 if (!data) | 109 if (!data || !data->used_data_reduction_proxy()) |
| 120 return STOP_OBSERVING; | 110 return STOP_OBSERVING; |
| 121 data_ = data->DeepCopy(); | 111 data_ = data->DeepCopy(); |
| 122 // DataReductionProxy page loads should only occur on HTTP navigations. | 112 // DataReductionProxy page loads should only occur on HTTP navigations. |
| 123 DCHECK(!data_->used_data_reduction_proxy() || | 113 DCHECK(!navigation_handle->GetURL().SchemeIsCryptographic()); |
| 124 !navigation_handle->GetURL().SchemeIsCryptographic()); | |
| 125 return CONTINUE_OBSERVING; | 114 return CONTINUE_OBSERVING; |
| 126 } | 115 } |
| 127 | 116 |
| 117 page_load_metrics::PageLoadMetricsObserver::ObservePolicy | |
|
Bryan McQuade
2016/11/04 22:42:56
great! we should also implement OnStart and return
RyanSturm
2016/11/04 22:54:06
Done.
| |
| 118 DataReductionProxyMetricsObserver::OnHidden( | |
| 119 const page_load_metrics::PageLoadTiming& timing, | |
| 120 const page_load_metrics::PageLoadExtraInfo& info) { | |
| 121 SendPingback(timing, info); | |
| 122 return STOP_OBSERVING; | |
| 123 } | |
| 124 | |
| 128 void DataReductionProxyMetricsObserver::OnComplete( | 125 void DataReductionProxyMetricsObserver::OnComplete( |
| 129 const page_load_metrics::PageLoadTiming& timing, | 126 const page_load_metrics::PageLoadTiming& timing, |
| 130 const page_load_metrics::PageLoadExtraInfo& info) { | 127 const page_load_metrics::PageLoadExtraInfo& info) { |
| 128 SendPingback(timing, info); | |
| 129 } | |
| 130 | |
| 131 void DataReductionProxyMetricsObserver::SendPingback( | |
| 132 const page_load_metrics::PageLoadTiming& timing, | |
| 133 const page_load_metrics::PageLoadExtraInfo& info) { | |
| 131 // TODO(ryansturm): Move to OnFirstBackgroundEvent to handle some fast | 134 // TODO(ryansturm): Move to OnFirstBackgroundEvent to handle some fast |
| 132 // shutdown cases. crbug.com/618072 | 135 // shutdown cases. crbug.com/618072 |
| 133 if (!browser_context_) | 136 if (!browser_context_) |
| 134 return; | 137 return; |
| 135 if (!data_ || !data_->used_data_reduction_proxy()) | |
| 136 return; | |
| 137 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || | 138 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || |
| 138 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { | 139 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { |
| 139 return; | 140 return; |
| 140 } | 141 } |
| 141 // Only consider timing events that happened before the first background | 142 // Only consider timing events that happened before the first background |
| 142 // event. | 143 // event. |
| 143 base::Optional<base::TimeDelta> response_start; | 144 base::Optional<base::TimeDelta> response_start; |
| 144 base::Optional<base::TimeDelta> load_event_start; | 145 base::Optional<base::TimeDelta> load_event_start; |
| 145 base::Optional<base::TimeDelta> first_image_paint; | 146 base::Optional<base::TimeDelta> first_image_paint; |
| 146 base::Optional<base::TimeDelta> first_contentful_paint; | 147 base::Optional<base::TimeDelta> first_contentful_paint; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 first_image_paint, first_contentful_paint, | 183 first_image_paint, first_contentful_paint, |
| 183 experimental_first_meaningful_paint, | 184 experimental_first_meaningful_paint, |
| 184 parse_blocked_on_script_load_duration, parse_stop); | 185 parse_blocked_on_script_load_duration, parse_stop); |
| 185 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); | 186 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); |
| 186 } | 187 } |
| 187 | 188 |
| 188 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( | 189 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( |
| 189 const page_load_metrics::PageLoadTiming& timing, | 190 const page_load_metrics::PageLoadTiming& timing, |
| 190 const page_load_metrics::PageLoadExtraInfo& info) { | 191 const page_load_metrics::PageLoadExtraInfo& info) { |
| 191 RECORD_HISTOGRAMS_FOR_SUFFIX( | 192 RECORD_HISTOGRAMS_FOR_SUFFIX( |
| 192 data_, timing.dom_content_loaded_event_start, | 193 data_, timing.dom_content_loaded_event_start.value(), |
| 193 timing.dom_content_loaded_event_start.value(), info, | |
| 194 internal::kHistogramDOMContentLoadedEventFiredSuffix); | 194 internal::kHistogramDOMContentLoadedEventFiredSuffix); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void DataReductionProxyMetricsObserver::OnLoadEventStart( | 197 void DataReductionProxyMetricsObserver::OnLoadEventStart( |
| 198 const page_load_metrics::PageLoadTiming& timing, | 198 const page_load_metrics::PageLoadTiming& timing, |
| 199 const page_load_metrics::PageLoadExtraInfo& info) { | 199 const page_load_metrics::PageLoadExtraInfo& info) { |
| 200 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.load_event_start, | 200 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.load_event_start.value(), |
| 201 timing.load_event_start.value(), info, | |
| 202 internal::kHistogramLoadEventFiredSuffix); | 201 internal::kHistogramLoadEventFiredSuffix); |
| 203 } | 202 } |
| 204 | 203 |
| 205 void DataReductionProxyMetricsObserver::OnFirstLayout( | 204 void DataReductionProxyMetricsObserver::OnFirstLayout( |
| 206 const page_load_metrics::PageLoadTiming& timing, | 205 const page_load_metrics::PageLoadTiming& timing, |
| 207 const page_load_metrics::PageLoadExtraInfo& info) { | 206 const page_load_metrics::PageLoadExtraInfo& info) { |
| 208 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_layout, | 207 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_layout.value(), |
| 209 timing.first_layout.value(), info, | |
| 210 internal::kHistogramFirstLayoutSuffix); | 208 internal::kHistogramFirstLayoutSuffix); |
| 211 } | 209 } |
| 212 | 210 |
| 213 void DataReductionProxyMetricsObserver::OnFirstPaint( | 211 void DataReductionProxyMetricsObserver::OnFirstPaint( |
| 214 const page_load_metrics::PageLoadTiming& timing, | 212 const page_load_metrics::PageLoadTiming& timing, |
| 215 const page_load_metrics::PageLoadExtraInfo& info) { | 213 const page_load_metrics::PageLoadExtraInfo& info) { |
| 216 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_paint, | 214 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_paint.value(), |
| 217 timing.first_paint.value(), info, | |
| 218 internal::kHistogramFirstPaintSuffix); | 215 internal::kHistogramFirstPaintSuffix); |
| 219 } | 216 } |
| 220 | 217 |
| 221 void DataReductionProxyMetricsObserver::OnFirstTextPaint( | 218 void DataReductionProxyMetricsObserver::OnFirstTextPaint( |
| 222 const page_load_metrics::PageLoadTiming& timing, | 219 const page_load_metrics::PageLoadTiming& timing, |
| 223 const page_load_metrics::PageLoadExtraInfo& info) { | 220 const page_load_metrics::PageLoadExtraInfo& info) { |
| 224 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_text_paint, | 221 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_text_paint.value(), |
| 225 timing.first_text_paint.value(), info, | |
| 226 internal::kHistogramFirstTextPaintSuffix); | 222 internal::kHistogramFirstTextPaintSuffix); |
| 227 } | 223 } |
| 228 | 224 |
| 229 void DataReductionProxyMetricsObserver::OnFirstImagePaint( | 225 void DataReductionProxyMetricsObserver::OnFirstImagePaint( |
| 230 const page_load_metrics::PageLoadTiming& timing, | 226 const page_load_metrics::PageLoadTiming& timing, |
| 231 const page_load_metrics::PageLoadExtraInfo& info) { | 227 const page_load_metrics::PageLoadExtraInfo& info) { |
| 232 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_image_paint, | 228 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_image_paint.value(), |
| 233 timing.first_image_paint.value(), info, | |
| 234 internal::kHistogramFirstImagePaintSuffix); | 229 internal::kHistogramFirstImagePaintSuffix); |
| 235 } | 230 } |
| 236 | 231 |
| 237 void DataReductionProxyMetricsObserver::OnFirstContentfulPaint( | 232 void DataReductionProxyMetricsObserver::OnFirstContentfulPaint( |
| 238 const page_load_metrics::PageLoadTiming& timing, | 233 const page_load_metrics::PageLoadTiming& timing, |
| 239 const page_load_metrics::PageLoadExtraInfo& info) { | 234 const page_load_metrics::PageLoadExtraInfo& info) { |
| 240 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_contentful_paint, | 235 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_contentful_paint.value(), |
| 241 timing.first_contentful_paint.value(), info, | |
| 242 internal::kHistogramFirstContentfulPaintSuffix); | 236 internal::kHistogramFirstContentfulPaintSuffix); |
| 243 } | 237 } |
| 244 | 238 |
| 245 void DataReductionProxyMetricsObserver::OnFirstMeaningfulPaint( | 239 void DataReductionProxyMetricsObserver::OnFirstMeaningfulPaint( |
| 246 const page_load_metrics::PageLoadTiming& timing, | 240 const page_load_metrics::PageLoadTiming& timing, |
| 247 const page_load_metrics::PageLoadExtraInfo& info) { | 241 const page_load_metrics::PageLoadExtraInfo& info) { |
| 248 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_meaningful_paint, | 242 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_meaningful_paint.value(), |
| 249 timing.first_meaningful_paint.value(), info, | |
| 250 internal::kHistogramFirstMeaningfulPaintSuffix); | 243 internal::kHistogramFirstMeaningfulPaintSuffix); |
| 251 } | 244 } |
| 252 | 245 |
| 253 void DataReductionProxyMetricsObserver::OnParseStart( | 246 void DataReductionProxyMetricsObserver::OnParseStart( |
| 254 const page_load_metrics::PageLoadTiming& timing, | 247 const page_load_metrics::PageLoadTiming& timing, |
| 255 const page_load_metrics::PageLoadExtraInfo& info) { | 248 const page_load_metrics::PageLoadExtraInfo& info) { |
| 256 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_start, | 249 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_start.value(), |
| 257 timing.parse_start.value(), info, | |
| 258 internal::kHistogramParseStartSuffix); | 250 internal::kHistogramParseStartSuffix); |
| 259 } | 251 } |
| 260 | 252 |
| 261 void DataReductionProxyMetricsObserver::OnParseStop( | 253 void DataReductionProxyMetricsObserver::OnParseStop( |
| 262 const page_load_metrics::PageLoadTiming& timing, | 254 const page_load_metrics::PageLoadTiming& timing, |
| 263 const page_load_metrics::PageLoadExtraInfo& info) { | 255 const page_load_metrics::PageLoadExtraInfo& info) { |
| 264 base::TimeDelta parse_duration = | 256 base::TimeDelta parse_duration = |
| 265 timing.parse_stop.value() - timing.parse_start.value(); | 257 timing.parse_stop.value() - timing.parse_start.value(); |
| 266 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_stop, parse_duration, info, | 258 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, parse_duration, |
| 267 internal::kHistogramParseDurationSuffix); | 259 internal::kHistogramParseDurationSuffix); |
| 268 RECORD_HISTOGRAMS_FOR_SUFFIX( | 260 RECORD_HISTOGRAMS_FOR_SUFFIX( |
| 269 data_, timing.parse_stop, | 261 data_, timing.parse_blocked_on_script_load_duration.value(), |
| 270 timing.parse_blocked_on_script_load_duration.value(), info, | |
| 271 internal::kHistogramParseBlockedOnScriptLoadSuffix); | 262 internal::kHistogramParseBlockedOnScriptLoadSuffix); |
| 272 } | 263 } |
| 273 | 264 |
| 274 DataReductionProxyPingbackClient* | 265 DataReductionProxyPingbackClient* |
| 275 DataReductionProxyMetricsObserver::GetPingbackClient() const { | 266 DataReductionProxyMetricsObserver::GetPingbackClient() const { |
| 276 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( | 267 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( |
| 277 browser_context_) | 268 browser_context_) |
| 278 ->data_reduction_proxy_service() | 269 ->data_reduction_proxy_service() |
| 279 ->pingback_client(); | 270 ->pingback_client(); |
| 280 } | 271 } |
| 281 | 272 |
| 282 } // namespace data_reduction_proxy | 273 } // namespace data_reduction_proxy |
| OLD | NEW |