| // 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/script_context.h" |
| #include "extensions/renderer/script_context_set.h" |
| #include "third_party/blink/public/web/web_local_frame.h" |
| |
| namespace extensions { |
| |
| V8ContextNativeHandler::V8ContextNativeHandler(ScriptContext* context) |
| : ObjectBackedNativeHandler(context), context_(context) {} |
| |
| void V8ContextNativeHandler::AddRoutes() { |
| RouteHandlerFunction( |
| "GetAvailability", |
| base::BindRepeating(&V8ContextNativeHandler::GetAvailability, |
| base::Unretained(this))); |
| RouteHandlerFunction( |
| "GetModuleSystem", |
| base::BindRepeating(&V8ContextNativeHandler::GetModuleSystem, |
| base::Unretained(this))); |
| } |
| |
| void V8ContextNativeHandler::GetAvailability( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| CHECK_EQ(args.Length(), 1); |
| v8::Isolate* isolate = args.GetIsolate(); |
| std::string api_name = *v8::String::Utf8Value(isolate, args[0]); |
| Feature::Availability availability = context_->GetAvailability(api_name); |
| |
| v8::Local<v8::Context> context = context_->v8_context(); |
| v8::Local<v8::Object> ret = v8::Object::New(isolate); |
| v8::Maybe<bool> maybe = ret->SetPrototype(context, v8::Null(isolate)); |
| CHECK(maybe.IsJust() && maybe.FromJust()); |
| ret->Set(context, |
| v8::String::NewFromUtf8(isolate, "is_available", |
| v8::NewStringType::kInternalized) |
| .ToLocalChecked(), |
| v8::Boolean::New(isolate, availability.is_available())) |
| .ToChecked(); |
| ret->Set(context, |
| v8::String::NewFromUtf8(isolate, "message", |
| v8::NewStringType::kInternalized) |
| .ToLocalChecked(), |
| v8::String::NewFromUtf8(isolate, availability.message().c_str(), |
| v8::NewStringType::kNormal) |
| .ToLocalChecked()) |
| .ToChecked(); |
| ret->Set(context, |
| v8::String::NewFromUtf8(isolate, "result", |
| v8::NewStringType::kInternalized) |
| .ToLocalChecked(), |
| v8::Integer::New(isolate, availability.result())) |
| .ToChecked(); |
| args.GetReturnValue().Set(ret); |
| } |
| |
| void V8ContextNativeHandler::GetModuleSystem( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| CHECK_EQ(args.Length(), 1); |
| CHECK(args[0]->IsObject()); |
| ScriptContext* context = ScriptContextSet::GetContextByObject( |
| v8::Local<v8::Object>::Cast(args[0])); |
| if (context && blink::WebFrame::ScriptCanAccess(context->web_frame())) |
| args.GetReturnValue().Set(context->module_system()->NewInstance()); |
| } |
| |
| } // namespace extensions |