summaryrefslogtreecommitdiff
path: root/src/node_messaging.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-03-07 15:45:31 +0100
committerAnna Henningsen <anna@addaleax.net>2019-03-15 16:54:19 +0100
commitb0de48e85441ff710aab240fdfa8a34adbbee976 (patch)
tree9b0d0ee1ca888a2d0db99d6350044d6095a84570 /src/node_messaging.cc
parent7e2088f773d97e00e29cacdc20e1a36b80528be0 (diff)
downloadandroid-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.cc42
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);