| Index: extensions/renderer/binding_generating_native_handler.cc
|
| diff --git a/extensions/renderer/binding_generating_native_handler.cc b/extensions/renderer/binding_generating_native_handler.cc
|
| index 2f5dc6f442d48ee282e389dff302a45e69c92bd5..55ba2a04f848658978f53b2db8b03521d075aedf 100644
|
| --- a/extensions/renderer/binding_generating_native_handler.cc
|
| +++ b/extensions/renderer/binding_generating_native_handler.cc
|
| @@ -5,6 +5,7 @@
|
| #include "extensions/renderer/binding_generating_native_handler.h"
|
|
|
| #include "extensions/renderer/module_system.h"
|
| +#include "extensions/renderer/v8_maybe_helpers.h"
|
|
|
| namespace extensions {
|
|
|
| @@ -14,31 +15,57 @@ BindingGeneratingNativeHandler::BindingGeneratingNativeHandler(
|
| const std::string& bind_to)
|
| : module_system_(module_system), api_name_(api_name), bind_to_(bind_to) {}
|
|
|
| -v8::Local<v8::Object> BindingGeneratingNativeHandler::NewInstance() {
|
| +v8::MaybeLocal<v8::Object> BindingGeneratingNativeHandler::NewInstance() {
|
| + if (api_name_.size() >= v8::String::kMaxLength ||
|
| + bind_to_.size() >= v8::String::kMaxLength)
|
| + return v8::MaybeLocal<v8::Object>();
|
| +
|
| v8::Isolate* isolate = module_system_->GetIsolate();
|
| v8::EscapableHandleScope scope(isolate);
|
| - v8::Local<v8::Object> binding_module =
|
| - module_system_->Require("binding")->ToObject(isolate);
|
| - v8::Local<v8::Object> binding =
|
| - binding_module->Get(v8::String::NewFromUtf8(isolate, "Binding"))
|
| - ->ToObject(isolate);
|
| + v8::Local<v8::Context> context = isolate->GetCurrentContext();
|
| + v8::Local<v8::Object> binding_module;
|
| + if (!module_system_->Require("binding")->ToObject(context).ToLocal(
|
| + &binding_module))
|
| + return v8::MaybeLocal<v8::Object>();
|
| +
|
| + v8::Local<v8::Value> binding_value;
|
| + v8::Local<v8::Object> binding;
|
| + if (!binding_module->Get(context, ToV8String(isolate, "Binding"))
|
| + .ToLocal(&binding_value) ||
|
| + !binding_value->ToObject(context).ToLocal(&binding))
|
| + return v8::MaybeLocal<v8::Object>();
|
| +
|
| + v8::Local<v8::Value> create_binding_value;
|
| + if (!binding->Get(context, ToV8String(isolate, "create"))
|
| + .ToLocal(&create_binding_value) ||
|
| + !create_binding_value->IsFunction())
|
| + return v8::MaybeLocal<v8::Object>();
|
| v8::Local<v8::Function> create_binding =
|
| - binding->Get(v8::String::NewFromUtf8(isolate, "create"))
|
| - .As<v8::Function>();
|
| - v8::Local<v8::Value> argv[] = {
|
| - v8::String::NewFromUtf8(isolate, api_name_.c_str())};
|
| - v8::Local<v8::Object> binding_instance =
|
| - create_binding->Call(binding, arraysize(argv), argv)->ToObject(isolate);
|
| - v8::Local<v8::Function> generate =
|
| - binding_instance->Get(v8::String::NewFromUtf8(isolate, "generate"))
|
| - .As<v8::Function>();
|
| + create_binding_value.As<v8::Function>();
|
| +
|
| + v8::Local<v8::Value> argv[] = {ToV8String(isolate, api_name_.c_str())};
|
| + v8::Local<v8::Value> binding_instance_value;
|
| + v8::Local<v8::Object> binding_instance;
|
| + if (!create_binding->Call(context, binding, arraysize(argv), argv)
|
| + .ToLocal(&binding_instance_value) ||
|
| + !binding_instance_value->ToObject(context).ToLocal(&binding_instance))
|
| + return v8::MaybeLocal<v8::Object>();
|
| +
|
| + v8::Local<v8::Value> generate_value;
|
| + if (!binding_instance->Get(context, ToV8String(isolate, "generate"))
|
| + .ToLocal(&generate_value) ||
|
| + !generate_value->IsFunction())
|
| + return v8::MaybeLocal<v8::Object>();
|
| + v8::Local<v8::Function> generate = generate_value.As<v8::Function>();
|
| +
|
| v8::Local<v8::Object> object = v8::Object::New(isolate);
|
| - v8::Local<v8::Value> compiled_schema =
|
| - generate->Call(binding_instance, 0, NULL);
|
| - if (!compiled_schema.IsEmpty()) {
|
| - object->Set(v8::String::NewFromUtf8(isolate, bind_to_.c_str()),
|
| - compiled_schema);
|
| - }
|
| + v8::Local<v8::Value> compiled_schema;
|
| + if (!generate->Call(context, binding_instance, 0, NULL)
|
| + .ToLocal(&compiled_schema))
|
| + return v8::MaybeLocal<v8::Object>();
|
| +
|
| + SetProperty(context, object, ToV8String(isolate, bind_to_.c_str()),
|
| + compiled_schema);
|
| return scope.Escape(object);
|
| }
|
|
|
|
|