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.
5 #include "extensions/renderer/v8_context_native_handler.h"
8 #include "extensions/common/features/feature.h"
9 #include "extensions/renderer/dispatcher.h"
10 #include "extensions/renderer/script_context.h"
12 namespace extensions
{
14 V8ContextNativeHandler::V8ContextNativeHandler(ScriptContext
* context
,
15 Dispatcher
* dispatcher
)
16 : ObjectBackedNativeHandler(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)));
26 "RunWithNativesEnabledModuleSystem",
27 base::Bind(&V8ContextNativeHandler::RunWithNativesEnabledModuleSystem
,
28 base::Unretained(this)));
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]);
36 Feature::Availability availability
= context_
->GetAvailability(api_name
);
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
);
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());
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()
66 ModuleSystem::NativesEnabledScope
natives_enabled(context()->module_system());
67 context()->CallFunction(
68 v8::Handle
<v8::Function
>::Cast(args
[0]), 1, call_with_args
);
71 } // namespace extensions