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