diff options
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); |
