worker: add brand checks for detached MessageEvent accessors

Signed-off-by: James M Snell <jasnell@gmail.com>

PR-URL: https://github.com/nodejs/node/pull/39773
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
This commit is contained in:
James M Snell
2021-08-15 07:50:24 -07:00
parent 46598b88bf
commit 9c16305a3b
2 changed files with 60 additions and 5 deletions

View File

@@ -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,
},
});

View File

@@ -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',
});
});