| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/page_load_metrics/browser/metrics_web_contents_observer.h" | 5 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <utility> |
| 9 | 10 |
| 10 #include "base/location.h" | 11 #include "base/location.h" |
| 11 #include "base/logging.h" | 12 #include "base/logging.h" |
| 12 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 13 #include "base/metrics/user_metrics.h" | 14 #include "base/metrics/user_metrics.h" |
| 14 #include "components/page_load_metrics/browser/page_load_metrics_util.h" | 15 #include "components/page_load_metrics/browser/page_load_metrics_util.h" |
| 15 #include "components/page_load_metrics/common/page_load_metrics_messages.h" | 16 #include "components/page_load_metrics/common/page_load_metrics_messages.h" |
| 16 #include "components/page_load_metrics/common/page_load_timing.h" | 17 #include "components/page_load_metrics/common/page_load_timing.h" |
| 17 #include "components/rappor/rappor_service.h" | 18 #include "components/rappor/rappor_service.h" |
| 18 #include "components/rappor/rappor_utils.h" | 19 #include "components/rappor/rappor_utils.h" |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 sample->SetStringField( | 407 sample->SetStringField( |
| 407 "Domain", rappor::GetDomainAndRegistrySampleFromGURL(committed_url())); | 408 "Domain", rappor::GetDomainAndRegistrySampleFromGURL(committed_url())); |
| 408 uint64_t bucket_index = RapporHistogramBucketIndex(first_contentful_paint); | 409 uint64_t bucket_index = RapporHistogramBucketIndex(first_contentful_paint); |
| 409 sample->SetFlagsField("Bucket", uint64_t(1) << bucket_index, | 410 sample->SetFlagsField("Bucket", uint64_t(1) << bucket_index, |
| 410 kNumRapporHistogramBuckets); | 411 kNumRapporHistogramBuckets); |
| 411 // The IsSlow flag is just a one bit boolean if the first contentful paint | 412 // The IsSlow flag is just a one bit boolean if the first contentful paint |
| 412 // was > 10s. | 413 // was > 10s. |
| 413 sample->SetFlagsField("IsSlow", first_contentful_paint.InSecondsF() >= 10, | 414 sample->SetFlagsField("IsSlow", first_contentful_paint.InSecondsF() >= 10, |
| 414 1); | 415 1); |
| 415 rappor_service->RecordSampleObj(kRapporMetricsNameCoarseTiming, | 416 rappor_service->RecordSampleObj(kRapporMetricsNameCoarseTiming, |
| 416 sample.Pass()); | 417 std::move(sample)); |
| 417 } | 418 } |
| 418 } | 419 } |
| 419 | 420 |
| 420 // static | 421 // static |
| 421 MetricsWebContentsObserver::MetricsWebContentsObserver( | 422 MetricsWebContentsObserver::MetricsWebContentsObserver( |
| 422 content::WebContents* web_contents, | 423 content::WebContents* web_contents, |
| 423 scoped_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) | 424 scoped_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) |
| 424 : content::WebContentsObserver(web_contents), | 425 : content::WebContentsObserver(web_contents), |
| 425 in_foreground_(false), | 426 in_foreground_(false), |
| 426 embedder_interface_(embedder_interface.Pass()) {} | 427 embedder_interface_(std::move(embedder_interface)) {} |
| 427 | 428 |
| 428 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( | 429 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
| 429 content::WebContents* web_contents, | 430 content::WebContents* web_contents, |
| 430 scoped_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { | 431 scoped_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { |
| 431 DCHECK(web_contents); | 432 DCHECK(web_contents); |
| 432 | 433 |
| 433 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); | 434 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); |
| 434 if (!metrics) { | 435 if (!metrics) { |
| 435 metrics = | 436 metrics = new MetricsWebContentsObserver(web_contents, |
| 436 new MetricsWebContentsObserver(web_contents, embedder_interface.Pass()); | 437 std::move(embedder_interface)); |
| 437 web_contents->SetUserData(UserDataKey(), metrics); | 438 web_contents->SetUserData(UserDataKey(), metrics); |
| 438 } | 439 } |
| 439 return metrics; | 440 return metrics; |
| 440 } | 441 } |
| 441 | 442 |
| 442 MetricsWebContentsObserver::~MetricsWebContentsObserver() { | 443 MetricsWebContentsObserver::~MetricsWebContentsObserver() { |
| 443 NotifyAbortAllLoads(ABORT_CLOSE); | 444 NotifyAbortAllLoads(ABORT_CLOSE); |
| 444 } | 445 } |
| 445 | 446 |
| 446 bool MetricsWebContentsObserver::OnMessageReceived( | 447 bool MetricsWebContentsObserver::OnMessageReceived( |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 | 515 |
| 515 // Notify other loads that they may have been aborted by this committed load. | 516 // Notify other loads that they may have been aborted by this committed load. |
| 516 // Note that by using the committed navigation start as the abort cause, we | 517 // Note that by using the committed navigation start as the abort cause, we |
| 517 // lose data on provisional loads that were aborted by other provisional | 518 // lose data on provisional loads that were aborted by other provisional |
| 518 // loads. Those will either be listed as ABORT_OTHER or as being aborted by | 519 // loads. Those will either be listed as ABORT_OTHER or as being aborted by |
| 519 // this load. | 520 // this load. |
| 520 NotifyAbortAllLoadsWithTimestamp( | 521 NotifyAbortAllLoadsWithTimestamp( |
| 521 AbortTypeForPageTransition(navigation_handle->GetPageTransition()), | 522 AbortTypeForPageTransition(navigation_handle->GetPageTransition()), |
| 522 navigation_handle->NavigationStart()); | 523 navigation_handle->NavigationStart()); |
| 523 | 524 |
| 524 committed_load_ = finished_nav.Pass(); | 525 committed_load_ = std::move(finished_nav); |
| 525 aborted_provisional_loads_.clear(); | 526 aborted_provisional_loads_.clear(); |
| 526 | 527 |
| 527 const GURL& browser_url = web_contents()->GetLastCommittedURL(); | 528 const GURL& browser_url = web_contents()->GetLastCommittedURL(); |
| 528 const std::string& mime_type = web_contents()->GetContentsMimeType(); | 529 const std::string& mime_type = web_contents()->GetContentsMimeType(); |
| 529 DCHECK(!browser_url.is_empty()); | 530 DCHECK(!browser_url.is_empty()); |
| 530 DCHECK(!mime_type.empty()); | 531 DCHECK(!mime_type.empty()); |
| 531 committed_load_->set_renderer_tracked( | 532 committed_load_->set_renderer_tracked( |
| 532 IsRelevantNavigation(navigation_handle, browser_url, mime_type)); | 533 IsRelevantNavigation(navigation_handle, browser_url, mime_type)); |
| 533 | 534 |
| 534 committed_load_->Commit(navigation_handle); | 535 committed_load_->Commit(navigation_handle); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 | 643 |
| 643 if (!committed_load_->UpdateTiming(timing)) { | 644 if (!committed_load_->UpdateTiming(timing)) { |
| 644 // If the page load tracker cannot update its timing, something is wrong | 645 // If the page load tracker cannot update its timing, something is wrong |
| 645 // with the IPC (it's from another load, or it's invalid in some other way). | 646 // with the IPC (it's from another load, or it's invalid in some other way). |
| 646 // We expect this to be a rare occurrence. | 647 // We expect this to be a rare occurrence. |
| 647 RecordInternalError(ERR_BAD_TIMING_IPC); | 648 RecordInternalError(ERR_BAD_TIMING_IPC); |
| 648 } | 649 } |
| 649 } | 650 } |
| 650 | 651 |
| 651 } // namespace page_load_metrics | 652 } // namespace page_load_metrics |
| OLD | NEW |