summaryrefslogtreecommitdiff
path: root/op_crates
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates')
-rw-r--r--op_crates/web/02_abort_signal.js23
-rw-r--r--op_crates/web/abort_controller_test.js15
2 files changed, 31 insertions, 7 deletions
diff --git a/op_crates/web/02_abort_signal.js b/op_crates/web/02_abort_signal.js
index 2b51ef1ea..a963b1807 100644
--- a/op_crates/web/02_abort_signal.js
+++ b/op_crates/web/02_abort_signal.js
@@ -36,12 +36,23 @@
throw new TypeError("Illegal constructor.");
}
super();
- this.onabort = null;
- this.addEventListener("abort", (evt) => {
- const { onabort } = this;
- if (typeof onabort === "function") {
- onabort.call(this, evt);
- }
+ // 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,
});
}
diff --git a/op_crates/web/abort_controller_test.js b/op_crates/web/abort_controller_test.js
index 0243c6628..f9ff3d166 100644
--- a/op_crates/web/abort_controller_test.js
+++ b/op_crates/web/abort_controller_test.js
@@ -23,7 +23,7 @@ function assertThrows(fn) {
}
function basicAbortController() {
- controller = new AbortController();
+ const controller = new AbortController();
assert(controller);
const { signal } = controller;
assert(signal);
@@ -83,6 +83,18 @@ function abortSignalIllegalConstructor() {
assertEquals(error.message, "Illegal constructor.");
}
+function abortSignalEventOrder() {
+ const arr = [];
+ const controller = new AbortController();
+ const { signal } = controller;
+ signal.addEventListener("abort", () => arr.push(1));
+ signal.onabort = () => arr.push(2);
+ signal.addEventListener("abort", () => arr.push(3));
+ controller.abort();
+ assertEquals(arr[0], 1);
+ assertEquals(arr[1], 2);
+ assertEquals(arr[2], 3);
+}
function main() {
basicAbortController();
signalCallsOnabort();
@@ -90,6 +102,7 @@ function main() {
onlyAbortsOnce();
controllerHasProperToString();
abortSignalIllegalConstructor();
+ abortSignalEventOrder();
}
main();