Chromium Code Reviews| Index: components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| index 617d7d6d211ed1b8283e168b81edebda28cde8f5..0444ed573d3a015a17ae29be0d7deb1081109f96 100644 |
| --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| @@ -26,6 +26,7 @@ |
| #include "content/public/browser/web_contents_user_data.h" |
| #include "ipc/ipc_message.h" |
| #include "ipc/ipc_message_macros.h" |
| +#include "services/shell/public/cpp/interface_registry.h" |
| #include "ui/base/page_transition_types.h" |
| DEFINE_WEB_CONTENTS_USER_DATA_KEY( |
| @@ -572,6 +573,23 @@ void PageLoadTracker::UpdateAbortInternal(UserAbortType abort_type, |
| } |
| } |
| +PageLoadMetricsImpl::PageLoadMetricsImpl(MetricsWebContentsObserver* observer, |
| + content::RenderFrameHost* host) |
| + : observer_(observer), host_(host), binding_(this) {} |
| + |
| +PageLoadMetricsImpl::~PageLoadMetricsImpl() = default; |
| + |
| +void PageLoadMetricsImpl::Bind( |
| + mojo::InterfaceRequest<mojom::PageLoadMetrics> request) { |
| + binding_.Bind(std::move(request)); |
| +} |
| + |
| +void PageLoadMetricsImpl::TimingUpdated(const PageLoadTiming& timing, |
| + const PageLoadMetadata& metadata) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| + observer_->OnTimingUpdated(host_, timing, metadata); |
| +} |
| + |
| // static |
| MetricsWebContentsObserver::MetricsWebContentsObserver( |
| content::WebContents* web_contents, |
| @@ -620,19 +638,6 @@ void MetricsWebContentsObserver::RenderViewHostChanged( |
| RegisterInputEventObserver(new_host); |
| } |
| -bool MetricsWebContentsObserver::OnMessageReceived( |
| - const IPC::Message& message, |
| - content::RenderFrameHost* render_frame_host) { |
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| - bool handled = true; |
| - IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MetricsWebContentsObserver, message, |
| - render_frame_host) |
| - IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) |
| - IPC_MESSAGE_UNHANDLED(handled = false) |
| - IPC_END_MESSAGE_MAP() |
| - return handled; |
| -} |
| - |
| void MetricsWebContentsObserver::DidStartNavigation( |
| content::NavigationHandle* navigation_handle) { |
| if (!navigation_handle->IsInMainFrame()) |
| @@ -882,6 +887,31 @@ MetricsWebContentsObserver::NotifyAbortedProvisionalLoadsNewNavigation( |
| return last_aborted_load; |
| } |
| +void MetricsWebContentsObserver::RenderFrameCreated( |
| + content::RenderFrameHost* render_frame_host) { |
| + CreateRegisteredInterface(render_frame_host); |
| +} |
| + |
| +void MetricsWebContentsObserver::RenderFrameHostChanged( |
| + content::RenderFrameHost* old_host, |
| + content::RenderFrameHost* new_host) { |
| + CreateRegisteredInterface(new_host); |
| +} |
| +void MetricsWebContentsObserver::WebContentsDestroyed() { |
| + // At this point we no longer accept any more requests, as OnTimingUpdated |
| + // requires the WebContents to exist. |
| + registered_interfaces_.clear(); |
| +} |
| + |
| +void MetricsWebContentsObserver::CreateRegisteredInterface( |
| + content::RenderFrameHost* host) { |
| + registered_interfaces_.push_back( |
|
Sam McNally
2016/07/07 05:10:48
Do you need to create the interface impls eagerly?
tibell
2016/07/08 01:12:53
Done.
|
| + base::MakeUnique<PageLoadMetricsImpl>(this, host)); |
| + host->GetInterfaceRegistry()->AddInterface( |
| + base::Bind(&PageLoadMetricsImpl::Bind, |
| + base::Unretained(registered_interfaces_.back().get()))); |
| +} |
| + |
| void MetricsWebContentsObserver::OnTimingUpdated( |
| content::RenderFrameHost* render_frame_host, |
| const PageLoadTiming& timing, |