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> |
11 | 11 |
12 #include "base/feature_list.h" | |
13 #include "base/location.h" | 12 #include "base/location.h" |
14 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
15 #include "base/metrics/histogram_macros.h" | 14 #include "base/metrics/histogram_macros.h" |
16 #include "chrome/browser/page_load_metrics/browser_page_track_decider.h" | 15 #include "chrome/browser/page_load_metrics/browser_page_track_decider.h" |
17 #include "chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.
h" | 16 #include "chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.
h" |
18 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" | 17 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" |
19 #include "chrome/browser/page_load_metrics/page_load_tracker.h" | 18 #include "chrome/browser/page_load_metrics/page_load_tracker.h" |
20 #include "chrome/common/chrome_features.h" | |
21 #include "chrome/common/page_load_metrics/page_load_metrics_messages.h" | 19 #include "chrome/common/page_load_metrics/page_load_metrics_messages.h" |
22 #include "chrome/common/page_load_metrics/page_load_timing.h" | 20 #include "chrome/common/page_load_metrics/page_load_timing.h" |
23 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
24 #include "content/public/browser/global_request_id.h" | 22 #include "content/public/browser/global_request_id.h" |
25 #include "content/public/browser/navigation_details.h" | 23 #include "content/public/browser/navigation_details.h" |
26 #include "content/public/browser/navigation_handle.h" | 24 #include "content/public/browser/navigation_handle.h" |
27 #include "content/public/browser/render_frame_host.h" | 25 #include "content/public/browser/render_frame_host.h" |
28 #include "content/public/browser/render_view_host.h" | 26 #include "content/public/browser/render_view_host.h" |
29 #include "content/public/browser/web_contents.h" | 27 #include "content/public/browser/web_contents.h" |
30 #include "content/public/browser/web_contents_observer.h" | 28 #include "content/public/browser/web_contents_observer.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 } | 63 } |
66 | 64 |
67 } // namespace | 65 } // namespace |
68 | 66 |
69 MetricsWebContentsObserver::MetricsWebContentsObserver( | 67 MetricsWebContentsObserver::MetricsWebContentsObserver( |
70 content::WebContents* web_contents, | 68 content::WebContents* web_contents, |
71 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) | 69 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) |
72 : content::WebContentsObserver(web_contents), | 70 : content::WebContentsObserver(web_contents), |
73 in_foreground_(false), | 71 in_foreground_(false), |
74 embedder_interface_(std::move(embedder_interface)), | 72 embedder_interface_(std::move(embedder_interface)), |
75 has_navigated_(false), | 73 has_navigated_(false) { |
76 page_load_metrics_binding_(web_contents, this) { | |
77 RegisterInputEventObserver(web_contents->GetRenderViewHost()); | 74 RegisterInputEventObserver(web_contents->GetRenderViewHost()); |
78 } | 75 } |
79 | 76 |
80 // static | 77 // static |
81 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( | 78 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
82 content::WebContents* web_contents, | 79 content::WebContents* web_contents, |
83 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { | 80 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { |
84 DCHECK(web_contents); | 81 DCHECK(web_contents); |
85 | 82 |
86 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); | 83 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 video_type, render_frame_host == web_contents()->GetMainFrame()); | 130 video_type, render_frame_host == web_contents()->GetMainFrame()); |
134 } | 131 } |
135 | 132 |
136 bool MetricsWebContentsObserver::OnMessageReceived( | 133 bool MetricsWebContentsObserver::OnMessageReceived( |
137 const IPC::Message& message, | 134 const IPC::Message& message, |
138 content::RenderFrameHost* render_frame_host) { | 135 content::RenderFrameHost* render_frame_host) { |
139 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 136 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
140 bool handled = true; | 137 bool handled = true; |
141 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MetricsWebContentsObserver, message, | 138 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MetricsWebContentsObserver, message, |
142 render_frame_host) | 139 render_frame_host) |
143 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnUpdateTimingOverIPC) | 140 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) |
144 IPC_MESSAGE_UNHANDLED(handled = false) | 141 IPC_MESSAGE_UNHANDLED(handled = false) |
145 IPC_END_MESSAGE_MAP() | 142 IPC_END_MESSAGE_MAP() |
146 return handled; | 143 return handled; |
147 } | 144 } |
148 | 145 |
149 void MetricsWebContentsObserver::WillStartNavigationRequest( | 146 void MetricsWebContentsObserver::WillStartNavigationRequest( |
150 content::NavigationHandle* navigation_handle) { | 147 content::NavigationHandle* navigation_handle) { |
151 // Same-document navigations should never go through | 148 // Same-document navigations should never go through |
152 // WillStartNavigationRequest. | 149 // WillStartNavigationRequest. |
153 DCHECK(!navigation_handle->IsSameDocument()); | 150 DCHECK(!navigation_handle->IsSameDocument()); |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 if (is_main_frame) { | 610 if (is_main_frame) { |
614 committed_load_->UpdateTiming(timing, metadata); | 611 committed_load_->UpdateTiming(timing, metadata); |
615 } else { | 612 } else { |
616 committed_load_->UpdateSubFrameTiming(render_frame_host, timing, metadata); | 613 committed_load_->UpdateSubFrameTiming(render_frame_host, timing, metadata); |
617 } | 614 } |
618 | 615 |
619 for (auto& observer : testing_observers_) | 616 for (auto& observer : testing_observers_) |
620 observer.OnTimingUpdated(is_main_frame, timing, metadata); | 617 observer.OnTimingUpdated(is_main_frame, timing, metadata); |
621 } | 618 } |
622 | 619 |
623 void MetricsWebContentsObserver::OnUpdateTimingOverIPC( | |
624 content::RenderFrameHost* render_frame_host, | |
625 const mojom::PageLoadTiming& timing, | |
626 const mojom::PageLoadMetadata& metadata) { | |
627 DCHECK(!base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | |
628 OnTimingUpdated(render_frame_host, timing, metadata); | |
629 | |
630 for (auto& observer : testing_observers_) | |
631 observer.DidReceiveTimingUpdate(TestingObserver::IPCType::LEGACY); | |
632 } | |
633 | |
634 void MetricsWebContentsObserver::UpdateTiming( | |
635 const mojom::PageLoadTimingPtr timing, | |
636 const mojom::PageLoadMetadataPtr metadata) { | |
637 content::RenderFrameHost* render_frame_host = | |
638 page_load_metrics_binding_.GetCurrentTargetFrame(); | |
639 DCHECK(base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | |
640 OnTimingUpdated(render_frame_host, *timing, *metadata); | |
641 | |
642 for (auto& observer : testing_observers_) | |
643 observer.DidReceiveTimingUpdate(TestingObserver::IPCType::MOJO); | |
644 } | |
645 | |
646 bool MetricsWebContentsObserver::ShouldTrackNavigation( | 620 bool MetricsWebContentsObserver::ShouldTrackNavigation( |
647 content::NavigationHandle* navigation_handle) const { | 621 content::NavigationHandle* navigation_handle) const { |
648 DCHECK(navigation_handle->IsInMainFrame()); | 622 DCHECK(navigation_handle->IsInMainFrame()); |
649 DCHECK(!navigation_handle->HasCommitted() || | 623 DCHECK(!navigation_handle->HasCommitted() || |
650 !navigation_handle->IsSameDocument()); | 624 !navigation_handle->IsSameDocument()); |
651 | 625 |
652 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), | 626 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), |
653 navigation_handle).ShouldTrack(); | 627 navigation_handle).ShouldTrack(); |
654 } | 628 } |
655 | 629 |
(...skipping 19 matching lines...) Expand all Loading... |
675 observer_->RemoveTestingObserver(this); | 649 observer_->RemoveTestingObserver(this); |
676 observer_ = nullptr; | 650 observer_ = nullptr; |
677 } | 651 } |
678 } | 652 } |
679 | 653 |
680 void MetricsWebContentsObserver::TestingObserver::OnGoingAway() { | 654 void MetricsWebContentsObserver::TestingObserver::OnGoingAway() { |
681 observer_ = nullptr; | 655 observer_ = nullptr; |
682 } | 656 } |
683 | 657 |
684 } // namespace page_load_metrics | 658 } // namespace page_load_metrics |
OLD | NEW |