summaryrefslogtreecommitdiff
path: root/op_crates/web/02_abort_signal.js
diff options
context:
space:
mode:
authorBenjamin Gruenbaum <benjamingr@gmail.com>2020-11-09 18:49:19 +0200
committerGitHub <noreply@github.com>2020-11-09 17:49:19 +0100
commit996a87b168ea22592313803d1d068065e438787f (patch)
tree9b31a0c7598fe8b81ba9cfc52476aa389dd9564f /op_crates/web/02_abort_signal.js
parentc650c5c720d4ab7aa2150f0047bafa8ac7a01b61 (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.js27
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,