| 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 "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 5 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <ostream> | 8 #include <ostream> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 57 |
| 58 return UserInitiatedInfo::RenderInitiated( | 58 return UserInitiatedInfo::RenderInitiated( |
| 59 navigation_handle->HasUserGesture(), | 59 navigation_handle->HasUserGesture(), |
| 60 committed_load && | 60 committed_load && |
| 61 committed_load->input_tracker()->FindAndConsumeInputEventsBefore( | 61 committed_load->input_tracker()->FindAndConsumeInputEventsBefore( |
| 62 navigation_handle->NavigationStart())); | 62 navigation_handle->NavigationStart())); |
| 63 } | 63 } |
| 64 | 64 |
| 65 } // namespace | 65 } // namespace |
| 66 | 66 |
| 67 // static | |
| 68 MetricsWebContentsObserver::MetricsWebContentsObserver( | 67 MetricsWebContentsObserver::MetricsWebContentsObserver( |
| 69 content::WebContents* web_contents, | 68 content::WebContents* web_contents, |
| 70 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) | 69 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) |
| 71 : content::WebContentsObserver(web_contents), | 70 : content::WebContentsObserver(web_contents), |
| 72 in_foreground_(false), | 71 in_foreground_(false), |
| 73 embedder_interface_(std::move(embedder_interface)), | 72 embedder_interface_(std::move(embedder_interface)), |
| 74 has_navigated_(false) { | 73 has_navigated_(false) { |
| 75 RegisterInputEventObserver(web_contents->GetRenderViewHost()); | 74 RegisterInputEventObserver(web_contents->GetRenderViewHost()); |
| 76 } | 75 } |
| 77 | 76 |
| 77 // static |
| 78 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( | 78 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
| 79 content::WebContents* web_contents, | 79 content::WebContents* web_contents, |
| 80 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { | 80 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { |
| 81 DCHECK(web_contents); | 81 DCHECK(web_contents); |
| 82 | 82 |
| 83 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); | 83 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); |
| 84 if (!metrics) { | 84 if (!metrics) { |
| 85 metrics = new MetricsWebContentsObserver(web_contents, | 85 metrics = new MetricsWebContentsObserver(web_contents, |
| 86 std::move(embedder_interface)); | 86 std::move(embedder_interface)); |
| 87 web_contents->SetUserData(UserDataKey(), metrics); | 87 web_contents->SetUserData(UserDataKey(), metrics); |
| 88 } | 88 } |
| 89 return metrics; | 89 return metrics; |
| 90 } | 90 } |
| 91 | 91 |
| 92 MetricsWebContentsObserver::~MetricsWebContentsObserver() { | 92 MetricsWebContentsObserver::~MetricsWebContentsObserver() { |
| 93 // TODO(csharrison): Use a more user-initiated signal for CLOSE. | 93 // TODO(csharrison): Use a more user-initiated signal for CLOSE. |
| 94 NotifyPageEndAllLoads(END_CLOSE, UserInitiatedInfo::NotUserInitiated()); | 94 NotifyPageEndAllLoads(END_CLOSE, UserInitiatedInfo::NotUserInitiated()); |
| 95 |
| 96 for (auto& observer : testing_observers_) |
| 97 observer.OnGoingAway(); |
| 95 } | 98 } |
| 96 | 99 |
| 97 void MetricsWebContentsObserver::RegisterInputEventObserver( | 100 void MetricsWebContentsObserver::RegisterInputEventObserver( |
| 98 content::RenderViewHost* host) { | 101 content::RenderViewHost* host) { |
| 99 if (host != nullptr) | 102 if (host != nullptr) |
| 100 host->GetWidget()->AddInputEventObserver(this); | 103 host->GetWidget()->AddInputEventObserver(this); |
| 101 } | 104 } |
| 102 | 105 |
| 103 void MetricsWebContentsObserver::UnregisterInputEventObserver( | 106 void MetricsWebContentsObserver::UnregisterInputEventObserver( |
| 104 content::RenderViewHost* host) { | 107 content::RenderViewHost* host) { |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 if (render_frame_host->GetParent() != nullptr) { | 575 if (render_frame_host->GetParent() != nullptr) { |
| 573 // Child frames may send PageLoadMetadata updates, but not PageLoadTiming | 576 // Child frames may send PageLoadMetadata updates, but not PageLoadTiming |
| 574 // updates. | 577 // updates. |
| 575 if (!timing.IsEmpty()) | 578 if (!timing.IsEmpty()) |
| 576 RecordInternalError(ERR_TIMING_IPC_FROM_SUBFRAME); | 579 RecordInternalError(ERR_TIMING_IPC_FROM_SUBFRAME); |
| 577 committed_load_->UpdateChildFrameMetadata(metadata); | 580 committed_load_->UpdateChildFrameMetadata(metadata); |
| 578 return; | 581 return; |
| 579 } | 582 } |
| 580 | 583 |
| 581 committed_load_->UpdateTiming(timing, metadata); | 584 committed_load_->UpdateTiming(timing, metadata); |
| 585 |
| 586 for (auto& observer : testing_observers_) |
| 587 observer.OnTimingUpdated(timing, metadata); |
| 582 } | 588 } |
| 583 | 589 |
| 584 bool MetricsWebContentsObserver::ShouldTrackNavigation( | 590 bool MetricsWebContentsObserver::ShouldTrackNavigation( |
| 585 content::NavigationHandle* navigation_handle) const { | 591 content::NavigationHandle* navigation_handle) const { |
| 586 DCHECK(navigation_handle->IsInMainFrame()); | 592 DCHECK(navigation_handle->IsInMainFrame()); |
| 587 DCHECK(!navigation_handle->HasCommitted() || | 593 DCHECK(!navigation_handle->HasCommitted() || |
| 588 !navigation_handle->IsSameDocument()); | 594 !navigation_handle->IsSameDocument()); |
| 589 | 595 |
| 590 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), | 596 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), |
| 591 navigation_handle).ShouldTrack(); | 597 navigation_handle).ShouldTrack(); |
| 592 } | 598 } |
| 593 | 599 |
| 600 void MetricsWebContentsObserver::AddTestingObserver(TestingObserver* observer) { |
| 601 if (!testing_observers_.HasObserver(observer)) |
| 602 testing_observers_.AddObserver(observer); |
| 603 } |
| 604 |
| 605 void MetricsWebContentsObserver::RemoveTestingObserver( |
| 606 TestingObserver* observer) { |
| 607 testing_observers_.RemoveObserver(observer); |
| 608 } |
| 609 |
| 610 MetricsWebContentsObserver::TestingObserver::TestingObserver( |
| 611 content::WebContents* web_contents) |
| 612 : observer_(page_load_metrics::MetricsWebContentsObserver::FromWebContents( |
| 613 web_contents)) { |
| 614 observer_->AddTestingObserver(this); |
| 615 } |
| 616 |
| 617 MetricsWebContentsObserver::TestingObserver::~TestingObserver() { |
| 618 if (observer_) { |
| 619 observer_->RemoveTestingObserver(this); |
| 620 observer_ = nullptr; |
| 621 } |
| 622 } |
| 623 |
| 624 void MetricsWebContentsObserver::TestingObserver::OnGoingAway() { |
| 625 observer_ = nullptr; |
| 626 } |
| 627 |
| 594 } // namespace page_load_metrics | 628 } // namespace page_load_metrics |
| OLD | NEW |