Chromium Code Reviews| Index: content/public/renderer/render_frame.h |
| diff --git a/content/public/renderer/render_frame.h b/content/public/renderer/render_frame.h |
| index 0ac29c8eecdab5aaa8ebc77b1f0e2422197520f6..da0b809abe8b5f2407fecc494a1e7c2d9c5010a1 100644 |
| --- a/content/public/renderer/render_frame.h |
| +++ b/content/public/renderer/render_frame.h |
| @@ -13,8 +13,12 @@ |
| #include "base/strings/string16.h" |
| #include "content/common/content_export.h" |
| #include "content/public/common/console_message_level.h" |
| +#include "content/public/renderer/render_thread.h" |
| #include "ipc/ipc_listener.h" |
| #include "ipc/ipc_sender.h" |
| +#include "ipc/ipc_sync_channel.h" |
| +#include "mojo/public/cpp/bindings/associated_interface_ptr.h" |
| +#include "mojo/public/cpp/bindings/associated_interface_request.h" |
| #include "third_party/WebKit/public/platform/WebPageVisibilityState.h" |
| #include "third_party/WebKit/public/web/WebNavigationPolicy.h" |
| @@ -155,6 +159,23 @@ class CONTENT_EXPORT RenderFrame : public IPC::Listener, |
| // interfaces exposed to it by the application running in this frame. |
| virtual shell::InterfaceProvider* GetRemoteInterfaces() = 0; |
| + using GenericRoutedInterfaceFactory = |
| + base::Callback<void(mojo::ScopedInterfaceEndpointHandle)>; |
| + |
| + // Adds an associated interface factory to this frame, allowing the remote |
| + // RenderFrameHost to acquire a proxy to the interface on this specific frame. |
| + virtual void AddRoutedInterface( |
|
tibell
2016/09/05 00:32:13
It's a bit unfortunate that we couldn't instead ha
|
| + const base::StringPiece& name, |
| + const GenericRoutedInterfaceFactory& factory) = 0; |
| + |
| + virtual void RemoveRoutedInterface(const base::StringPiece& name) = 0; |
| + |
| + // Binds an interface proxy to be associated with the remote RenderFrameHost |
| + // in the browser process. |
| + virtual void GetRemoteRoutedInterface( |
| + const base::StringPiece& name, |
| + mojo::ScopedInterfaceEndpointHandle handle) = 0; |
| + |
| #if defined(ENABLE_PLUGINS) |
| // Registers a plugin that has been marked peripheral. If the origin |
| // whitelist is later updated and includes |content_origin|, then |
| @@ -229,13 +250,50 @@ class CONTENT_EXPORT RenderFrame : public IPC::Listener, |
| // Returns the current visibility of the frame. |
| virtual blink::WebPageVisibilityState GetVisibilityState() const = 0; |
| + template <typename Interface> |
| + void GetRemoteRoutedInterface( |
| + mojo::AssociatedInterfacePtr<Interface>* proxy) { |
| + IPC::ChannelProxy* channel = RenderThread::Get()->GetChannel(); |
| + |
| + // Tests may not have a channel set up. Since they clearly don't expect IPC |
| + // to work, we can bind these interface requests to dead-ends. |
| + if (!channel) { |
| + mojo::GetDummyProxy(proxy); |
| + return; |
| + } |
| + |
| + mojo::AssociatedInterfaceRequest<Interface> request = mojo::GetProxy( |
| + proxy, channel->GetAssociatedGroup()); |
| + GetRemoteRoutedInterface(Interface::Name_, request.PassHandle()); |
| + } |
| + |
| + template <typename Interface> |
| + using RoutedInterfaceFactory = |
| + base::Callback<void(mojo::AssociatedInterfaceRequest<Interface>)>; |
| + |
| + template <typename Interface> |
| + void AddRoutedInterface(const RoutedInterfaceFactory<Interface>& factory) { |
| + AddRoutedInterface(Interface::Name_, |
| + base::Bind(&BindRoutedInterface<Interface>, factory)); |
| + } |
| + |
| protected: |
| ~RenderFrame() override {} |
| private: |
| // This interface should only be implemented inside content. |
| friend class RenderFrameImpl; |
| + |
| RenderFrame() {} |
| + |
| + template <typename Interface> |
| + static void BindRoutedInterface( |
| + const RoutedInterfaceFactory<Interface>& factory, |
| + mojo::ScopedInterfaceEndpointHandle handle) { |
| + mojo::AssociatedInterfaceRequest<Interface> request; |
| + request.Bind(std::move(handle)); |
| + factory.Run(std::move(request)); |
| + } |
| }; |
| } // namespace content |