diff --git a/lib/internal/worker/io.js b/lib/internal/worker/io.js index 95c5515d14..9ec95509b5 100644 --- a/lib/internal/worker/io.js +++ b/lib/internal/worker/io.js @@ -107,6 +107,10 @@ function validateMessagePort(port, name) { throw new ERR_INVALID_ARG_TYPE(name, 'MessagePort', port); } +function isMessageEvent(value) { + return value != null && kData in value; +} + class MessageEvent extends Event { constructor(type, { data = null, @@ -131,19 +135,49 @@ class MessageEvent extends Event { ObjectDefineProperties(MessageEvent.prototype, { data: { - get() { return this[kData]; }, enumerable: true, configurable: true + get() { + if (!isMessageEvent(this)) + throw new ERR_INVALID_THIS('MessageEvent'); + return this[kData]; + }, + enumerable: true, + configurable: true, }, origin: { - get() { return this[kOrigin]; }, enumerable: true, configurable: true + get() { + if (!isMessageEvent(this)) + throw new ERR_INVALID_THIS('MessageEvent'); + return this[kOrigin]; + }, + enumerable: true, + configurable: true, }, lastEventId: { - get() { return this[kLastEventId]; }, enumerable: true, configurable: true + get() { + if (!isMessageEvent(this)) + throw new ERR_INVALID_THIS('MessageEvent'); + return this[kLastEventId]; + }, + enumerable: true, + configurable: true, }, source: { - get() { return this[kSource]; }, enumerable: true, configurable: true + get() { + if (!isMessageEvent(this)) + throw new ERR_INVALID_THIS('MessageEvent'); + return this[kSource]; + }, + enumerable: true, + configurable: true, }, ports: { - get() { return this[kPorts]; }, enumerable: true, configurable: true + get() { + if (!isMessageEvent(this)) + throw new ERR_INVALID_THIS('MessageEvent'); + return this[kPorts]; + }, + enumerable: true, + configurable: true, }, }); diff --git a/test/parallel/test-messageevent-brandcheck.js b/test/parallel/test-messageevent-brandcheck.js new file mode 100644 index 0000000000..2174b3f7bb --- /dev/null +++ b/test/parallel/test-messageevent-brandcheck.js @@ -0,0 +1,21 @@ +// Flags: --expose-internals +'use strict'; + +require('../common'); +const assert = require('assert'); + +const { + MessageEvent, +} = require('internal/worker/io'); + +[ + 'data', + 'origin', + 'lastEventId', + 'source', + 'ports', +].forEach((i) => { + assert.throws(() => Reflect.get(MessageEvent.prototype, i, {}), { + code: 'ERR_INVALID_THIS', + }); +});