// Copyright 2014 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. #include "extensions/renderer/v8_context_native_handler.h" #include "base/bind.h" #include "extensions/common/features/feature.h" #include "extensions/renderer/dispatcher.h" #include "extensions/renderer/script_context.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" namespace extensions { V8ContextNativeHandler::V8ContextNativeHandler(ScriptContext* context, Dispatcher* dispatcher) : ObjectBackedNativeHandler(context), context_(context), dispatcher_(dispatcher) { RouteFunction("GetAvailability", base::Bind(&V8ContextNativeHandler::GetAvailability, base::Unretained(this))); RouteFunction("GetModuleSystem", base::Bind(&V8ContextNativeHandler::GetModuleSystem, base::Unretained(this))); RouteFunction( "RunWithNativesEnabled", base::Bind(&V8ContextNativeHandler::RunWithNativesEnabled, base::Unretained(this))); } void V8ContextNativeHandler::GetAvailability( const v8::FunctionCallbackInfo& args) { CHECK_EQ(args.Length(), 1); v8::Isolate* isolate = args.GetIsolate(); std::string api_name = *v8::String::Utf8Value(args[0]); Feature::Availability availability = context_->GetAvailability(api_name); v8::Local ret = v8::Object::New(isolate); ret->Set(v8::String::NewFromUtf8(isolate, "is_available"), v8::Boolean::New(isolate, availability.is_available())); ret->Set(v8::String::NewFromUtf8(isolate, "message"), v8::String::NewFromUtf8(isolate, availability.message().c_str())); ret->Set(v8::String::NewFromUtf8(isolate, "result"), v8::Integer::New(isolate, availability.result())); args.GetReturnValue().Set(ret); } void V8ContextNativeHandler::GetModuleSystem( const v8::FunctionCallbackInfo& args) { CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsObject()); v8::Local v8_context = v8::Local::Cast(args[0])->CreationContext(); ScriptContext* context = dispatcher_->script_context_set().GetByV8Context(v8_context); if (blink::WebFrame::scriptCanAccess(context->web_frame())) args.GetReturnValue().Set(context->module_system()->NewInstance()); } void V8ContextNativeHandler::RunWithNativesEnabled( const v8::FunctionCallbackInfo& args) { CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsFunction()); ModuleSystem::NativesEnabledScope natives_enabled(context()->module_system()); context()->CallFunction(v8::Local::Cast(args[0])); } } // namespace extensions