diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-03-07 15:45:31 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-03-15 16:54:19 +0100 |
commit | b0de48e85441ff710aab240fdfa8a34adbbee976 (patch) | |
tree | 9b0d0ee1ca888a2d0db99d6350044d6095a84570 /src/node_messaging.cc | |
parent | 7e2088f773d97e00e29cacdc20e1a36b80528be0 (diff) | |
download | android-node-v8-b0de48e85441ff710aab240fdfa8a34adbbee976.tar.gz android-node-v8-b0de48e85441ff710aab240fdfa8a34adbbee976.tar.bz2 android-node-v8-b0de48e85441ff710aab240fdfa8a34adbbee976.zip |
src,lib: make DOMException available in all Contexts
This allows using `DOMException` from Node.js code for any
`vm.Context`.
PR-URL: https://github.com/nodejs/node/pull/26497
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/node_messaging.cc')
-rw-r--r-- | src/node_messaging.cc | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/src/node_messaging.cc b/src/node_messaging.cc index 650d64b395..9b9bab0814 100644 --- a/src/node_messaging.cc +++ b/src/node_messaging.cc @@ -177,19 +177,30 @@ uint32_t Message::AddWASMModule(WasmModuleObject::TransferrableModule&& mod) { namespace { -void ThrowDataCloneException(Environment* env, Local<String> message) { +void ThrowDataCloneException(Local<Context> context, Local<String> message) { + Isolate* isolate = context->GetIsolate(); Local<Value> argv[] = { message, - FIXED_ONE_BYTE_STRING(env->isolate(), "DataCloneError") + FIXED_ONE_BYTE_STRING(isolate, "DataCloneError") }; Local<Value> exception; - Local<Function> domexception_ctor = env->domexception_function(); - CHECK(!domexception_ctor.IsEmpty()); - if (!domexception_ctor->NewInstance(env->context(), arraysize(argv), argv) + + Local<Object> per_context_bindings; + Local<Value> domexception_ctor_val; + if (!GetPerContextExports(context).ToLocal(&per_context_bindings) || + !per_context_bindings->Get(context, + FIXED_ONE_BYTE_STRING(isolate, "DOMException")) + .ToLocal(&domexception_ctor_val)) { + return; + } + + CHECK(domexception_ctor_val->IsFunction()); + Local<Function> domexception_ctor = domexception_ctor_val.As<Function>(); + if (!domexception_ctor->NewInstance(context, arraysize(argv), argv) .ToLocal(&exception)) { return; } - env->isolate()->ThrowException(exception); + isolate->ThrowException(exception); } // This tells V8 how to serialize objects that it does not understand @@ -201,7 +212,7 @@ class SerializerDelegate : public ValueSerializer::Delegate { : env_(env), context_(context), msg_(m) {} void ThrowDataCloneError(Local<String> message) override { - ThrowDataCloneException(env_, message); + ThrowDataCloneException(context_, message); } Maybe<bool> WriteHostObject(Isolate* isolate, Local<Object> object) override { @@ -309,7 +320,7 @@ Maybe<bool> Message::Serialize(Environment* env, if (std::find(array_buffers.begin(), array_buffers.end(), ab) != array_buffers.end()) { ThrowDataCloneException( - env, + context, FIXED_ONE_BYTE_STRING( env->isolate(), "Transfer list contains duplicate ArrayBuffer")); @@ -326,7 +337,7 @@ Maybe<bool> Message::Serialize(Environment* env, // Check if the source MessagePort is being transferred. if (!source_port.IsEmpty() && entry == source_port) { ThrowDataCloneException( - env, + context, FIXED_ONE_BYTE_STRING(env->isolate(), "Transfer list contains source port")); return Nothing<bool>(); @@ -334,7 +345,7 @@ Maybe<bool> Message::Serialize(Environment* env, MessagePort* port = Unwrap<MessagePort>(entry.As<Object>()); if (port == nullptr || port->IsDetached()) { ThrowDataCloneException( - env, + context, FIXED_ONE_BYTE_STRING( env->isolate(), "MessagePort in transfer list is already detached")); @@ -343,7 +354,7 @@ Maybe<bool> Message::Serialize(Environment* env, if (std::find(delegate.ports_.begin(), delegate.ports_.end(), port) != delegate.ports_.end()) { ThrowDataCloneException( - env, + context, FIXED_ONE_BYTE_STRING( env->isolate(), "Transfer list contains duplicate MessagePort")); @@ -811,13 +822,6 @@ static void MessageChannel(const FunctionCallbackInfo<Value>& args) { .FromJust(); } -static void RegisterDOMException(const FunctionCallbackInfo<Value>& args) { - Environment* env = Environment::GetCurrent(args); - CHECK_EQ(args.Length(), 1); - CHECK(args[0]->IsFunction()); - env->set_domexception_function(args[0].As<Function>()); -} - static void InitMessaging(Local<Object> target, Local<Value> unused, Local<Context> context, @@ -839,8 +843,6 @@ static void InitMessaging(Local<Object> target, GetMessagePortConstructor(env, context).ToLocalChecked()) .FromJust(); - env->SetMethod(target, "registerDOMException", RegisterDOMException); - // These are not methods on the MessagePort prototype, because // the browser equivalents do not provide them. env->SetMethod(target, "stopMessagePort", MessagePort::Stop); |