Chromium Code Reviews| 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_update_dispatcher.h " | 17 #include "chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h " |
| 19 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" | 18 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" |
| 20 #include "chrome/browser/page_load_metrics/page_load_tracker.h" | 19 #include "chrome/browser/page_load_metrics/page_load_tracker.h" |
| 21 #include "chrome/browser/prerender/prerender_contents.h" | 20 #include "chrome/browser/prerender/prerender_contents.h" |
| 22 #include "chrome/common/chrome_features.h" | |
| 23 #include "chrome/common/page_load_metrics/page_load_metrics_messages.h" | |
| 24 #include "chrome/common/page_load_metrics/page_load_timing.h" | 21 #include "chrome/common/page_load_metrics/page_load_timing.h" |
| 25 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 26 #include "content/public/browser/global_request_id.h" | 23 #include "content/public/browser/global_request_id.h" |
| 27 #include "content/public/browser/navigation_details.h" | 24 #include "content/public/browser/navigation_details.h" |
| 28 #include "content/public/browser/navigation_handle.h" | 25 #include "content/public/browser/navigation_handle.h" |
| 29 #include "content/public/browser/render_frame_host.h" | 26 #include "content/public/browser/render_frame_host.h" |
| 30 #include "content/public/browser/render_view_host.h" | 27 #include "content/public/browser/render_view_host.h" |
| 31 #include "content/public/browser/web_contents.h" | 28 #include "content/public/browser/web_contents.h" |
| 32 #include "content/public/browser/web_contents_observer.h" | 29 #include "content/public/browser/web_contents_observer.h" |
| 33 #include "content/public/browser/web_contents_user_data.h" | 30 #include "content/public/browser/web_contents_user_data.h" |
| 34 #include "ipc/ipc_message.h" | |
| 35 #include "ipc/ipc_message_macros.h" | |
| 36 #include "net/base/net_errors.h" | 31 #include "net/base/net_errors.h" |
| 37 #include "ui/base/page_transition_types.h" | 32 #include "ui/base/page_transition_types.h" |
| 38 | 33 |
| 39 DEFINE_WEB_CONTENTS_USER_DATA_KEY( | 34 DEFINE_WEB_CONTENTS_USER_DATA_KEY( |
| 40 page_load_metrics::MetricsWebContentsObserver); | 35 page_load_metrics::MetricsWebContentsObserver); |
| 41 | 36 |
| 42 namespace page_load_metrics { | 37 namespace page_load_metrics { |
| 43 | 38 |
| 44 namespace { | 39 namespace { |
| 45 | 40 |
| 46 content::RenderFrameHost* GetMainFrame(content::RenderFrameHost* rfh) { | 41 content::RenderFrameHost* GetMainFrame(content::RenderFrameHost* rfh) { |
|
dcheng
2017/06/25 07:44:46
Not introduced by this CL, but this doesn't really
| |
| 47 // Don't use rfh->GetRenderViewHost()->GetMainFrame() here because | 42 // Don't use rfh->GetRenderViewHost()->GetMainFrame() here because |
| 48 // RenderViewHost is being deprecated and because in OOPIF, | 43 // RenderViewHost is being deprecated and because in OOPIF, |
| 49 // RenderViewHost::GetMainFrame() returns nullptr for child frames hosted in a | 44 // RenderViewHost::GetMainFrame() returns nullptr for child frames hosted in a |
| 50 // different process from the main frame. | 45 // different process from the main frame. |
| 51 while (rfh->GetParent() != nullptr) | 46 while (rfh->GetParent() != nullptr) |
| 52 rfh = rfh->GetParent(); | 47 rfh = rfh->GetParent(); |
| 53 return rfh; | 48 return rfh; |
| 54 } | 49 } |
| 55 | 50 |
| 56 UserInitiatedInfo CreateUserInitiatedInfo( | 51 UserInitiatedInfo CreateUserInitiatedInfo( |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 if (GetMainFrame(render_frame_host) != web_contents()->GetMainFrame()) { | 142 if (GetMainFrame(render_frame_host) != web_contents()->GetMainFrame()) { |
| 148 // Ignore media that starts playing in a document that was navigated away | 143 // Ignore media that starts playing in a document that was navigated away |
| 149 // from. | 144 // from. |
| 150 return; | 145 return; |
| 151 } | 146 } |
| 152 if (committed_load_) | 147 if (committed_load_) |
| 153 committed_load_->MediaStartedPlaying( | 148 committed_load_->MediaStartedPlaying( |
| 154 video_type, render_frame_host == web_contents()->GetMainFrame()); | 149 video_type, render_frame_host == web_contents()->GetMainFrame()); |
| 155 } | 150 } |
| 156 | 151 |
| 157 bool MetricsWebContentsObserver::OnMessageReceived( | |
| 158 const IPC::Message& message, | |
| 159 content::RenderFrameHost* render_frame_host) { | |
| 160 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 161 bool handled = true; | |
| 162 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MetricsWebContentsObserver, message, | |
| 163 render_frame_host) | |
| 164 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnUpdateTimingOverIPC) | |
| 165 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 166 IPC_END_MESSAGE_MAP() | |
| 167 return handled; | |
| 168 } | |
| 169 | |
| 170 void MetricsWebContentsObserver::WillStartNavigationRequest( | 152 void MetricsWebContentsObserver::WillStartNavigationRequest( |
| 171 content::NavigationHandle* navigation_handle) { | 153 content::NavigationHandle* navigation_handle) { |
| 172 // Same-document navigations should never go through | 154 // Same-document navigations should never go through |
| 173 // WillStartNavigationRequest. | 155 // WillStartNavigationRequest. |
| 174 DCHECK(!navigation_handle->IsSameDocument()); | 156 DCHECK(!navigation_handle->IsSameDocument()); |
| 175 | 157 |
| 176 if (!navigation_handle->IsInMainFrame()) | 158 if (!navigation_handle->IsInMainFrame()) |
| 177 return; | 159 return; |
| 178 | 160 |
| 179 UserInitiatedInfo user_initiated_info( | 161 UserInitiatedInfo user_initiated_info( |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 615 error = true; | 597 error = true; |
| 616 } | 598 } |
| 617 | 599 |
| 618 if (error) | 600 if (error) |
| 619 return; | 601 return; |
| 620 | 602 |
| 621 committed_load_->metrics_update_dispatcher()->UpdateMetrics(render_frame_host, | 603 committed_load_->metrics_update_dispatcher()->UpdateMetrics(render_frame_host, |
| 622 timing, metadata); | 604 timing, metadata); |
| 623 } | 605 } |
| 624 | 606 |
| 625 void MetricsWebContentsObserver::OnUpdateTimingOverIPC( | |
| 626 content::RenderFrameHost* render_frame_host, | |
| 627 const mojom::PageLoadTiming& timing, | |
| 628 const mojom::PageLoadMetadata& metadata) { | |
| 629 DCHECK(!base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | |
| 630 OnTimingUpdated(render_frame_host, timing, metadata); | |
| 631 | |
| 632 for (auto& observer : testing_observers_) | |
| 633 observer.DidReceiveTimingUpdate(TestingObserver::IPCType::LEGACY); | |
| 634 } | |
| 635 | |
| 636 void MetricsWebContentsObserver::UpdateTiming( | 607 void MetricsWebContentsObserver::UpdateTiming( |
| 637 const mojom::PageLoadTimingPtr timing, | 608 const mojom::PageLoadTimingPtr timing, |
| 638 const mojom::PageLoadMetadataPtr metadata) { | 609 const mojom::PageLoadMetadataPtr metadata) { |
| 639 content::RenderFrameHost* render_frame_host = | 610 content::RenderFrameHost* render_frame_host = |
| 640 page_load_metrics_binding_.GetCurrentTargetFrame(); | 611 page_load_metrics_binding_.GetCurrentTargetFrame(); |
| 641 DCHECK(base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | |
| 642 OnTimingUpdated(render_frame_host, *timing, *metadata); | 612 OnTimingUpdated(render_frame_host, *timing, *metadata); |
| 643 | |
| 644 for (auto& observer : testing_observers_) | |
| 645 observer.DidReceiveTimingUpdate(TestingObserver::IPCType::MOJO); | |
| 646 } | 613 } |
| 647 | 614 |
| 648 bool MetricsWebContentsObserver::ShouldTrackNavigation( | 615 bool MetricsWebContentsObserver::ShouldTrackNavigation( |
| 649 content::NavigationHandle* navigation_handle) const { | 616 content::NavigationHandle* navigation_handle) const { |
| 650 DCHECK(navigation_handle->IsInMainFrame()); | 617 DCHECK(navigation_handle->IsInMainFrame()); |
| 651 DCHECK(!navigation_handle->HasCommitted() || | 618 DCHECK(!navigation_handle->HasCommitted() || |
| 652 !navigation_handle->IsSameDocument()); | 619 !navigation_handle->IsSameDocument()); |
| 653 | 620 |
| 654 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), | 621 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), |
| 655 navigation_handle).ShouldTrack(); | 622 navigation_handle).ShouldTrack(); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 677 observer_->RemoveTestingObserver(this); | 644 observer_->RemoveTestingObserver(this); |
| 678 observer_ = nullptr; | 645 observer_ = nullptr; |
| 679 } | 646 } |
| 680 } | 647 } |
| 681 | 648 |
| 682 void MetricsWebContentsObserver::TestingObserver::OnGoingAway() { | 649 void MetricsWebContentsObserver::TestingObserver::OnGoingAway() { |
| 683 observer_ = nullptr; | 650 observer_ = nullptr; |
| 684 } | 651 } |
| 685 | 652 |
| 686 } // namespace page_load_metrics | 653 } // namespace page_load_metrics |
| OLD | NEW |