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