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 |
67 MetricsWebContentsObserver::MetricsWebContentsObserver( | 68 MetricsWebContentsObserver::MetricsWebContentsObserver( |
68 content::WebContents* web_contents, | 69 content::WebContents* web_contents, |
69 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) | 70 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) |
70 : content::WebContentsObserver(web_contents), | 71 : content::WebContentsObserver(web_contents), |
71 in_foreground_(false), | 72 in_foreground_(false), |
72 embedder_interface_(std::move(embedder_interface)), | 73 embedder_interface_(std::move(embedder_interface)), |
73 has_navigated_(false) { | 74 has_navigated_(false) { |
74 RegisterInputEventObserver(web_contents->GetRenderViewHost()); | 75 RegisterInputEventObserver(web_contents->GetRenderViewHost()); |
75 } | 76 } |
76 | 77 |
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(); | |
98 } | 95 } |
99 | 96 |
100 void MetricsWebContentsObserver::RegisterInputEventObserver( | 97 void MetricsWebContentsObserver::RegisterInputEventObserver( |
101 content::RenderViewHost* host) { | 98 content::RenderViewHost* host) { |
102 if (host != nullptr) | 99 if (host != nullptr) |
103 host->GetWidget()->AddInputEventObserver(this); | 100 host->GetWidget()->AddInputEventObserver(this); |
104 } | 101 } |
105 | 102 |
106 void MetricsWebContentsObserver::UnregisterInputEventObserver( | 103 void MetricsWebContentsObserver::UnregisterInputEventObserver( |
107 content::RenderViewHost* host) { | 104 content::RenderViewHost* host) { |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 if (render_frame_host->GetParent() != nullptr) { | 572 if (render_frame_host->GetParent() != nullptr) { |
576 // Child frames may send PageLoadMetadata updates, but not PageLoadTiming | 573 // Child frames may send PageLoadMetadata updates, but not PageLoadTiming |
577 // updates. | 574 // updates. |
578 if (!timing.IsEmpty()) | 575 if (!timing.IsEmpty()) |
579 RecordInternalError(ERR_TIMING_IPC_FROM_SUBFRAME); | 576 RecordInternalError(ERR_TIMING_IPC_FROM_SUBFRAME); |
580 committed_load_->UpdateChildFrameMetadata(metadata); | 577 committed_load_->UpdateChildFrameMetadata(metadata); |
581 return; | 578 return; |
582 } | 579 } |
583 | 580 |
584 committed_load_->UpdateTiming(timing, metadata); | 581 committed_load_->UpdateTiming(timing, metadata); |
585 | |
586 for (auto& observer : testing_observers_) | |
587 observer.OnTimingUpdated(timing, metadata); | |
588 } | 582 } |
589 | 583 |
590 bool MetricsWebContentsObserver::ShouldTrackNavigation( | 584 bool MetricsWebContentsObserver::ShouldTrackNavigation( |
591 content::NavigationHandle* navigation_handle) const { | 585 content::NavigationHandle* navigation_handle) const { |
592 DCHECK(navigation_handle->IsInMainFrame()); | 586 DCHECK(navigation_handle->IsInMainFrame()); |
593 DCHECK(!navigation_handle->HasCommitted() || | 587 DCHECK(!navigation_handle->HasCommitted() || |
594 !navigation_handle->IsSameDocument()); | 588 !navigation_handle->IsSameDocument()); |
595 | 589 |
596 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), | 590 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), |
597 navigation_handle).ShouldTrack(); | 591 navigation_handle).ShouldTrack(); |
598 } | 592 } |
599 | 593 |
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 | |
628 } // namespace page_load_metrics | 594 } // namespace page_load_metrics |
OLD | NEW |