summaryrefslogtreecommitdiff
path: root/op_crates/web/02_abort_signal.js
diff options
context:
space:
mode:
authorBenjamin Gruenbaum <benjamingr@gmail.com>2020-11-06 03:40:36 +0200
committerGitHub <noreply@github.com>2020-11-06 12:40:36 +1100
commitbfa00bef220fd26bed26940cdcaf5edf4bf83e13 (patch)
treee9462c08bcb22ea71e866532bc1afedad5f40048 /op_crates/web/02_abort_signal.js
parent23557331c960d6dd548904796f3948dde09972d0 (diff)
fix(op_crates/web): define abort event handler on prototype (#8230)
Diffstat (limited to 'op_crates/web/02_abort_signal.js')
-rw-r--r--op_crates/web/02_abort_signal.js43
1 files changed, 24 insertions, 19 deletions
diff --git a/op_crates/web/02_abort_signal.js b/op_crates/web/02_abort_signal.js
index a963b1807..53745c52b 100644
--- a/op_crates/web/02_abort_signal.js
+++ b/op_crates/web/02_abort_signal.js
@@ -36,24 +36,6 @@
throw new TypeError("Illegal constructor.");
}
super();
- // HTML specification section 8.1.5.1
- let eventHandler = null;
- Object.defineProperty(this, "onabort", {
- get() {
- return eventHandler;
- },
- set(value) {
- if (eventHandler) {
- this.removeEventListener("abort", eventHandler);
- }
- eventHandler = value;
- if (typeof eventHandler === "function") {
- this.addEventListener("abort", value);
- }
- },
- configurable: true,
- enumerable: true,
- });
}
get aborted() {
@@ -64,7 +46,7 @@
return "AbortSignal";
}
}
-
+ defineEventHandler(AbortSignal.prototype, "abort");
class AbortController {
#signal = new AbortSignal(illegalConstructorKey);
@@ -81,6 +63,29 @@
}
}
+ const handlerSymbol = Symbol("eventHandlers");
+ function defineEventHandler(emitter, name) {
+ // HTML specification section 8.1.5.1
+ Object.defineProperty(emitter, `on${name}`, {
+ get() {
+ return this[handlerSymbol]?.get(name);
+ },
+ 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);
+ },
+ configurable: true,
+ enumerable: true,
+ });
+ }
+
window.AbortSignal = AbortSignal;
window.AbortController = AbortController;
window.__bootstrap = window.__bootstrap || {};