Guarantee CleanUpAfterPage gets run even if CloseConnection fails.
[chromium-blink-merge.git] / extensions / renderer / v8_context_native_handler.cc
blob0fd538d9ec932be6bf68b3b5f75840538192e2c1
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"
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"
12 namespace extensions {
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)));
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