Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 74ae36f7ad151c92b099e66e474da36eaa21d438..d4eee4e9f127339fa6b66a299501bd136a1d0796 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -1096,6 +1096,7 @@ RenderFrameImpl::RenderFrameImpl(const CreateParams& params) |
CHECK(result.second) << "Inserting a duplicate item."; |
RenderThread::Get()->AddRoute(routing_id_, this); |
+ RenderThread::Get()->AddRoutedInterfaces(routing_id_, this); |
render_view_->RegisterRenderFrame(this); |
@@ -2395,6 +2396,29 @@ shell::InterfaceProvider* RenderFrameImpl::GetRemoteInterfaces() { |
return remote_interfaces_.get(); |
} |
+void RenderFrameImpl::AddRoutedInterface( |
+ const base::StringPiece& name, |
+ const GenericRoutedInterfaceFactory& factory) { |
+ auto result = |
+ routed_interfaces_.insert(std::make_pair(name.as_string(), factory)); |
+ DCHECK(result.second); |
+} |
+ |
+void RenderFrameImpl::RemoveRoutedInterface(const base::StringPiece& name) { |
+ auto it = routed_interfaces_.find(name.as_string()); |
+ DCHECK(it != routed_interfaces_.end()); |
+ routed_interfaces_.erase(it); |
+} |
+ |
+void RenderFrameImpl::GetRemoteRoutedInterface( |
+ const base::StringPiece& name, |
+ mojo::ScopedInterfaceEndpointHandle handle) { |
+ mojom::RoutedInterfaceAssociatedRequest request; |
+ request.Bind(std::move(handle)); |
+ GetRemoteRoutedInterfaces()->GetRoutedInterface(name.as_string(), |
+ std::move(request)); |
+} |
+ |
#if defined(ENABLE_PLUGINS) |
void RenderFrameImpl::RegisterPeripheralPlugin( |
const url::Origin& content_origin, |
@@ -6174,6 +6198,18 @@ void RenderFrameImpl::RegisterMojoInterfaces() { |
} |
} |
+mojom::RoutedInterfaceProvider* RenderFrameImpl::GetRemoteRoutedInterfaces() { |
+ if (!remote_routed_interfaces_) { |
+ RenderThread* render_thread = RenderThread::Get(); |
+ render_thread->GetRemoteRouteProvider()->GetRoutedInterfaces( |
+ GetRoutingID(), |
+ mojo::GetProxy(&remote_routed_interfaces_, |
+ render_thread->GetChannel()->GetAssociatedGroup())); |
+ } |
+ |
+ return remote_routed_interfaces_.get(); |
+} |
+ |
template <typename Interface> |
void RenderFrameImpl::GetInterface(mojo::InterfaceRequest<Interface> request) { |
GetRemoteInterfaces()->GetInterface(std::move(request)); |
@@ -6338,4 +6374,12 @@ void RenderFrameImpl::RenderWidgetWillHandleMouseEvent() { |
#endif |
} |
+void RenderFrameImpl::GetRoutedInterface( |
+ const std::string& name, |
+ mojom::RoutedInterfaceAssociatedRequest request) { |
+ auto it = routed_interfaces_.find(name); |
+ if (it != routed_interfaces_.end()) |
+ it->second.Run(request.PassHandle()); |
+} |
+ |
} // namespace content |