Allow WebContentsObservers to bind InterfaceRequests from frames.

WebContentsObservers will now be called prior to ContentBrowserClient::BindInterfaceRequestForFrame to see if they can bind requests for a particular RFH.

This allows us to wean the last few embedder use cases of RenderFrameHost's interface registry off it, to using their own.

[email protected]
TEST=Contextual search in Clank.

Cq-Include-Trybots: master.tryserver.chromium.linux:linux_site_isolation
Change-Id: I02afe864ead7352d8ef4829300518b9fe2d81e37
Reviewed-on: https://chromium-review.googlesource.com/544215
Commit-Queue: Ben Goodger <[email protected]>
Reviewed-by: Ken Rockot <[email protected]>
Cr-Commit-Position: refs/heads/master@{#488566}
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 922dd26fe..6227364 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -221,6 +221,8 @@
       network_bytes_(0),
       weak_factory_(this) {
   DCHECK(prerender_manager);
+  registry_.AddInterface(base::Bind(
+      &PrerenderContents::OnPrerenderCancelerRequest, base::Unretained(this)));
 }
 
 bool PrerenderContents::Init() {
@@ -531,12 +533,15 @@
   Destroy(FINAL_STATUS_RENDERER_CRASHED);
 }
 
+void PrerenderContents::OnInterfaceRequestFromFrame(
+    content::RenderFrameHost* render_frame_host,
+    const std::string& interface_name,
+    mojo::ScopedMessagePipeHandle* interface_pipe) {
+  registry_.TryBindInterface(interface_name, interface_pipe);
+}
+
 void PrerenderContents::RenderFrameCreated(
     content::RenderFrameHost* render_frame_host) {
-  render_frame_host->GetInterfaceRegistry()->AddInterface(
-      base::Bind(&PrerenderContents::OnPrerenderCancelerRequest,
-                 weak_factory_.GetWeakPtr()));
-
   // When a new RenderFrame is created for a prerendering WebContents, tell the
   // new RenderFrame it's being used for prerendering before any navigations
   // occur.  Note that this is always triggered before the first navigation, so