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 5b0d5dde828234aa95d6a4b8834394db1c4934b8..79ddac9d1be1844dc4eb8ee4de043495cc14b0a6 100644 |
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
@@ -15,7 +15,7 @@ |
#include "base/metrics/histogram.h" |
#include "base/metrics/user_metrics.h" |
#include "components/page_load_metrics/browser/page_load_metrics_util.h" |
-#include "components/page_load_metrics/common/page_load_metrics_messages.h" |
+#include "components/page_load_metrics/common/page_load_metrics_param_traits.h" |
#include "components/page_load_metrics/common/page_load_timing.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/navigation_details.h" |
@@ -27,6 +27,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( |
@@ -574,6 +575,40 @@ void PageLoadTracker::UpdateAbortInternal(UserAbortType abort_type, |
} |
} |
+class MetricsWebContentsObserver::PageLoadMetricsImpl |
+ : public mojom::PageLoadMetrics { |
+ public: |
+ // Does not take ownership of the arguments, which need to outlive this |
+ // object. |
+ PageLoadMetricsImpl(MetricsWebContentsObserver* observer, |
+ content::RenderFrameHost* host) |
+ : observer_(observer), host_(host), binding_(this) {} |
+ ~PageLoadMetricsImpl() override = default; |
+ |
+ // Factory for creating PageLoadMetricsImpl objects upon incoming connections. |
+ static void Create(MetricsWebContentsObserver* observer, |
+ content::RenderFrameHost* host, |
+ mojo::InterfaceRequest<mojom::PageLoadMetrics> request) { |
+ auto impl = base::MakeUnique<PageLoadMetricsImpl>(observer, host); |
+ impl->binding_.Bind(std::move(request)); |
+ observer->registered_interfaces_.push_back(std::move(impl)); |
+ } |
+ |
+ // mojom::PageLoadMetrics override. |
+ void TimingUpdated(const PageLoadTiming& timing, |
+ const PageLoadMetadata& metadata) override { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ observer_->OnTimingUpdated(host_, timing, metadata); |
+ } |
+ |
+ private: |
+ MetricsWebContentsObserver* const observer_; |
+ content::RenderFrameHost* const host_; |
+ mojo::Binding<mojom::PageLoadMetrics> binding_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsImpl); |
+}; |
+ |
// static |
MetricsWebContentsObserver::MetricsWebContentsObserver( |
content::WebContents* web_contents, |
@@ -622,19 +657,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()) |
@@ -892,6 +914,29 @@ MetricsWebContentsObserver::NotifyAbortedProvisionalLoadsNewNavigation( |
return last_aborted_load; |
} |
+void MetricsWebContentsObserver::RenderFrameCreated( |
+ content::RenderFrameHost* render_frame_host) { |
+ RegisterInterfaceImpl(render_frame_host); |
+} |
+ |
+void MetricsWebContentsObserver::RenderFrameHostChanged( |
+ content::RenderFrameHost* old_host, |
+ content::RenderFrameHost* new_host) { |
+ RegisterInterfaceImpl(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::RegisterInterfaceImpl( |
+ content::RenderFrameHost* host) { |
+ host->GetInterfaceRegistry()->AddInterface( |
+ base::Bind(&PageLoadMetricsImpl::Create, base::Unretained(this), |
+ base::Unretained(host))); |
+} |
+ |
void MetricsWebContentsObserver::OnTimingUpdated( |
content::RenderFrameHost* render_frame_host, |
const PageLoadTiming& timing, |