event.any.js (6592B)
1 // META: global=window,dedicatedworker,shadowrealm 2 3 test(t => { 4 const c = new AbortController(), 5 s = c.signal; 6 let state = "begin"; 7 8 assert_false(s.aborted); 9 assert_true("reason" in s, "signal has reason property"); 10 assert_equals(s.reason, undefined, "signal.reason is initially undefined"); 11 12 s.addEventListener("abort", 13 t.step_func(e => { 14 assert_equals(state, "begin"); 15 state = "aborted"; 16 }) 17 ); 18 c.abort(); 19 20 assert_equals(state, "aborted"); 21 assert_true(s.aborted); 22 assert_true(s.reason instanceof DOMException, "signal.reason is DOMException"); 23 assert_equals(s.reason.name, "AbortError", "signal.reason is AbortError"); 24 25 c.abort(); 26 }, "AbortController abort() should fire event synchronously"); 27 28 test(t => { 29 const controller = new AbortController(); 30 const signal = controller.signal; 31 assert_equals(controller.signal, signal, 32 "value of controller.signal should not have changed"); 33 controller.abort(); 34 assert_equals(controller.signal, signal, 35 "value of controller.signal should still not have changed"); 36 }, "controller.signal should always return the same object"); 37 38 test(t => { 39 const controller = new AbortController(); 40 const signal = controller.signal; 41 let eventCount = 0; 42 signal.onabort = () => { 43 ++eventCount; 44 }; 45 controller.abort(); 46 assert_true(signal.aborted); 47 assert_equals(eventCount, 1, "event handler should have been called once"); 48 controller.abort(); 49 assert_true(signal.aborted); 50 assert_equals(eventCount, 1, 51 "event handler should not have been called again"); 52 }, "controller.abort() should do nothing the second time it is called"); 53 54 test(t => { 55 const controller = new AbortController(); 56 controller.abort(); 57 controller.signal.onabort = 58 t.unreached_func("event handler should not be called"); 59 }, "event handler should not be called if added after controller.abort()"); 60 61 test(t => { 62 const controller = new AbortController(); 63 const signal = controller.signal; 64 signal.onabort = t.step_func(e => { 65 assert_equals(e.type, "abort", "event type should be abort"); 66 assert_equals(e.target, signal, "event target should be signal"); 67 assert_false(e.bubbles, "event should not bubble"); 68 assert_true(e.isTrusted, "event should be trusted"); 69 }); 70 controller.abort(); 71 }, "the abort event should have the right properties"); 72 73 test(t => { 74 const controller = new AbortController(); 75 const signal = controller.signal; 76 77 assert_true("reason" in signal, "signal has reason property"); 78 assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 79 80 const reason = Error("hello"); 81 controller.abort(reason); 82 83 assert_true(signal.aborted, "signal.aborted"); 84 assert_equals(signal.reason, reason, "signal.reason"); 85 }, "AbortController abort(reason) should set signal.reason"); 86 87 test(t => { 88 const controller = new AbortController(); 89 const signal = controller.signal; 90 91 assert_true("reason" in signal, "signal has reason property"); 92 assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 93 94 controller.abort(); 95 96 assert_true(signal.aborted, "signal.aborted"); 97 assert_true(signal.reason instanceof DOMException, "signal.reason is DOMException"); 98 assert_equals(signal.reason.name, "AbortError", "signal.reason is AbortError"); 99 }, "aborting AbortController without reason creates an \"AbortError\" DOMException"); 100 101 test(t => { 102 const controller = new AbortController(); 103 const signal = controller.signal; 104 105 assert_true("reason" in signal, "signal has reason property"); 106 assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 107 108 controller.abort(undefined); 109 110 assert_true(signal.aborted, "signal.aborted"); 111 assert_true(signal.reason instanceof DOMException, "signal.reason is DOMException"); 112 assert_equals(signal.reason.name, "AbortError", "signal.reason is AbortError"); 113 }, "AbortController abort(undefined) creates an \"AbortError\" DOMException"); 114 115 test(t => { 116 const controller = new AbortController(); 117 const signal = controller.signal; 118 119 assert_true("reason" in signal, "signal has reason property"); 120 assert_equals(signal.reason, undefined, "signal.reason is initially undefined"); 121 122 controller.abort(null); 123 124 assert_true(signal.aborted, "signal.aborted"); 125 assert_equals(signal.reason, null, "signal.reason"); 126 }, "AbortController abort(null) should set signal.reason"); 127 128 test(t => { 129 const signal = AbortSignal.abort(); 130 131 assert_true(signal.aborted, "signal.aborted"); 132 assert_true(signal.reason instanceof DOMException, "signal.reason is DOMException"); 133 assert_equals(signal.reason.name, "AbortError", "signal.reason is AbortError"); 134 }, "static aborting signal should have right properties"); 135 136 test(t => { 137 const reason = Error("hello"); 138 const signal = AbortSignal.abort(reason); 139 140 assert_true(signal.aborted, "signal.aborted"); 141 assert_equals(signal.reason, reason, "signal.reason"); 142 }, "static aborting signal with reason should set signal.reason"); 143 144 test(t => { 145 const signal = AbortSignal.abort(); 146 147 assert_true( 148 signal.reason instanceof DOMException, 149 "signal.reason is a DOMException" 150 ); 151 assert_equals( 152 signal.reason, 153 signal.reason, 154 "signal.reason returns the same DOMException" 155 ); 156 }, "AbortSignal.reason returns the same DOMException"); 157 158 test(t => { 159 const controller = new AbortController(); 160 controller.abort(); 161 162 assert_true( 163 controller.signal.reason instanceof DOMException, 164 "signal.reason is a DOMException" 165 ); 166 assert_equals( 167 controller.signal.reason, 168 controller.signal.reason, 169 "signal.reason returns the same DOMException" 170 ); 171 }, "AbortController.signal.reason returns the same DOMException"); 172 173 test(t => { 174 const reason = new Error('boom'); 175 const message = reason.message; 176 const signal = AbortSignal.abort(reason); 177 assert_true(signal.aborted); 178 assert_throws_exactly(reason, () => signal.throwIfAborted()); 179 assert_equals(reason.message, message, 180 "abort.reason should not be changed by throwIfAborted()"); 181 }, "throwIfAborted() should throw abort.reason if signal aborted"); 182 183 test(t => { 184 const signal = AbortSignal.abort('hello'); 185 assert_true(signal.aborted); 186 assert_throws_exactly('hello', () => signal.throwIfAborted()); 187 }, "throwIfAborted() should throw primitive abort.reason if signal aborted"); 188 189 test(t => { 190 const controller = new AbortController(); 191 assert_false(controller.signal.aborted); 192 controller.signal.throwIfAborted(); 193 }, "throwIfAborted() should not throw if signal not aborted"); 194 195 done();