// 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_BINDING_H_ #define EXTENSIONS_RENDERER_API_BINDING_H_ #include #include #include #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/supports_user_data.h" #include "extensions/renderer/argument_spec.h" #include "v8/include/v8.h" namespace base { class ListValue; } namespace gin { class Arguments; } namespace extensions { class APIBindingHooks; class APIEventHandler; class APIRequestHandler; class APISignature; class APITypeReferenceMap; // A class that vends v8::Objects for extension APIs. These APIs have function // interceptors for all exposed methods, which call back into the APIBinding. // The APIBinding then matches the calling arguments against an expected method // signature, throwing an error if they don't match. // There should only need to be a single APIBinding object for each API, and // each can vend multiple v8::Objects for different contexts. // This object is designed to be one-per-isolate, but used across separate // contexts. class APIBinding { public: using CreateCustomType = base::Callback( v8::Isolate* isolate, const std::string& type_name, const std::string& property_name, const base::ListValue* property_values)>; // The callback for determining if a given API feature (specified by |name|) // is available in the given context. using AvailabilityCallback = base::Callback, const std::string& name)>; // The callback type for handling an API call. using HandlerCallback = base::Callback; // The APITypeReferenceMap is required to outlive this object. // |function_definitions|, |type_definitions| and |event_definitions| // may be null if the API does not specify any of that category. APIBinding(const std::string& name, const base::ListValue* function_definitions, const base::ListValue* type_definitions, const base::ListValue* event_definitions, const base::DictionaryValue* property_definitions, const CreateCustomType& create_custom_type, const AvailabilityCallback& is_available, std::unique_ptr binding_hooks, APITypeReferenceMap* type_refs, APIRequestHandler* request_handler, APIEventHandler* event_handler); ~APIBinding(); // Returns a new v8::Object for the API this APIBinding represents. v8::Local CreateInstance(v8::Local context); APIBindingHooks* hooks() { return binding_hooks_.get(); } private: // Initializes the object_template_ for this API. Called lazily when the // first instance is created. void InitializeTemplate(v8::Isolate* isolate); // Decorates |object_template| with the properties specified by |properties|. void DecorateTemplateWithProperties( v8::Isolate* isolate, v8::Local object_template, const base::DictionaryValue& properties); // Handler for getting the v8::Object associated with an event on the API. static void GetEventObject(v8::Local, const v8::PropertyCallbackInfo& info); // Handler for getting the v8::Object associated with a custom property on the // API. static void GetCustomPropertyObject( v8::Local property, const v8::PropertyCallbackInfo& info); // Handles a call an API method with the given |name| and matches the // arguments against |signature|. void HandleCall(const std::string& name, const APISignature* signature, gin::Arguments* args); // The root name of the API, e.g. "tabs" for chrome.tabs. std::string api_name_; // A map from method name to method data. struct MethodData; std::map> methods_; // The events associated with this API. struct EventData; std::vector> events_; // The custom properties on the API; these are rare. struct CustomPropertyData; std::vector> custom_properties_; // The pair for enum entry is . JS enum entries use // SCREAMING_STYLE (whereas our API enums are just inconsistent). using EnumEntry = std::pair; // A map of for the enums on this API. std::map> enums_; // The associated properties of the API, if any. const base::DictionaryValue* property_definitions_; // The callback for constructing a custom type. CreateCustomType create_custom_type_; // The callback for checking availability of an API feature. AvailabilityCallback is_available_; // The registered hooks for this API. std::unique_ptr binding_hooks_; // The reference map for all known types; required to outlive this object. APITypeReferenceMap* type_refs_; // The associated request handler, shared between this and other bindings. // Required to outlive this object. APIRequestHandler* request_handler_; // The associated event handler, shared between this and other bindings. // Required to outlive this object. APIEventHandler* event_handler_; // The template for this API. Note: some methods may only be available in // certain contexts, but this template contains all methods. Those that are // unavailable are removed after object instantiation. v8::Eternal object_template_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(APIBinding); }; } // namespace extensions #endif // EXTENSIONS_RENDERER_API_BINDING_H_