diff options
author | Benjamin Gruenbaum <benjamingr@gmail.com> | 2020-11-09 18:49:19 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-09 17:49:19 +0100 |
commit | 996a87b168ea22592313803d1d068065e438787f (patch) | |
tree | 9b31a0c7598fe8b81ba9cfc52476aa389dd9564f /op_crates/web/02_abort_signal.js | |
parent | c650c5c720d4ab7aa2150f0047bafa8ac7a01b61 (diff) |
fix(op_crates/web): handler order when reassign (#8264)
Diffstat (limited to 'op_crates/web/02_abort_signal.js')
-rw-r--r-- | op_crates/web/02_abort_signal.js | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/op_crates/web/02_abort_signal.js b/op_crates/web/02_abort_signal.js index 53745c52b..5e8943161 100644 --- a/op_crates/web/02_abort_signal.js +++ b/op_crates/web/02_abort_signal.js @@ -64,22 +64,35 @@ } 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); + return this[handlerSymbol]?.get(name)?.handler; }, set(value) { - const oldListener = this[handlerSymbol]?.get(name); - if (oldListener) { - this.removeEventListener(name, oldListener); - } if (!this[handlerSymbol]) { this[handlerSymbol] = new Map(); } - this.addEventListener(name, value); - this[handlerSymbol].set(value); + 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, |