| 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 |