diff options
author | Benjamin Gruenbaum <benjamingr@gmail.com> | 2020-11-03 01:42:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-03 10:42:40 +1100 |
commit | 1c1889851d91807a1d480c79436dce4a32f61e9d (patch) | |
tree | 791a7b29449a8b8bf11c3d35726b0644e4dde0bd /op_crates | |
parent | c3dd19c5d37a9c0801857669b59bd708a5bb0a71 (diff) |
fix(op_crate/web): make onabort event handler web compatible (#8225)
Diffstat (limited to 'op_crates')
-rw-r--r-- | op_crates/web/02_abort_signal.js | 23 | ||||
-rw-r--r-- | op_crates/web/abort_controller_test.js | 15 |
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(); |