diff options
Diffstat (limited to 'ext/web/13_message_port.js')
-rw-r--r-- | ext/web/13_message_port.js | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/ext/web/13_message_port.js b/ext/web/13_message_port.js index 24982a982..62c0328c3 100644 --- a/ext/web/13_message_port.js +++ b/ext/web/13_message_port.js @@ -89,8 +89,13 @@ const MessageChannelPrototype = MessageChannel.prototype; const _id = Symbol("id"); const MessagePortIdSymbol = _id; const _enabled = Symbol("enabled"); +const _refed = Symbol("refed"); const nodeWorkerThreadCloseCb = Symbol("nodeWorkerThreadCloseCb"); const nodeWorkerThreadCloseCbInvoked = Symbol("nodeWorkerThreadCloseCbInvoked"); +export const refMessagePort = Symbol("refMessagePort"); +/** It is used by 99_main.js and worker_threads to + * unref/ref on the global pollForMessages promise. */ +export const unrefPollForMessages = Symbol("unrefPollForMessages"); /** * @param {number} id @@ -119,6 +124,7 @@ class MessagePort extends EventTarget { [_id] = null; /** @type {boolean} */ [_enabled] = false; + [_refed] = false; constructor() { super(); @@ -216,6 +222,16 @@ class MessagePort extends EventTarget { })(); } + [refMessagePort](ref) { + if (ref && !this[_refed]) { + this[_refed] = true; + messageEventListenerCount++; + } else if (!ref && this[_refed]) { + this[_refed] = false; + messageEventListenerCount = 0; + } + } + close() { webidl.assertBranded(this, MessagePortPrototype); if (this[_id] !== null) { @@ -235,6 +251,7 @@ class MessagePort extends EventTarget { addEventListener(...args) { if (args[0] == "message") { messageEventListenerCount++; + if (!this[_refed]) this[_refed] = true; } super.addEventListener(...new SafeArrayIterator(args)); } |