src: expose DOMException to internalBinding('message') for testing

Instead of using a hack to get it in the test.

PR-URL: https://github.com/nodejs/node/pull/28072
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
Joyee Cheung 2019-06-05 17:06:32 +02:00 committed by Anna Henningsen
parent 0c1fd20693
commit 890223dede
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
2 changed files with 25 additions and 26 deletions

View File

@ -186,27 +186,30 @@ uint32_t Message::AddWASMModule(WasmModuleObject::TransferrableModule&& mod) {
namespace { namespace {
void ThrowDataCloneException(Local<Context> context, Local<String> message) { MaybeLocal<Function> GetDOMException(Local<Context> context) {
Isolate* isolate = context->GetIsolate(); Isolate* isolate = context->GetIsolate();
Local<Value> argv[] = {
message,
FIXED_ONE_BYTE_STRING(isolate, "DataCloneError")
};
Local<Value> exception;
Local<Object> per_context_bindings; Local<Object> per_context_bindings;
Local<Value> domexception_ctor_val; Local<Value> domexception_ctor_val;
if (!GetPerContextExports(context).ToLocal(&per_context_bindings) || if (!GetPerContextExports(context).ToLocal(&per_context_bindings) ||
!per_context_bindings->Get(context, !per_context_bindings->Get(context,
FIXED_ONE_BYTE_STRING(isolate, "DOMException")) FIXED_ONE_BYTE_STRING(isolate, "DOMException"))
.ToLocal(&domexception_ctor_val)) { .ToLocal(&domexception_ctor_val)) {
return; return MaybeLocal<Function>();
} }
CHECK(domexception_ctor_val->IsFunction()); CHECK(domexception_ctor_val->IsFunction());
Local<Function> domexception_ctor = domexception_ctor_val.As<Function>(); Local<Function> domexception_ctor = domexception_ctor_val.As<Function>();
if (!domexception_ctor->NewInstance(context, arraysize(argv), argv) return domexception_ctor;
.ToLocal(&exception)) { }
void ThrowDataCloneException(Local<Context> context, Local<String> message) {
Isolate* isolate = context->GetIsolate();
Local<Value> argv[] = {message,
FIXED_ONE_BYTE_STRING(isolate, "DataCloneError")};
Local<Value> exception;
Local<Function> domexception_ctor;
if (!GetDOMException(context).ToLocal(&domexception_ctor) ||
!domexception_ctor->NewInstance(context, arraysize(argv), argv)
.ToLocal(&exception)) {
return; return;
} }
isolate->ThrowException(exception); isolate->ThrowException(exception);
@ -900,6 +903,15 @@ static void InitMessaging(Local<Object> target,
env->SetMethod(target, "receiveMessageOnPort", MessagePort::ReceiveMessage); env->SetMethod(target, "receiveMessageOnPort", MessagePort::ReceiveMessage);
env->SetMethod(target, "moveMessagePortToContext", env->SetMethod(target, "moveMessagePortToContext",
MessagePort::MoveToContext); MessagePort::MoveToContext);
{
Local<Function> domexception = GetDOMException(context).ToLocalChecked();
target
->Set(context,
FIXED_ONE_BYTE_STRING(env->isolate(), "DOMException"),
domexception)
.Check();
}
} }
} // anonymous namespace } // anonymous namespace

View File

@ -3,29 +3,16 @@
// Flags: --expose-internals // Flags: --expose-internals
require('../common'); require('../common');
const assert = require('assert');
const { WPTRunner } = require('../common/wpt'); const { WPTRunner } = require('../common/wpt');
const { internalBinding } = require('internal/test/binding');
const { DOMException } = internalBinding('messaging');
const runner = new WPTRunner('url'); const runner = new WPTRunner('url');
// Copy global descriptors from the global object // Copy global descriptors from the global object
runner.copyGlobalsFromObject(global, ['URL', 'URLSearchParams']); runner.copyGlobalsFromObject(global, ['URL', 'URLSearchParams']);
// Needed by urlsearchparams-constructor.any.js // Needed by urlsearchparams-constructor.any.js
let DOMException;
runner.defineGlobal('DOMException', { runner.defineGlobal('DOMException', {
get() { get() {
// A 'hack' to get the DOMException constructor since we don't have it
// on the global object.
if (DOMException === undefined) {
const port = new (require('worker_threads').MessagePort)();
const ab = new ArrayBuffer(1);
try {
port.postMessage(ab, [ab, ab]);
} catch (err) {
DOMException = err.constructor;
}
assert.strictEqual(DOMException.name, 'DOMException');
}
return DOMException; return DOMException;
} }
}); });