diff options
author | Luca Casonato <hello@lcas.dev> | 2021-06-21 19:53:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-21 19:53:52 +0200 |
commit | f9ff981daf6931a01e1516db0b5714e7a94f145b (patch) | |
tree | 677a6e3f12c86210cc635e68b9afc06c4cb1d2f9 /extensions/web/02_event.js | |
parent | a2f939b99c43c6344f109144d7b01c95294a6f8b (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.js | 42 |
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); |