summaryrefslogtreecommitdiff
path: root/ext/web/13_message_port.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/web/13_message_port.js')
-rw-r--r--ext/web/13_message_port.js17
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));
}