Index: extensions/renderer/api_bindings_system.h |
diff --git a/extensions/renderer/api_bindings_system.h b/extensions/renderer/api_bindings_system.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..de4e09ad8ef9bf26eaef1124da045cab55bdc721 |
--- /dev/null |
+++ b/extensions/renderer/api_bindings_system.h |
@@ -0,0 +1,97 @@ |
+// 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 EXTENSIONS_RENDERER_API_BINDINGS_SYSTEM_H_ |
+#define EXTENSIONS_RENDERER_API_BINDINGS_SYSTEM_H_ |
+ |
+#include <map> |
+#include <memory> |
+#include <string> |
+ |
+#include "base/callback.h" |
+#include "base/macros.h" |
+#include "extensions/renderer/api_request_handler.h" |
+#include "extensions/renderer/argument_spec.h" |
+ |
+namespace base { |
+class DictionaryValue; |
+class ListValue; |
+} |
+ |
+namespace extensions { |
+class APIBinding; |
+class APIRequestHandler; |
+ |
+// A class encompassing the necessary pieces to construct the JS entry points |
+// for Extension APIs. Designed to be used on a single thread, but safe between |
+// multiple v8::Contexts. |
+class APIBindingsSystem { |
+ public: |
+ // TODO(devlin): We will probably want to coalesce this with the |
+ // ExtensionHostMsg_Request_Params IPC struct. |
+ struct Request { |
+ Request(); |
+ ~Request(); |
+ |
+ std::string request_id; |
+ std::string method_name; |
+ std::unique_ptr<base::ListValue> arguments; |
+ }; |
+ |
+ using GetAPISchemaMethod = |
+ base::Callback<const base::DictionaryValue&(const std::string&)>; |
+ using SendRequestMethod = base::Callback<void(std::unique_ptr<Request>)>; |
+ |
+ APIBindingsSystem(const APIRequestHandler::CallJSFunction& call_js, |
+ const GetAPISchemaMethod& get_api_schema, |
+ const SendRequestMethod& send_request); |
+ ~APIBindingsSystem(); |
+ |
+ // Returns a new v8::Object representing the api specified by |api_name|. |
+ v8::Local<v8::Object> CreateAPIInstance(const std::string& api_name, |
+ v8::Local<v8::Context> context, |
+ v8::Isolate* isolate); |
+ |
+ // Responds to the request with the given |request_id|, calling the callback |
+ // with |response|. |
+ void CompleteRequest(const std::string& request_id, |
+ const base::ListValue& response); |
+ |
+ private: |
+ // Creates a new APIBinding for the given |api_name|. |
+ std::unique_ptr<APIBinding> CreateNewAPIBinding(const std::string& api_name); |
+ |
+ // Handles a call into an API, adds a pending request to the |
+ // |request_handler_|, and calls |send_request_|. |
+ void OnAPICall(const std::string& name, |
+ std::unique_ptr<base::ListValue> arguments, |
+ v8::Isolate* isolate, |
+ v8::Local<v8::Context> context, |
+ v8::Local<v8::Function> callback); |
+ |
+ // The map of cached API reference types. |
+ ArgumentSpec::RefMap type_reference_map_; |
+ |
+ // The request handler associated with the system. |
+ APIRequestHandler request_handler_; |
+ |
+ // A map from api_name -> APIBinding for constructed APIs. APIBindings are |
+ // created lazily. |
+ std::map<std::string, std::unique_ptr<APIBinding>> api_bindings_; |
+ |
+ // The method to retrieve the DictionaryValue describing a given extension |
+ // API. Curried in for testing purposes so we can use fake APIs. |
+ GetAPISchemaMethod get_api_schema_; |
+ |
+ // The method to call when a new API call is triggered. Curried in for testing |
+ // purposes. Typically, this would send an IPC to the browser to begin the |
+ // function work. |
+ SendRequestMethod send_request_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(APIBindingsSystem); |
+}; |
+ |
+} // namespace |
+ |
+#endif // EXTENSIONS_RENDERER_API_BINDINGS_SYSTEM_H_ |