11cb0ef41Sopenharmony_citest(t => { 21cb0ef41Sopenharmony_ci const c = new AbortController(), 31cb0ef41Sopenharmony_ci s = c.signal; 41cb0ef41Sopenharmony_ci let state = "begin"; 51cb0ef41Sopenharmony_ci 61cb0ef41Sopenharmony_ci assert_false(s.aborted); 71cb0ef41Sopenharmony_ci assert_true("reason" in s, "signal has reason property"); 81cb0ef41Sopenharmony_ci assert_equals(s.reason, undefined, "signal.reason is initially undefined"); 91cb0ef41Sopenharmony_ci 101cb0ef41Sopenharmony_ci s.addEventListener("abort", 111cb0ef41Sopenharmony_ci t.step_func(e => { 121cb0ef41Sopenharmony_ci assert_equals(state, "begin"); 131cb0ef41Sopenharmony_ci state = "aborted"; 141cb0ef41Sopenharmony_ci }) 151cb0ef41Sopenharmony_ci ); 161cb0ef41Sopenharmony_ci c.abort(); 171cb0ef41Sopenharmony_ci 181cb0ef41Sopenharmony_ci assert_equals(state, "aborted"); 191cb0ef41Sopenharmony_ci assert_true(s.aborted); 201cb0ef41Sopenharmony_ci assert_true(s.reason instanceof DOMException, "signal.reason is DOMException"); 211cb0ef41Sopenharmony_ci assert_equals(s.reason.name, "AbortError", "signal.reason is AbortError"); 221cb0ef41Sopenharmony_ci 231cb0ef41Sopenharmony_ci c.abort(); 241cb0ef41Sopenharmony_ci}, "AbortController abort() should fire event synchronously"); 251cb0ef41Sopenharmony_ci 261cb0ef41Sopenharmony_citest(t => { 271cb0ef41Sopenharmony_ci const controller = new AbortController(); 281cb0ef41Sopenharmony_ci const signal = controller.signal; 291cb0ef41Sopenharmony_ci assert_equals(controller.signal, signal, 301cb0ef41Sopenharmony_ci "value of controller.signal should not have changed"); 311cb0ef41Sopenharmony_ci controller.abort(); 321cb0ef41Sopenharmony_ci assert_equals(controller.signal, signal, 331cb0ef41Sopenharmony_ci "value of controller.signal should still not have changed"); 341cb0ef41Sopenharmony_ci}, "controller.signal should always return the same object"); 351cb0ef41Sopenharmony_ci 361cb0ef41Sopenharmony_citest(t => { 371cb0ef41Sopenharmony_ci const controller = new AbortController(); 381cb0ef41Sopenharmony_ci const signal = controller.signal; 391cb0ef41Sopenharmony_ci let eventCount = 0; 401cb0ef41Sopenharmony_ci signal.onabort = () => { 411cb0ef41Sopenharmony_ci ++eventCount; 421cb0ef41Sopenharmony_ci }; 431cb0ef41Sopenharmony_ci controller.abort(); 441cb0ef41Sopenharmony_ci assert_true(signal.aborted); 451cb0ef41Sopenharmony_ci assert_equals(eventCount, 1, "event handler should have been called once"); 461cb0ef41Sopenharmony_ci controller.abort(); 471cb0ef41Sopenharmony_ci assert_true(signal.aborted); 481cb0ef41Sopenharmony_ci assert_equals(eventCount, 1, 491cb0ef41Sopenharmony_ci "event handler should not have been called again"); 501cb0ef41Sopenharmony_ci}, "controller.abort() should do nothing the second time it is called"); 511cb0ef41Sopenharmony_ci 521cb0ef41Sopenharmony_citest(t => { 531cb0ef41Sopenharmony_ci const controller = new AbortController(); 541cb0ef41Sopenharmony_ci controller.abort(); 551cb0ef41Sopenharmony_ci controller.signal.onabort = 561cb0ef41Sopenharmony_ci t.unreached_func("event handler should not be called"); 571cb0ef41Sopenharmony_ci}, "event handler should not be called if added after controller.abort()"); 581cb0ef41Sopenharmony_ci 591cb0ef41Sopenharmony_citest(t => { 601cb0ef41Sopenharmony_ci const controller = new AbortController(); 611cb0ef41Sopenharmony_ci const signal = controller.signal; 621cb0ef41Sopenharmony_ci signal.onabort = t.step_func(e => { 631cb0ef41Sopenharmony_ci assert_equals(e.type, "abort", "event type should be abort"); 641cb0ef41Sopenharmony_ci assert_equals(e.target, signal, "event target should be signal"); 651cb0ef41Sopenharmony_ci assert_false(e.bubbles, "event should not bubble"); 661cb0ef41Sopenharmony_ci assert_true(e.isTrusted, "event should be trusted"); 671cb0ef41Sopenharmony_ci }); 681cb0ef41Sopenharmony_ci controller.abort(); 691cb0ef41Sopenharmony_ci}, "the abort event should have the right properties"); 701cb0ef41Sopenharmony_ci 711cb0ef41Sopenharmony_citest(t => { 721cb0ef41Sopenharmony_ci const controller = new AbortController(); 731cb0ef41Sopenharmony_ci const signal = controller.signal; 741cb0ef41Sopenharmony_ci 751cb0ef41Sopenharmony_ci assert_true("reason" in signal, "signal has reason property"); 761cb0ef41Sopenharmony_ci assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 771cb0ef41Sopenharmony_ci 781cb0ef41Sopenharmony_ci const reason = Error("hello"); 791cb0ef41Sopenharmony_ci controller.abort(reason); 801cb0ef41Sopenharmony_ci 811cb0ef41Sopenharmony_ci assert_true(signal.aborted, "signal.aborted"); 821cb0ef41Sopenharmony_ci assert_equals(signal.reason, reason, "signal.reason"); 831cb0ef41Sopenharmony_ci}, "AbortController abort(reason) should set signal.reason"); 841cb0ef41Sopenharmony_ci 851cb0ef41Sopenharmony_citest(t => { 861cb0ef41Sopenharmony_ci const controller = new AbortController(); 871cb0ef41Sopenharmony_ci const signal = controller.signal; 881cb0ef41Sopenharmony_ci 891cb0ef41Sopenharmony_ci assert_true("reason" in signal, "signal has reason property"); 901cb0ef41Sopenharmony_ci assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 911cb0ef41Sopenharmony_ci 921cb0ef41Sopenharmony_ci controller.abort(); 931cb0ef41Sopenharmony_ci 941cb0ef41Sopenharmony_ci assert_true(signal.aborted, "signal.aborted"); 951cb0ef41Sopenharmony_ci assert_true(signal.reason instanceof DOMException, "signal.reason is DOMException"); 961cb0ef41Sopenharmony_ci assert_equals(signal.reason.name, "AbortError", "signal.reason is AbortError"); 971cb0ef41Sopenharmony_ci}, "aborting AbortController without reason creates an \"AbortError\" DOMException"); 981cb0ef41Sopenharmony_ci 991cb0ef41Sopenharmony_citest(t => { 1001cb0ef41Sopenharmony_ci const controller = new AbortController(); 1011cb0ef41Sopenharmony_ci const signal = controller.signal; 1021cb0ef41Sopenharmony_ci 1031cb0ef41Sopenharmony_ci assert_true("reason" in signal, "signal has reason property"); 1041cb0ef41Sopenharmony_ci assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 1051cb0ef41Sopenharmony_ci 1061cb0ef41Sopenharmony_ci controller.abort(undefined); 1071cb0ef41Sopenharmony_ci 1081cb0ef41Sopenharmony_ci assert_true(signal.aborted, "signal.aborted"); 1091cb0ef41Sopenharmony_ci assert_true(signal.reason instanceof DOMException, "signal.reason is DOMException"); 1101cb0ef41Sopenharmony_ci assert_equals(signal.reason.name, "AbortError", "signal.reason is AbortError"); 1111cb0ef41Sopenharmony_ci}, "AbortController abort(undefined) creates an \"AbortError\" DOMException"); 1121cb0ef41Sopenharmony_ci 1131cb0ef41Sopenharmony_citest(t => { 1141cb0ef41Sopenharmony_ci const controller = new AbortController(); 1151cb0ef41Sopenharmony_ci const signal = controller.signal; 1161cb0ef41Sopenharmony_ci 1171cb0ef41Sopenharmony_ci assert_true("reason" in signal, "signal has reason property"); 1181cb0ef41Sopenharmony_ci assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 1191cb0ef41Sopenharmony_ci 1201cb0ef41Sopenharmony_ci controller.abort(null); 1211cb0ef41Sopenharmony_ci 1221cb0ef41Sopenharmony_ci assert_true(signal.aborted, "signal.aborted"); 1231cb0ef41Sopenharmony_ci assert_equals(signal.reason, null, "signal.reason"); 1241cb0ef41Sopenharmony_ci}, "AbortController abort(null) should set signal.reason"); 1251cb0ef41Sopenharmony_ci 1261cb0ef41Sopenharmony_citest(t => { 1271cb0ef41Sopenharmony_ci const signal = AbortSignal.abort(); 1281cb0ef41Sopenharmony_ci 1291cb0ef41Sopenharmony_ci assert_true(signal.aborted, "signal.aborted"); 1301cb0ef41Sopenharmony_ci assert_true(signal.reason instanceof DOMException, "signal.reason is DOMException"); 1311cb0ef41Sopenharmony_ci assert_equals(signal.reason.name, "AbortError", "signal.reason is AbortError"); 1321cb0ef41Sopenharmony_ci}, "static aborting signal should have right properties"); 1331cb0ef41Sopenharmony_ci 1341cb0ef41Sopenharmony_citest(t => { 1351cb0ef41Sopenharmony_ci const reason = Error("hello"); 1361cb0ef41Sopenharmony_ci const signal = AbortSignal.abort(reason); 1371cb0ef41Sopenharmony_ci 1381cb0ef41Sopenharmony_ci assert_true(signal.aborted, "signal.aborted"); 1391cb0ef41Sopenharmony_ci assert_equals(signal.reason, reason, "signal.reason"); 1401cb0ef41Sopenharmony_ci}, "static aborting signal with reason should set signal.reason"); 1411cb0ef41Sopenharmony_ci 1421cb0ef41Sopenharmony_citest(t => { 1431cb0ef41Sopenharmony_ci const reason = new Error('boom'); 1441cb0ef41Sopenharmony_ci const signal = AbortSignal.abort(reason); 1451cb0ef41Sopenharmony_ci assert_true(signal.aborted); 1461cb0ef41Sopenharmony_ci assert_throws_exactly(reason, () => signal.throwIfAborted()); 1471cb0ef41Sopenharmony_ci}, "throwIfAborted() should throw abort.reason if signal aborted"); 1481cb0ef41Sopenharmony_ci 1491cb0ef41Sopenharmony_citest(t => { 1501cb0ef41Sopenharmony_ci const signal = AbortSignal.abort('hello'); 1511cb0ef41Sopenharmony_ci assert_true(signal.aborted); 1521cb0ef41Sopenharmony_ci assert_throws_exactly('hello', () => signal.throwIfAborted()); 1531cb0ef41Sopenharmony_ci}, "throwIfAborted() should throw primitive abort.reason if signal aborted"); 1541cb0ef41Sopenharmony_ci 1551cb0ef41Sopenharmony_citest(t => { 1561cb0ef41Sopenharmony_ci const controller = new AbortController(); 1571cb0ef41Sopenharmony_ci assert_false(controller.signal.aborted); 1581cb0ef41Sopenharmony_ci controller.signal.throwIfAborted(); 1591cb0ef41Sopenharmony_ci}, "throwIfAborted() should not throw if signal not aborted"); 1601cb0ef41Sopenharmony_ci 1611cb0ef41Sopenharmony_citest(t => { 1621cb0ef41Sopenharmony_ci const signal = AbortSignal.abort(); 1631cb0ef41Sopenharmony_ci 1641cb0ef41Sopenharmony_ci assert_true( 1651cb0ef41Sopenharmony_ci signal.reason instanceof DOMException, 1661cb0ef41Sopenharmony_ci "signal.reason is a DOMException" 1671cb0ef41Sopenharmony_ci ); 1681cb0ef41Sopenharmony_ci assert_equals( 1691cb0ef41Sopenharmony_ci signal.reason, 1701cb0ef41Sopenharmony_ci signal.reason, 1711cb0ef41Sopenharmony_ci "signal.reason returns the same DOMException" 1721cb0ef41Sopenharmony_ci ); 1731cb0ef41Sopenharmony_ci}, "AbortSignal.reason returns the same DOMException"); 1741cb0ef41Sopenharmony_ci 1751cb0ef41Sopenharmony_citest(t => { 1761cb0ef41Sopenharmony_ci const controller = new AbortController(); 1771cb0ef41Sopenharmony_ci controller.abort(); 1781cb0ef41Sopenharmony_ci 1791cb0ef41Sopenharmony_ci assert_true( 1801cb0ef41Sopenharmony_ci controller.signal.reason instanceof DOMException, 1811cb0ef41Sopenharmony_ci "signal.reason is a DOMException" 1821cb0ef41Sopenharmony_ci ); 1831cb0ef41Sopenharmony_ci assert_equals( 1841cb0ef41Sopenharmony_ci controller.signal.reason, 1851cb0ef41Sopenharmony_ci controller.signal.reason, 1861cb0ef41Sopenharmony_ci "signal.reason returns the same DOMException" 1871cb0ef41Sopenharmony_ci ); 1881cb0ef41Sopenharmony_ci}, "AbortController.signal.reason returns the same DOMException"); 1891cb0ef41Sopenharmony_ci 1901cb0ef41Sopenharmony_cidone(); 191