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
12namespace extensions {
13
14V8ContextNativeHandler::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
31void 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
48void 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
59void 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