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