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