summaryrefslogtreecommitdiff
path: root/extensions/web/02_event.js
diff options
context:
space:
mode:
authorLuca Casonato <hello@lcas.dev>2021-06-21 19:53:52 +0200
committerGitHub <noreply@github.com>2021-06-21 19:53:52 +0200
commitf9ff981daf6931a01e1516db0b5714e7a94f145b (patch)
tree677a6e3f12c86210cc635e68b9afc06c4cb1d2f9 /extensions/web/02_event.js
parenta2f939b99c43c6344f109144d7b01c95294a6f8b (diff)
feat: `MessageChannel` and `MessagePort` (#11051)
This commit introduces support for MessageChannel and MessagePort. MessagePorts can be transfered across other MessagePorts.
Diffstat (limited to 'extensions/web/02_event.js')
-rw-r--r--extensions/web/02_event.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/extensions/web/02_event.js b/extensions/web/02_event.js
index 8ee6acc61..17d5cb54e 100644
--- a/extensions/web/02_event.js
+++ b/extensions/web/02_event.js
@@ -1129,6 +1129,7 @@
});
this.data = eventInitDict?.data ?? null;
+ this.ports = eventInitDict?.ports ?? [];
this.origin = eventInitDict?.origin ?? "";
this.lastEventId = eventInitDict?.lastEventId ?? "";
}
@@ -1196,6 +1197,46 @@
}
}
+ const _eventHandlers = Symbol("eventHandlers");
+
+ function makeWrappedHandler(handler) {
+ function wrappedHandler(...args) {
+ if (typeof wrappedHandler.handler !== "function") {
+ return;
+ }
+ return wrappedHandler.handler.call(this, ...args);
+ }
+ wrappedHandler.handler = handler;
+ return wrappedHandler;
+ }
+
+ // TODO(benjamingr) reuse this here and websocket where possible
+ function defineEventHandler(emitter, name, init) {
+ // HTML specification section 8.1.5.1
+ Object.defineProperty(emitter, `on${name}`, {
+ get() {
+ return this[_eventHandlers]?.get(name)?.handler;
+ },
+ set(value) {
+ if (!this[_eventHandlers]) {
+ this[_eventHandlers] = new Map();
+ }
+ let handlerWrapper = this[_eventHandlers]?.get(name);
+ if (handlerWrapper) {
+ console.log("foo");
+ handlerWrapper.handler = value;
+ } else {
+ handlerWrapper = makeWrappedHandler(value);
+ this.addEventListener(name, handlerWrapper);
+ init?.(this);
+ }
+ this[_eventHandlers].set(name, handlerWrapper);
+ },
+ configurable: true,
+ enumerable: true,
+ });
+ }
+
window.Event = Event;
window.EventTarget = EventTarget;
window.ErrorEvent = ErrorEvent;
@@ -1213,5 +1254,6 @@
window.__bootstrap.event = {
setIsTrusted,
setTarget,
+ defineEventHandler,
};
})(this);