| // 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_EXTENSION_BINDINGS_SYSTEM_H_ | 
 | #define EXTENSIONS_RENDERER_EXTENSION_BINDINGS_SYSTEM_H_ | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "base/time/time.h" | 
 | #include "extensions/common/extension_id.h" | 
 | #include "extensions/common/features/feature.h" | 
 |  | 
 | namespace base { | 
 | class ListValue; | 
 | } | 
 |  | 
 | namespace extensions { | 
 | class IPCMessageSender; | 
 | class RendererMessagingService; | 
 | class RequestSender; | 
 | class ScriptContext; | 
 | struct EventFilteringInfo; | 
 |  | 
 | // The class responsible for creating extension bindings in different contexts, | 
 | // as well as dispatching requests and handling responses, and dispatching | 
 | // events to listeners. | 
 | // This is designed to be used on a single thread, but should be safe to use on | 
 | // threads other than the main thread (so that worker threads can have extension | 
 | // bindings). | 
 | class ExtensionBindingsSystem { | 
 |  public: | 
 |   virtual ~ExtensionBindingsSystem() {} | 
 |  | 
 |   // Called when a new ScriptContext is created. | 
 |   virtual void DidCreateScriptContext(ScriptContext* context) = 0; | 
 |  | 
 |   // Called when a ScriptContext is about to be released. | 
 |   virtual void WillReleaseScriptContext(ScriptContext* context) = 0; | 
 |  | 
 |   // Updates the bindings for a given |context|. This happens at initialization, | 
 |   // but also when e.g. an extension gets updated permissions. | 
 |   virtual void UpdateBindingsForContext(ScriptContext* context) = 0; | 
 |  | 
 |   // Dispatches an event with the given |name|, |event_args|, and | 
 |   // |filtering_info| in the given |context|. | 
 |   virtual void DispatchEventInContext(const std::string& event_name, | 
 |                                       const base::ListValue* event_args, | 
 |                                       const EventFilteringInfo* filtering_info, | 
 |                                       ScriptContext* context) = 0; | 
 |  | 
 |   // Returns true if there is a listener for the given |event_name| in the | 
 |   // associated |context|. | 
 |   virtual bool HasEventListenerInContext(const std::string& event_name, | 
 |                                          ScriptContext* context) = 0; | 
 |  | 
 |   // Handles the response associated with the given |request_id|. | 
 |   virtual void HandleResponse(int request_id, | 
 |                               bool success, | 
 |                               const base::ListValue& response, | 
 |                               const std::string& error) = 0; | 
 |  | 
 |   // Returns the associated IPC message sender. | 
 |   virtual IPCMessageSender* GetIPCMessageSender() = 0; | 
 |  | 
 |   // Returns the associated RequestSender, if any. | 
 |   // TODO(devlin): Factor this out. | 
 |   virtual RequestSender* GetRequestSender() = 0; | 
 |  | 
 |   // Returns the associated RendererMessagingService. | 
 |   virtual RendererMessagingService* GetMessagingService() = 0; | 
 |  | 
 |   // Called when an extension is removed. | 
 |   virtual void OnExtensionRemoved(const ExtensionId& id) {} | 
 |  | 
 |   // Called when an extension's permissions are updated. | 
 |   virtual void OnExtensionPermissionsUpdated(const ExtensionId& id) {} | 
 |  | 
 |   // Returns true if any portion of the runtime API is available to the given | 
 |   // |context|. This is different than just checking features because runtime's | 
 |   // availability depends on the installed extensions and the active URL (in the | 
 |   // case of extensions communicating with external websites). | 
 |   static bool IsRuntimeAvailableToContext(ScriptContext* context); | 
 |  | 
 |   // Logs the amount of time taken to update the bindings for a given context | 
 |   // (i.e., UpdateBindingsForContext()). | 
 |   static void LogUpdateBindingsForContextTime(Feature::Context context_type, | 
 |                                               base::TimeDelta elapsed); | 
 |  | 
 |   // The APIs that could potentially be available to webpage-like contexts. | 
 |   // This is the list of possible features; most web pages will not have access | 
 |   // to these APIs. | 
 |   // Note: `runtime` is not included here, since it's handled specially above. | 
 |   // Note: We specify the size of the array to allow for its use in for loops | 
 |   // without needing to expose a separate "kNumWebAvailableFeatures". | 
 |   static const char* const kWebAvailableFeatures[3]; | 
 | }; | 
 |  | 
 | }  // namespace extensions | 
 |  | 
 | #endif  // EXTENSIONS_RENDERER_EXTENSION_BINDINGS_SYSTEM_H_ |