1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "extensions/renderer/v8_context_native_handler.h" 6 7 #include "base/bind.h" 8 #include "extensions/common/features/feature.h" 9 #include "extensions/renderer/dispatcher.h" 10 #include "extensions/renderer/script_context.h" 11 12 namespace extensions { 13 14 V8ContextNativeHandler::V8ContextNativeHandler(ScriptContext* context, 15 Dispatcher* dispatcher) 16 : ObjectBackedNativeHandler(context), 17 context_(context), 18 dispatcher_(dispatcher) { 19 RouteFunction("GetAvailability", 20 base::Bind(&V8ContextNativeHandler::GetAvailability, 21 base::Unretained(this))); 22 RouteFunction("GetModuleSystem", 23 base::Bind(&V8ContextNativeHandler::GetModuleSystem, 24 base::Unretained(this))); 25 RouteFunction( 26 "RunWithNativesEnabledModuleSystem", 27 base::Bind(&V8ContextNativeHandler::RunWithNativesEnabledModuleSystem, 28 base::Unretained(this))); 29 } 30 31 void V8ContextNativeHandler::GetAvailability( 32 const v8::FunctionCallbackInfo<v8::Value>& args) { 33 CHECK_EQ(args.Length(), 1); 34 v8::Isolate* isolate = args.GetIsolate(); 35 std::string api_name = *v8::String::Utf8Value(args[0]->ToString()); 36 Feature::Availability availability = context_->GetAvailability(api_name); 37 38 v8::Handle<v8::Object> ret = v8::Object::New(isolate); 39 ret->Set(v8::String::NewFromUtf8(isolate, "is_available"), 40 v8::Boolean::New(isolate, availability.is_available())); 41 ret->Set(v8::String::NewFromUtf8(isolate, "message"), 42 v8::String::NewFromUtf8(isolate, availability.message().c_str())); 43 ret->Set(v8::String::NewFromUtf8(isolate, "result"), 44 v8::Integer::New(isolate, availability.result())); 45 args.GetReturnValue().Set(ret); 46 } 47 48 void V8ContextNativeHandler::GetModuleSystem( 49 const v8::FunctionCallbackInfo<v8::Value>& args) { 50 CHECK_EQ(args.Length(), 1); 51 CHECK(args[0]->IsObject()); 52 v8::Handle<v8::Context> v8_context = 53 v8::Handle<v8::Object>::Cast(args[0])->CreationContext(); 54 ScriptContext* context = 55 dispatcher_->script_context_set().GetByV8Context(v8_context); 56 args.GetReturnValue().Set(context->module_system()->NewInstance()); 57 } 58 59 void V8ContextNativeHandler::RunWithNativesEnabledModuleSystem( 60 const v8::FunctionCallbackInfo<v8::Value>& args) { 61 CHECK_EQ(args.Length(), 1); 62 CHECK(args[0]->IsFunction()); 63 v8::Handle<v8::Value> call_with_args[] = { 64 context()->module_system()->NewInstance() 65 }; 66 ModuleSystem::NativesEnabledScope natives_enabled(context()->module_system()); 67 context()->CallFunction( 68 v8::Handle<v8::Function>::Cast(args[0]), 1, call_with_args); 69 } 70 71 } // namespace extensions 72