diff options
| author | Benjamin Gruenbaum <benjamingr@gmail.com> | 2020-11-10 05:34:42 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-10 14:34:42 +1100 |
| commit | 94b68f90697954292f4355cf91e7f75868d8d664 (patch) | |
| tree | 82c2c6e70d4ac2af0f24f8821732e24ad6fc256b /cli/rt/01_web_util.js | |
| parent | 0982056ff64368451c38b622de90f62fbade89fd (diff) | |
fix(cli/rt): dom handler order in websocket (#8320)
Diffstat (limited to 'cli/rt/01_web_util.js')
| -rw-r--r-- | cli/rt/01_web_util.js | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/cli/rt/01_web_util.js b/cli/rt/01_web_util.js index 4a3df65ce..c843ac086 100644 --- a/cli/rt/01_web_util.js +++ b/cli/rt/01_web_util.js @@ -113,9 +113,44 @@ } } + const handlerSymbol = 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; + } + function defineEventHandler(emitter, name) { + // HTML specification section 8.1.5.1 + Object.defineProperty(emitter, `on${name}`, { + get() { + return this[handlerSymbol]?.get(name)?.handler; + }, + set(value) { + if (!this[handlerSymbol]) { + this[handlerSymbol] = new Map(); + } + let handlerWrapper = this[handlerSymbol]?.get(name); + if (handlerWrapper) { + handlerWrapper.handler = value; + } else { + handlerWrapper = makeWrappedHandler(value); + this.addEventListener(name, handlerWrapper); + } + this[handlerSymbol].set(name, handlerWrapper); + }, + configurable: true, + enumerable: true, + }); + } window.__bootstrap.webUtil = { illegalConstructorKey, requiredArguments, + defineEventHandler, cloneValue, }; })(this); |
