diff options
Diffstat (limited to 'chrome/renderer/extensions/dispatcher.cc')
-rw-r--r-- | chrome/renderer/extensions/dispatcher.cc | 330 |
1 files changed, 237 insertions, 93 deletions
diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc index 4969510..248b4f6 100644 --- a/chrome/renderer/extensions/dispatcher.cc +++ b/chrome/renderer/extensions/dispatcher.cc @@ -8,6 +8,7 @@ #include "base/command_line.h" #include "base/memory/scoped_ptr.h" #include "base/string_piece.h" +#include "base/string_split.h" #include "chrome/common/child_process_logging.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_version_info.h" @@ -15,6 +16,7 @@ #include "chrome/common/extensions/background_info.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_messages.h" +#include "chrome/common/extensions/features/feature.h" #include "chrome/common/extensions/manifest.h" #include "chrome/common/extensions/permissions/permission_set.h" #include "chrome/common/url_constants.h" @@ -24,6 +26,7 @@ #include "chrome/renderer/extensions/app_bindings.h" #include "chrome/renderer/extensions/app_runtime_custom_bindings.h" #include "chrome/renderer/extensions/app_window_custom_bindings.h" +#include "chrome/renderer/extensions/binding_generating_native_handler.h" #include "chrome/renderer/extensions/chrome_v8_context.h" #include "chrome/renderer/extensions/chrome_v8_extension.h" #include "chrome/renderer/extensions/content_watcher.h" @@ -39,7 +42,7 @@ #include "chrome/renderer/extensions/media_galleries_custom_bindings.h" #include "chrome/renderer/extensions/miscellaneous_bindings.h" #include "chrome/renderer/extensions/module_system.h" -#include "chrome/renderer/extensions/native_handler.h" +#include "chrome/renderer/extensions/object_backed_native_handler.h" #include "chrome/renderer/extensions/page_actions_custom_bindings.h" #include "chrome/renderer/extensions/page_capture_custom_bindings.h" #include "chrome/renderer/extensions/request_sender.h" @@ -90,24 +93,97 @@ static const char kEventDispatchFunction[] = "Event.dispatchEvent"; static const char kOnSuspendEvent[] = "runtime.onSuspend"; static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled"; -class ChromeHiddenNativeHandler : public NativeHandler { +static v8::Handle<v8::Object> GetOrCreateChrome( + v8::Handle<v8::Context> context) { + v8::Handle<v8::String> chrome_string(v8::String::New("chrome")); + v8::Handle<v8::Object> global(context->Global()); + v8::Handle<v8::Value> chrome(global->Get(chrome_string)); + if (chrome.IsEmpty() || chrome->IsUndefined()) { + v8::Handle<v8::Object> chrome_object(v8::Object::New()); + global->Set(chrome_string, chrome_object); + return chrome_object; + } + CHECK(chrome->IsObject()); + return chrome->ToObject(); +} + +class SchemaRegistryNativeHandler : public ObjectBackedNativeHandler { public: - explicit ChromeHiddenNativeHandler(v8::Isolate* isolate) - : NativeHandler(isolate) { + SchemaRegistryNativeHandler(V8SchemaRegistry* registry, + v8::Handle<v8::Context> context) + : ObjectBackedNativeHandler(context), + registry_(registry) { + RouteFunction("GetSchema", + base::Bind(&SchemaRegistryNativeHandler::GetSchema, + base::Unretained(this))); + } + + private: + v8::Handle<v8::Value> GetSchema(const v8::Arguments& args) { + return registry_->GetSchema(*v8::String::AsciiValue(args[0])); + } + + V8SchemaRegistry* registry_; +}; + +class V8ContextNativeHandler : public ObjectBackedNativeHandler { + public: + explicit V8ContextNativeHandler(ChromeV8Context* context) + : ObjectBackedNativeHandler(context->v8_context()), + context_(context) { + RouteFunction("GetAvailability", + base::Bind(&V8ContextNativeHandler::GetAvailability, + base::Unretained(this))); + } + + private: + v8::Handle<v8::Value> GetAvailability(const v8::Arguments& args) { + CHECK_EQ(args.Length(), 1); + std::string api_name = *v8::String::AsciiValue(args[0]->ToString()); + Feature::Availability availability = context_->GetAvailability(api_name); + + v8::Handle<v8::Object> ret = v8::Object::New(); + ret->Set(v8::String::New("is_available"), + v8::Boolean::New(availability.is_available())); + ret->Set(v8::String::New("message"), + v8::String::New(availability.message().c_str())); + return ret; + } + + ChromeV8Context* context_; +}; + +class ChromeHiddenNativeHandler : public ObjectBackedNativeHandler { + public: + explicit ChromeHiddenNativeHandler(v8::Handle<v8::Context> context) + : ObjectBackedNativeHandler(context) { RouteFunction("GetChromeHidden", base::Bind(&ChromeHiddenNativeHandler::GetChromeHidden, base::Unretained(this))); } v8::Handle<v8::Value> GetChromeHidden(const v8::Arguments& args) { - return ChromeV8Context::GetOrCreateChromeHidden(v8::Context::GetCurrent()); + return ChromeV8Context::GetOrCreateChromeHidden(v8_context()); } }; -class PrintNativeHandler : public NativeHandler { +class ChromeNativeHandler : public ObjectBackedNativeHandler { public: - explicit PrintNativeHandler(v8::Isolate* isolate) - : NativeHandler(isolate) { + explicit ChromeNativeHandler(v8::Handle<v8::Context> context) + : ObjectBackedNativeHandler(context) { + RouteFunction("GetChrome", + base::Bind(&ChromeNativeHandler::GetChrome, base::Unretained(this))); + } + + v8::Handle<v8::Value> GetChrome(const v8::Arguments& args) { + return GetOrCreateChrome(v8_context()); + } +}; + +class PrintNativeHandler : public ObjectBackedNativeHandler { + public: + explicit PrintNativeHandler(v8::Handle<v8::Context> context) + : ObjectBackedNativeHandler(context) { RouteFunction("Print", base::Bind(&PrintNativeHandler::Print, base::Unretained(this))); @@ -128,8 +204,9 @@ class PrintNativeHandler : public NativeHandler { class LazyBackgroundPageNativeHandler : public ChromeV8Extension { public: - explicit LazyBackgroundPageNativeHandler(Dispatcher* dispatcher) - : ChromeV8Extension(dispatcher) { + LazyBackgroundPageNativeHandler(Dispatcher* dispatcher, + v8::Handle<v8::Context> context) + : ChromeV8Extension(dispatcher, context) { RouteFunction("IncrementKeepaliveCount", base::Bind(&LazyBackgroundPageNativeHandler::IncrementKeepaliveCount, base::Unretained(this))); @@ -139,7 +216,8 @@ class LazyBackgroundPageNativeHandler : public ChromeV8Extension { } v8::Handle<v8::Value> IncrementKeepaliveCount(const v8::Arguments& args) { - ChromeV8Context* context = dispatcher()->v8_context_set().GetCurrent(); + ChromeV8Context* context = + dispatcher()->v8_context_set().GetByV8Context(v8_context()); if (!context) return v8::Undefined(); RenderView* render_view = context->GetRenderView(); @@ -151,7 +229,8 @@ class LazyBackgroundPageNativeHandler : public ChromeV8Extension { } v8::Handle<v8::Value> DecrementKeepaliveCount(const v8::Arguments& args) { - ChromeV8Context* context = dispatcher()->v8_context_set().GetCurrent(); + ChromeV8Context* context = + dispatcher()->v8_context_set().GetByV8Context(v8_context()); if (!context) return v8::Undefined(); RenderView* render_view = context->GetRenderView(); @@ -176,14 +255,14 @@ class LazyBackgroundPageNativeHandler : public ChromeV8Extension { class ProcessInfoNativeHandler : public ChromeV8Extension { public: - explicit ProcessInfoNativeHandler( - Dispatcher* dispatcher, - const std::string& extension_id, - const std::string& context_type, - bool is_incognito_context, - int manifest_version, - bool send_request_disabled) - : ChromeV8Extension(dispatcher), + ProcessInfoNativeHandler(Dispatcher* dispatcher, + v8::Handle<v8::Context> context, + const std::string& extension_id, + const std::string& context_type, + bool is_incognito_context, + int manifest_version, + bool send_request_disabled) + : ChromeV8Extension(dispatcher, context), extension_id_(extension_id), context_type_(context_type), is_incognito_context_(is_incognito_context), @@ -239,13 +318,12 @@ class ProcessInfoNativeHandler : public ChromeV8Extension { bool send_request_disabled_; }; -class LoggingNativeHandler : public NativeHandler { +class LoggingNativeHandler : public ObjectBackedNativeHandler { public: - explicit LoggingNativeHandler(v8::Isolate* isolate) - : NativeHandler(isolate) { + explicit LoggingNativeHandler(v8::Handle<v8::Context> context) + : ObjectBackedNativeHandler(context) { RouteFunction("DCHECK", - base::Bind(&LoggingNativeHandler::Dcheck, - base::Unretained(this))); + base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this))); } v8::Handle<v8::Value> Dcheck(const v8::Arguments& args) { @@ -271,7 +349,6 @@ class LoggingNativeHandler : public NativeHandler { } } DCHECK(check_value) << error_message; - LOG(WARNING) << error_message; return v8::Undefined(); } @@ -303,20 +380,6 @@ void InstallWebstoreBindings(ModuleSystem* module_system, "chromeHiddenWebstore"); } -static v8::Handle<v8::Object> GetOrCreateChrome( - v8::Handle<v8::Context> context) { - v8::Handle<v8::String> chrome_string(v8::String::New("chrome")); - v8::Handle<v8::Object> global(context->Global()); - v8::Handle<v8::Value> chrome(global->Get(chrome_string)); - if (chrome.IsEmpty() || chrome->IsUndefined()) { - v8::Handle<v8::Object> chrome_object(v8::Object::New()); - global->Set(chrome_string, chrome_object); - return chrome_object; - } - CHECK(chrome->IsObject()); - return chrome->ToObject(); -} - } // namespace Dispatcher::Dispatcher() @@ -337,7 +400,7 @@ Dispatcher::Dispatcher() } user_script_slave_.reset(new UserScriptSlave(&extensions_)); - request_sender_.reset(new RequestSender(this, &v8_context_set_)); + request_sender_.reset(new RequestSender(this)); PopulateSourceMap(); PopulateLazyBindingsMap(); } @@ -561,62 +624,136 @@ bool Dispatcher::AllowScriptExtension(WebFrame* frame, return true; } +v8::Handle<v8::Object> Dispatcher::GetOrCreateObject( + v8::Handle<v8::Object> object, + const std::string& field) { + v8::HandleScope handle_scope; + v8::Handle<v8::String> key = v8::String::New(field.c_str()); + // This little dance is for APIs that may be unavailable but have available + // children. For example, chrome.app can be unavailable, while + // chrome.app.runtime is available. The lazy getter for chrome.app must be + // deleted, so that there isn't an error when accessing chrome.app.runtime. + if (object->Has(key)) { + v8::Handle<v8::Value> value = object->Get(key); + if (value->IsObject()) + return handle_scope.Close(v8::Handle<v8::Object>::Cast(value)); + else + object->Delete(key); + } + + v8::Handle<v8::Object> new_object = v8::Object::New(); + object->Set(key, new_object); + return handle_scope.Close(new_object); +} + +void Dispatcher::RegisterSchemaGeneratedBindings( + ModuleSystem* module_system, + ChromeV8Context* context, + v8::Handle<v8::Context> v8_context) { + std::set<std::string> apis = + ExtensionAPI::GetSharedInstance()->GetAllAPINames(); + for (std::set<std::string>::iterator it = apis.begin(); + it != apis.end(); ++it) { + const std::string& api_name = *it; + + std::vector<std::string> split; + base::SplitString(api_name, '.', &split); + + v8::Handle<v8::Object> bind_object = GetOrCreateChrome(v8_context); + for (size_t i = 0; i < split.size() - 1; ++i) + bind_object = GetOrCreateObject(bind_object, split[i]); + + if (lazy_bindings_map_.find(api_name) != lazy_bindings_map_.end()) { + InstallBindings(module_system, v8_context, api_name); + } else if (!source_map_.Contains(api_name)) { + module_system->RegisterNativeHandler( + api_name, + scoped_ptr<NativeHandler>(new BindingGeneratingNativeHandler( + module_system, + api_name, + "binding"))); + module_system->SetNativeLazyField(bind_object, + split.back(), + api_name, + "binding"); + } else { + module_system->SetLazyField(bind_object, + split.back(), + api_name, + "binding"); + } + } +} + void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system, ChromeV8Context* context) { + v8::Handle<v8::Context> v8_context = context->v8_context(); + module_system->RegisterNativeHandler("event_bindings", - scoped_ptr<NativeHandler>(EventBindings::Get(this))); + scoped_ptr<NativeHandler>(EventBindings::Create(this, v8_context))); module_system->RegisterNativeHandler("miscellaneous_bindings", - scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this))); + scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this, v8_context))); module_system->RegisterNativeHandler("apiDefinitions", - scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this))); + scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this, context))); module_system->RegisterNativeHandler("sendRequest", scoped_ptr<NativeHandler>( - new SendRequestNatives(this, request_sender_.get()))); + new SendRequestNatives(this, request_sender_.get(), context))); module_system->RegisterNativeHandler("setIcon", scoped_ptr<NativeHandler>( - new SetIconNatives(this, request_sender_.get()))); - module_system->RegisterNativeHandler("contentWatcherNative", - content_watcher_->MakeNatives()); + new SetIconNatives(this, request_sender_.get(), context))); + module_system->RegisterNativeHandler( + "contentWatcherNative", + content_watcher_->MakeNatives(v8_context)); // Natives used by multiple APIs. module_system->RegisterNativeHandler("file_system_natives", - scoped_ptr<NativeHandler>(new FileSystemNatives())); + scoped_ptr<NativeHandler>(new FileSystemNatives(v8_context))); // Custom bindings. module_system->RegisterNativeHandler("app", scoped_ptr<NativeHandler>(new AppBindings(this, context))); module_system->RegisterNativeHandler("app_runtime", - scoped_ptr<NativeHandler>(new AppRuntimeCustomBindings())); + scoped_ptr<NativeHandler>( + new AppRuntimeCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("app_window", - scoped_ptr<NativeHandler>(new AppWindowCustomBindings(this))); + scoped_ptr<NativeHandler>( + new AppWindowCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("context_menus", - scoped_ptr<NativeHandler>(new ContextMenusCustomBindings())); + scoped_ptr<NativeHandler>( + new ContextMenusCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("extension", scoped_ptr<NativeHandler>( - new ExtensionCustomBindings(this))); + new ExtensionCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("sync_file_system", - scoped_ptr<NativeHandler>(new SyncFileSystemCustomBindings())); + scoped_ptr<NativeHandler>( + new SyncFileSystemCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("file_browser_handler", - scoped_ptr<NativeHandler>(new FileBrowserHandlerCustomBindings())); + scoped_ptr<NativeHandler>(new FileBrowserHandlerCustomBindings( + this, v8_context))); module_system->RegisterNativeHandler("file_browser_private", - scoped_ptr<NativeHandler>(new FileBrowserPrivateCustomBindings())); + scoped_ptr<NativeHandler>(new FileBrowserPrivateCustomBindings( + this, v8_context))); module_system->RegisterNativeHandler("i18n", - scoped_ptr<NativeHandler>(new I18NCustomBindings())); + scoped_ptr<NativeHandler>( + new I18NCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("mediaGalleries", - scoped_ptr<NativeHandler>(new MediaGalleriesCustomBindings())); + scoped_ptr<NativeHandler>( + new MediaGalleriesCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("page_actions", scoped_ptr<NativeHandler>( - new PageActionsCustomBindings(this))); + new PageActionsCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("page_capture", - scoped_ptr<NativeHandler>(new PageCaptureCustomBindings())); + scoped_ptr<NativeHandler>( + new PageCaptureCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("runtime", scoped_ptr<NativeHandler>(new RuntimeCustomBindings(this, context))); module_system->RegisterNativeHandler("tabs", - scoped_ptr<NativeHandler>(new TabsCustomBindings())); + scoped_ptr<NativeHandler>(new TabsCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("tts", - scoped_ptr<NativeHandler>(new TTSCustomBindings())); + scoped_ptr<NativeHandler>(new TTSCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("web_request", - scoped_ptr<NativeHandler>(new WebRequestCustomBindings())); + scoped_ptr<NativeHandler>( + new WebRequestCustomBindings(this, v8_context))); module_system->RegisterNativeHandler("webstore", scoped_ptr<NativeHandler>(new WebstoreBindings(this, context))); } @@ -625,11 +762,9 @@ void Dispatcher::PopulateSourceMap() { source_map_.RegisterSource("event_bindings", IDR_EVENT_BINDINGS_JS); source_map_.RegisterSource("miscellaneous_bindings", IDR_MISCELLANEOUS_BINDINGS_JS); - source_map_.RegisterSource("schema_generated_bindings", - IDR_SCHEMA_GENERATED_BINDINGS_JS); source_map_.RegisterSource("json", IDR_JSON_JS); source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS); - source_map_.RegisterSource("apitest", IDR_EXTENSION_APITEST_JS); + source_map_.RegisterSource("test", IDR_TEST_CUSTOM_BINDINGS_JS); // Libraries. source_map_.RegisterSource("contentWatcher", IDR_CONTENT_WATCHER_JS); @@ -698,13 +833,16 @@ void Dispatcher::PopulateSourceMap() { source_map_.RegisterSource("webRequestInternal", IDR_WEB_REQUEST_INTERNAL_CUSTOM_BINDINGS_JS); source_map_.RegisterSource("webstore", IDR_WEBSTORE_CUSTOM_BINDINGS_JS); + source_map_.RegisterSource("binding", IDR_BINDING_JS); // Platform app sources that are not API-specific.. source_map_.RegisterSource("tagWatcher", IDR_TAG_WATCHER_JS); - source_map_.RegisterSource("webview", IDR_WEB_VIEW_JS); - source_map_.RegisterSource("webview.experimental", + // Note: webView not webview so that this doesn't interfere with the + // chrome.webview API bindings. + source_map_.RegisterSource("webView", IDR_WEB_VIEW_JS); + source_map_.RegisterSource("webViewExperimental", IDR_WEB_VIEW_EXPERIMENTAL_JS); - source_map_.RegisterSource("denyWebview", IDR_WEB_VIEW_DENY_JS); + source_map_.RegisterSource("denyWebView", IDR_WEB_VIEW_DENY_JS); source_map_.RegisterSource("platformApp", IDR_PLATFORM_APP_JS); source_map_.RegisterSource("injectAppTitlebar", IDR_INJECT_APP_TITLEBAR_JS); } @@ -776,15 +914,22 @@ void Dispatcher::DidCreateScriptContext( RegisterNativeHandlers(module_system.get(), context); - v8::Isolate* isolate = v8_context->GetIsolate(); + module_system->RegisterNativeHandler("chrome", + scoped_ptr<NativeHandler>(new ChromeNativeHandler(v8_context))); module_system->RegisterNativeHandler("chrome_hidden", - scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(isolate))); + scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(v8_context))); module_system->RegisterNativeHandler("print", - scoped_ptr<NativeHandler>(new PrintNativeHandler(isolate))); + scoped_ptr<NativeHandler>(new PrintNativeHandler(v8_context))); module_system->RegisterNativeHandler("lazy_background_page", - scoped_ptr<NativeHandler>(new LazyBackgroundPageNativeHandler(this))); + scoped_ptr<NativeHandler>( + new LazyBackgroundPageNativeHandler(this, v8_context))); module_system->RegisterNativeHandler("logging", - scoped_ptr<NativeHandler>(new LoggingNativeHandler(isolate))); + scoped_ptr<NativeHandler>(new LoggingNativeHandler(v8_context))); + module_system->RegisterNativeHandler("schema_registry", + scoped_ptr<NativeHandler>( + new SchemaRegistryNativeHandler(v8_schema_registry(), v8_context))); + module_system->RegisterNativeHandler("v8_context", + scoped_ptr<NativeHandler>(new V8ContextNativeHandler(context))); int manifest_version = extension ? extension->manifest_version() : 1; bool send_request_disabled = @@ -792,7 +937,7 @@ void Dispatcher::DidCreateScriptContext( BackgroundInfo::HasLazyBackgroundPage(extension)); module_system->RegisterNativeHandler("process", scoped_ptr<NativeHandler>(new ProcessInfoNativeHandler( - this, context->GetExtensionID(), + this, v8_context, context->GetExtensionID(), context->GetContextTypeDescription(), ChromeRenderProcessObserver::is_incognito_process(), manifest_version, send_request_disabled))); @@ -808,25 +953,20 @@ void Dispatcher::DidCreateScriptContext( InstallBindings(module_system.get(), v8_context, "app"); InstallBindings(module_system.get(), v8_context, "webstore"); break; - case Feature::BLESSED_EXTENSION_CONTEXT: case Feature::UNBLESSED_EXTENSION_CONTEXT: case Feature::CONTENT_SCRIPT_CONTEXT: { + if (extension && !extension->is_platform_app()) + module_system->Require("miscellaneous_bindings"); module_system->Require("json"); // see paranoid comment in json.js - module_system->Require("miscellaneous_bindings"); - module_system->Require("schema_generated_bindings"); - module_system->Require("apitest"); // TODO(kalman): move this code back out of the switch and execute it // regardless of |context_type|. ExtensionAPI knows how to return the // correct APIs, however, until it doesn't have a 2MB overhead we can't // load it in every process. - const std::set<std::string>& apis = context->GetAvailableExtensionAPIs(); - for (std::set<std::string>::const_iterator i = apis.begin(); - i != apis.end(); ++i) { - InstallBindings(module_system.get(), v8_context, *i); - } - + RegisterSchemaGeneratedBindings(module_system.get(), + context, + v8_context); break; } } @@ -836,11 +976,14 @@ void Dispatcher::DidCreateScriptContext( module_system->Require("platformApp"); if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) { - bool has_permission = extension->HasAPIPermission(APIPermission::kWebView); - module_system->Require(has_permission ? "webview" : "denyWebview"); - if (has_permission && - Feature::GetCurrentChannel() <= chrome::VersionInfo::CHANNEL_DEV) { - module_system->Require("webview.experimental"); + // Note: setting up the WebView class here, not the chrome.webview API. + // The API will be automatically set up when first used. + if (extension->HasAPIPermission(APIPermission::kWebView)) { + module_system->Require("webView"); + if (Feature::GetCurrentChannel() <= chrome::VersionInfo::CHANNEL_DEV) + module_system->Require("webViewExperimental"); + } else { + module_system->Require("denyWebView"); } } @@ -882,6 +1025,8 @@ void Dispatcher::WillReleaseScriptContext( return; context->DispatchOnUnloadEvent(); + // TODO(kalman): add an invalidation observer interface to ChromeV8Context. + request_sender_->InvalidateContext(context); v8_context_set_.Remove(context); VLOG(1) << "Num tracked contexts: " << v8_context_set_.size(); @@ -1118,9 +1263,8 @@ void Dispatcher::OnExtensionResponse(int request_id, request_sender_->HandleResponse(request_id, success, response, error); } -bool Dispatcher::CheckCurrentContextAccessToExtensionAPI( - const std::string& function_name) const { - ChromeV8Context* context = v8_context_set().GetCurrent(); +bool Dispatcher::CheckContextAccessToExtensionAPI( + const std::string& function_name, ChromeV8Context* context) const { if (!context) { DLOG(ERROR) << "Not in a v8::Context"; return false; |