| 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/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/optional.h" | 10 #include "base/optional.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 content::NavigationHandle* navigation_handle, | 159 content::NavigationHandle* navigation_handle, |
| 160 const GURL& currently_committed_url, | 160 const GURL& currently_committed_url, |
| 161 bool started_in_foreground) { | 161 bool started_in_foreground) { |
| 162 if (!started_in_foreground) | 162 if (!started_in_foreground) |
| 163 return STOP_OBSERVING; | 163 return STOP_OBSERVING; |
| 164 return CONTINUE_OBSERVING; | 164 return CONTINUE_OBSERVING; |
| 165 } | 165 } |
| 166 | 166 |
| 167 page_load_metrics::PageLoadMetricsObserver::ObservePolicy | 167 page_load_metrics::PageLoadMetricsObserver::ObservePolicy |
| 168 DataReductionProxyMetricsObserver::FlushMetricsOnAppEnterBackground( | 168 DataReductionProxyMetricsObserver::FlushMetricsOnAppEnterBackground( |
| 169 const page_load_metrics::PageLoadTiming& timing, | 169 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 170 const page_load_metrics::PageLoadExtraInfo& info) { | 170 const page_load_metrics::PageLoadExtraInfo& info) { |
| 171 // FlushMetricsOnAppEnterBackground is invoked on Android in cases where the | 171 // FlushMetricsOnAppEnterBackground is invoked on Android in cases where the |
| 172 // app is about to be backgrounded, as part of the Activity.onPause() | 172 // app is about to be backgrounded, as part of the Activity.onPause() |
| 173 // flow. After this method is invoked, Chrome may be killed without further | 173 // flow. After this method is invoked, Chrome may be killed without further |
| 174 // notification, so we send a pingback with data collected up to this point. | 174 // notification, so we send a pingback with data collected up to this point. |
| 175 if (info.did_commit) { | 175 if (info.did_commit) { |
| 176 RecordPageSizeUMA(); | 176 RecordPageSizeUMA(); |
| 177 SendPingback(timing, info, true /* app_background_occurred */); | 177 SendPingback(timing, info, true /* app_background_occurred */); |
| 178 } | 178 } |
| 179 return STOP_OBSERVING; | 179 return STOP_OBSERVING; |
| 180 } | 180 } |
| 181 | 181 |
| 182 void DataReductionProxyMetricsObserver::OnComplete( | 182 void DataReductionProxyMetricsObserver::OnComplete( |
| 183 const page_load_metrics::PageLoadTiming& timing, | 183 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 184 const page_load_metrics::PageLoadExtraInfo& info) { | 184 const page_load_metrics::PageLoadExtraInfo& info) { |
| 185 RecordPageSizeUMA(); | 185 RecordPageSizeUMA(); |
| 186 SendPingback(timing, info, false /* app_background_occurred */); | 186 SendPingback(timing, info, false /* app_background_occurred */); |
| 187 } | 187 } |
| 188 | 188 |
| 189 void DataReductionProxyMetricsObserver::RecordPageSizeUMA() const { | 189 void DataReductionProxyMetricsObserver::RecordPageSizeUMA() const { |
| 190 if (!data_) | 190 if (!data_) |
| 191 return; | 191 return; |
| 192 | 192 |
| 193 // If the first request didn't complete, don't record UMA. | 193 // If the first request didn't complete, don't record UMA. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 if (network_bytes_ <= original_network_bytes_) { | 263 if (network_bytes_ <= original_network_bytes_) { |
| 264 PAGE_BYTES_HISTOGRAM(GetConstHistogramWithSuffix(internal::kBytesSavings), | 264 PAGE_BYTES_HISTOGRAM(GetConstHistogramWithSuffix(internal::kBytesSavings), |
| 265 original_network_bytes_ - network_bytes_); | 265 original_network_bytes_ - network_bytes_); |
| 266 } else { | 266 } else { |
| 267 PAGE_BYTES_HISTOGRAM(GetConstHistogramWithSuffix(internal::kBytesInflation), | 267 PAGE_BYTES_HISTOGRAM(GetConstHistogramWithSuffix(internal::kBytesInflation), |
| 268 network_bytes_proxied_ - original_network_bytes_); | 268 network_bytes_proxied_ - original_network_bytes_); |
| 269 } | 269 } |
| 270 } | 270 } |
| 271 | 271 |
| 272 void DataReductionProxyMetricsObserver::SendPingback( | 272 void DataReductionProxyMetricsObserver::SendPingback( |
| 273 const page_load_metrics::PageLoadTiming& timing, | 273 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 274 const page_load_metrics::PageLoadExtraInfo& info, | 274 const page_load_metrics::PageLoadExtraInfo& info, |
| 275 bool app_background_occurred) { | 275 bool app_background_occurred) { |
| 276 // TODO(ryansturm): Move to OnFirstBackgroundEvent to handle some fast | 276 // TODO(ryansturm): Move to OnFirstBackgroundEvent to handle some fast |
| 277 // shutdown cases. crbug.com/618072 | 277 // shutdown cases. crbug.com/618072 |
| 278 if (!browser_context_ || !data_) | 278 if (!browser_context_ || !data_) |
| 279 return; | 279 return; |
| 280 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || | 280 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || |
| 281 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { | 281 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { |
| 282 return; | 282 return; |
| 283 } | 283 } |
| 284 // Only consider timing events that happened before the first background | 284 // Only consider timing events that happened before the first background |
| 285 // event. | 285 // event. |
| 286 base::Optional<base::TimeDelta> response_start; | 286 base::Optional<base::TimeDelta> response_start; |
| 287 base::Optional<base::TimeDelta> load_event_start; | 287 base::Optional<base::TimeDelta> load_event_start; |
| 288 base::Optional<base::TimeDelta> first_image_paint; | 288 base::Optional<base::TimeDelta> first_image_paint; |
| 289 base::Optional<base::TimeDelta> first_contentful_paint; | 289 base::Optional<base::TimeDelta> first_contentful_paint; |
| 290 base::Optional<base::TimeDelta> experimental_first_meaningful_paint; | 290 base::Optional<base::TimeDelta> experimental_first_meaningful_paint; |
| 291 base::Optional<base::TimeDelta> parse_blocked_on_script_load_duration; | 291 base::Optional<base::TimeDelta> parse_blocked_on_script_load_duration; |
| 292 base::Optional<base::TimeDelta> parse_stop; | 292 base::Optional<base::TimeDelta> parse_stop; |
| 293 if (WasStartedInForegroundOptionalEventInForeground(timing.response_start, | 293 if (WasStartedInForegroundOptionalEventInForeground(timing.response_start, |
| 294 info)) { | 294 info)) { |
| 295 response_start = timing.response_start; | 295 response_start = timing.response_start; |
| 296 } | 296 } |
| 297 if (WasStartedInForegroundOptionalEventInForeground( | 297 if (WasStartedInForegroundOptionalEventInForeground( |
| 298 timing.document_timing.load_event_start, info)) { | 298 timing.document_timing->load_event_start, info)) { |
| 299 load_event_start = timing.document_timing.load_event_start; | 299 load_event_start = timing.document_timing->load_event_start; |
| 300 } | 300 } |
| 301 if (WasStartedInForegroundOptionalEventInForeground( | 301 if (WasStartedInForegroundOptionalEventInForeground( |
| 302 timing.paint_timing.first_image_paint, info)) { | 302 timing.paint_timing->first_image_paint, info)) { |
| 303 first_image_paint = timing.paint_timing.first_image_paint; | 303 first_image_paint = timing.paint_timing->first_image_paint; |
| 304 } | 304 } |
| 305 if (WasStartedInForegroundOptionalEventInForeground( | 305 if (WasStartedInForegroundOptionalEventInForeground( |
| 306 timing.paint_timing.first_contentful_paint, info)) { | 306 timing.paint_timing->first_contentful_paint, info)) { |
| 307 first_contentful_paint = timing.paint_timing.first_contentful_paint; | 307 first_contentful_paint = timing.paint_timing->first_contentful_paint; |
| 308 } | 308 } |
| 309 if (WasStartedInForegroundOptionalEventInForeground( | 309 if (WasStartedInForegroundOptionalEventInForeground( |
| 310 timing.paint_timing.first_meaningful_paint, info)) { | 310 timing.paint_timing->first_meaningful_paint, info)) { |
| 311 experimental_first_meaningful_paint = | 311 experimental_first_meaningful_paint = |
| 312 timing.paint_timing.first_meaningful_paint; | 312 timing.paint_timing->first_meaningful_paint; |
| 313 } | 313 } |
| 314 if (WasStartedInForegroundOptionalEventInForeground( | 314 if (WasStartedInForegroundOptionalEventInForeground( |
| 315 timing.parse_timing.parse_blocked_on_script_load_duration, info)) { | 315 timing.parse_timing->parse_blocked_on_script_load_duration, info)) { |
| 316 parse_blocked_on_script_load_duration = | 316 parse_blocked_on_script_load_duration = |
| 317 timing.parse_timing.parse_blocked_on_script_load_duration; | 317 timing.parse_timing->parse_blocked_on_script_load_duration; |
| 318 } | 318 } |
| 319 if (WasStartedInForegroundOptionalEventInForeground( | 319 if (WasStartedInForegroundOptionalEventInForeground( |
| 320 timing.parse_timing.parse_stop, info)) { | 320 timing.parse_timing->parse_stop, info)) { |
| 321 parse_stop = timing.parse_timing.parse_stop; | 321 parse_stop = timing.parse_timing->parse_stop; |
| 322 } | 322 } |
| 323 | 323 |
| 324 DataReductionProxyPageLoadTiming data_reduction_proxy_timing( | 324 DataReductionProxyPageLoadTiming data_reduction_proxy_timing( |
| 325 timing.navigation_start, response_start, load_event_start, | 325 timing.navigation_start, response_start, load_event_start, |
| 326 first_image_paint, first_contentful_paint, | 326 first_image_paint, first_contentful_paint, |
| 327 experimental_first_meaningful_paint, | 327 experimental_first_meaningful_paint, |
| 328 parse_blocked_on_script_load_duration, parse_stop, network_bytes_, | 328 parse_blocked_on_script_load_duration, parse_stop, network_bytes_, |
| 329 original_network_bytes_, app_background_occurred); | 329 original_network_bytes_, app_background_occurred); |
| 330 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); | 330 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); |
| 331 } | 331 } |
| 332 | 332 |
| 333 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( | 333 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( |
| 334 const page_load_metrics::PageLoadTiming& timing, | 334 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 335 const page_load_metrics::PageLoadExtraInfo& info) { | 335 const page_load_metrics::PageLoadExtraInfo& info) { |
| 336 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 336 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 337 info, data_, timing.document_timing.dom_content_loaded_event_start, | 337 info, data_, timing.document_timing->dom_content_loaded_event_start, |
| 338 internal::kHistogramDOMContentLoadedEventFiredSuffix); | 338 internal::kHistogramDOMContentLoadedEventFiredSuffix); |
| 339 } | 339 } |
| 340 | 340 |
| 341 void DataReductionProxyMetricsObserver::OnLoadEventStart( | 341 void DataReductionProxyMetricsObserver::OnLoadEventStart( |
| 342 const page_load_metrics::PageLoadTiming& timing, | 342 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 343 const page_load_metrics::PageLoadExtraInfo& info) { | 343 const page_load_metrics::PageLoadExtraInfo& info) { |
| 344 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 344 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 345 info, data_, timing.document_timing.load_event_start, | 345 info, data_, timing.document_timing->load_event_start, |
| 346 internal::kHistogramLoadEventFiredSuffix); | 346 internal::kHistogramLoadEventFiredSuffix); |
| 347 } | 347 } |
| 348 | 348 |
| 349 void DataReductionProxyMetricsObserver::OnFirstLayout( | 349 void DataReductionProxyMetricsObserver::OnFirstLayout( |
| 350 const page_load_metrics::PageLoadTiming& timing, | 350 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 351 const page_load_metrics::PageLoadExtraInfo& info) { | 351 const page_load_metrics::PageLoadExtraInfo& info) { |
| 352 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 352 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 353 info, data_, timing.document_timing.first_layout, | 353 info, data_, timing.document_timing->first_layout, |
| 354 internal::kHistogramFirstLayoutSuffix); | 354 internal::kHistogramFirstLayoutSuffix); |
| 355 } | 355 } |
| 356 | 356 |
| 357 void DataReductionProxyMetricsObserver::OnFirstPaintInPage( | 357 void DataReductionProxyMetricsObserver::OnFirstPaintInPage( |
| 358 const page_load_metrics::PageLoadTiming& timing, | 358 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 359 const page_load_metrics::PageLoadExtraInfo& info) { | 359 const page_load_metrics::PageLoadExtraInfo& info) { |
| 360 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX(info, data_, | 360 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX(info, data_, |
| 361 timing.paint_timing.first_paint, | 361 timing.paint_timing->first_paint, |
| 362 internal::kHistogramFirstPaintSuffix); | 362 internal::kHistogramFirstPaintSuffix); |
| 363 } | 363 } |
| 364 | 364 |
| 365 void DataReductionProxyMetricsObserver::OnFirstTextPaintInPage( | 365 void DataReductionProxyMetricsObserver::OnFirstTextPaintInPage( |
| 366 const page_load_metrics::PageLoadTiming& timing, | 366 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 367 const page_load_metrics::PageLoadExtraInfo& info) { | 367 const page_load_metrics::PageLoadExtraInfo& info) { |
| 368 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 368 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 369 info, data_, timing.paint_timing.first_text_paint, | 369 info, data_, timing.paint_timing->first_text_paint, |
| 370 internal::kHistogramFirstTextPaintSuffix); | 370 internal::kHistogramFirstTextPaintSuffix); |
| 371 } | 371 } |
| 372 | 372 |
| 373 void DataReductionProxyMetricsObserver::OnFirstImagePaintInPage( | 373 void DataReductionProxyMetricsObserver::OnFirstImagePaintInPage( |
| 374 const page_load_metrics::PageLoadTiming& timing, | 374 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 375 const page_load_metrics::PageLoadExtraInfo& info) { | 375 const page_load_metrics::PageLoadExtraInfo& info) { |
| 376 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 376 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 377 info, data_, timing.paint_timing.first_image_paint, | 377 info, data_, timing.paint_timing->first_image_paint, |
| 378 internal::kHistogramFirstImagePaintSuffix); | 378 internal::kHistogramFirstImagePaintSuffix); |
| 379 } | 379 } |
| 380 | 380 |
| 381 void DataReductionProxyMetricsObserver::OnFirstContentfulPaintInPage( | 381 void DataReductionProxyMetricsObserver::OnFirstContentfulPaintInPage( |
| 382 const page_load_metrics::PageLoadTiming& timing, | 382 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 383 const page_load_metrics::PageLoadExtraInfo& info) { | 383 const page_load_metrics::PageLoadExtraInfo& info) { |
| 384 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 384 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 385 info, data_, timing.paint_timing.first_contentful_paint, | 385 info, data_, timing.paint_timing->first_contentful_paint, |
| 386 internal::kHistogramFirstContentfulPaintSuffix); | 386 internal::kHistogramFirstContentfulPaintSuffix); |
| 387 } | 387 } |
| 388 | 388 |
| 389 void DataReductionProxyMetricsObserver:: | 389 void DataReductionProxyMetricsObserver:: |
| 390 OnFirstMeaningfulPaintInMainFrameDocument( | 390 OnFirstMeaningfulPaintInMainFrameDocument( |
| 391 const page_load_metrics::PageLoadTiming& timing, | 391 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 392 const page_load_metrics::PageLoadExtraInfo& info) { | 392 const page_load_metrics::PageLoadExtraInfo& info) { |
| 393 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( | 393 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX( |
| 394 info, data_, timing.paint_timing.first_meaningful_paint, | 394 info, data_, timing.paint_timing->first_meaningful_paint, |
| 395 internal::kHistogramFirstMeaningfulPaintSuffix); | 395 internal::kHistogramFirstMeaningfulPaintSuffix); |
| 396 } | 396 } |
| 397 | 397 |
| 398 void DataReductionProxyMetricsObserver::OnParseStart( | 398 void DataReductionProxyMetricsObserver::OnParseStart( |
| 399 const page_load_metrics::PageLoadTiming& timing, | 399 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 400 const page_load_metrics::PageLoadExtraInfo& info) { | 400 const page_load_metrics::PageLoadExtraInfo& info) { |
| 401 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX(info, data_, | 401 RECORD_FOREGROUND_HISTOGRAMS_FOR_SUFFIX(info, data_, |
| 402 timing.parse_timing.parse_start, | 402 timing.parse_timing->parse_start, |
| 403 internal::kHistogramParseStartSuffix); | 403 internal::kHistogramParseStartSuffix); |
| 404 } | 404 } |
| 405 | 405 |
| 406 void DataReductionProxyMetricsObserver::OnParseStop( | 406 void DataReductionProxyMetricsObserver::OnParseStop( |
| 407 const page_load_metrics::PageLoadTiming& timing, | 407 const page_load_metrics::mojom::PageLoadTiming& timing, |
| 408 const page_load_metrics::PageLoadExtraInfo& info) { | 408 const page_load_metrics::PageLoadExtraInfo& info) { |
| 409 if (!WasStartedInForegroundOptionalEventInForeground( | 409 if (!WasStartedInForegroundOptionalEventInForeground( |
| 410 timing.parse_timing.parse_stop, info)) | 410 timing.parse_timing->parse_stop, info)) |
| 411 return; | 411 return; |
| 412 | 412 |
| 413 base::TimeDelta parse_duration = timing.parse_timing.parse_stop.value() - | 413 base::TimeDelta parse_duration = timing.parse_timing->parse_stop.value() - |
| 414 timing.parse_timing.parse_start.value(); | 414 timing.parse_timing->parse_start.value(); |
| 415 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, parse_duration, | 415 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, parse_duration, |
| 416 internal::kHistogramParseDurationSuffix); | 416 internal::kHistogramParseDurationSuffix); |
| 417 RECORD_HISTOGRAMS_FOR_SUFFIX( | 417 RECORD_HISTOGRAMS_FOR_SUFFIX( |
| 418 data_, timing.parse_timing.parse_blocked_on_script_load_duration.value(), | 418 data_, timing.parse_timing->parse_blocked_on_script_load_duration.value(), |
| 419 internal::kHistogramParseBlockedOnScriptLoadSuffix); | 419 internal::kHistogramParseBlockedOnScriptLoadSuffix); |
| 420 } | 420 } |
| 421 | 421 |
| 422 void DataReductionProxyMetricsObserver::OnLoadedResource( | 422 void DataReductionProxyMetricsObserver::OnLoadedResource( |
| 423 const page_load_metrics::ExtraRequestCompleteInfo& | 423 const page_load_metrics::ExtraRequestCompleteInfo& |
| 424 extra_request_complete_info) { | 424 extra_request_complete_info) { |
| 425 if (extra_request_complete_info.data_reduction_proxy_data && | 425 if (extra_request_complete_info.data_reduction_proxy_data && |
| 426 extra_request_complete_info.data_reduction_proxy_data->lofi_received()) { | 426 extra_request_complete_info.data_reduction_proxy_data->lofi_received()) { |
| 427 data_->set_lofi_received(true); | 427 data_->set_lofi_received(true); |
| 428 } | 428 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 443 | 443 |
| 444 DataReductionProxyPingbackClient* | 444 DataReductionProxyPingbackClient* |
| 445 DataReductionProxyMetricsObserver::GetPingbackClient() const { | 445 DataReductionProxyMetricsObserver::GetPingbackClient() const { |
| 446 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( | 446 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( |
| 447 browser_context_) | 447 browser_context_) |
| 448 ->data_reduction_proxy_service() | 448 ->data_reduction_proxy_service() |
| 449 ->pingback_client(); | 449 ->pingback_client(); |
| 450 } | 450 } |
| 451 | 451 |
| 452 } // namespace data_reduction_proxy | 452 } // namespace data_reduction_proxy |
| OLD | NEW |