Index: content/public/common/associated_interface_registry.h |
diff --git a/content/public/common/associated_interface_registry.h b/content/public/common/associated_interface_registry.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9437c64e3053520d21bde5a6e20fefe411038fdc |
--- /dev/null |
+++ b/content/public/common/associated_interface_registry.h |
@@ -0,0 +1,64 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_PUBLIC_COMMON_ASSOCIATED_INTERFACE_REGISTRY_H_ |
+#define CONTENT_PUBLIC_COMMON_ASSOCIATED_INTERFACE_REGISTRY_H_ |
+ |
+#include <string> |
+ |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "mojo/public/cpp/bindings/associated_interface_request.h" |
+#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" |
+ |
+namespace content { |
+ |
+// An AssociatedInterfaceRegistry is a collection of associated interface- |
+// binding callbacks mapped by interface name. |
+// |
+// This is used to register binding callbacks for interfaces which must be |
+// associated with some IPC::ChannelProxy, meaning that messages on the |
+// interface retain FIFO with respect to legacy Chrome IPC messages sent or |
+// dispatched on the channel. |
+// |
+// The channel with which a registered interface is associated depends on the |
+// configuration of the specific AssociatedInterfaceRegistry instance. For |
+// example, RenderFrame exposes an instance of this class for which all |
+// interfaces are associated with the IPC::SyncChannel to the browser. |
+class AssociatedInterfaceRegistry { |
+ public: |
+ using Binder = base::Callback<void(mojo::ScopedInterfaceEndpointHandle)>; |
+ |
+ virtual ~AssociatedInterfaceRegistry() {} |
+ |
+ // Adds an interface binder to the registry. |
+ virtual void AddInterface(const std::string& name, const Binder& binder) = 0; |
+ |
+ // Removes an interface binder from the registry. |
+ virtual void RemoveInterface(const std::string& name) = 0; |
+ |
+ template <typename Interface> |
+ using InterfaceBinder = |
+ base::Callback<void(mojo::AssociatedInterfaceRequest<Interface>)>; |
+ |
+ // Templated helper for AddInterface() above. |
+ template <typename Interface> |
+ void AddInterface(const InterfaceBinder<Interface>& binder) { |
+ AddInterface(Interface::Name_, |
+ base::Bind(&BindInterface<Interface>, binder)); |
+ } |
+ |
+ private: |
+ template <typename Interface> |
+ static void BindInterface(const InterfaceBinder<Interface>& binder, |
+ mojo::ScopedInterfaceEndpointHandle handle) { |
+ mojo::AssociatedInterfaceRequest<Interface> request; |
+ request.Bind(std::move(handle)); |
+ binder.Run(std::move(request)); |
+ } |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_PUBLIC_COMMON_ASSOCIATED_INTERFACE_REGISTRY_H_ |