@@ -182,4 +182,59 @@ function abortSignalAnyTests(signalInterface, controllerInterface) {
182182 controller.abort();
183183 assert_equals(result, "01234");
184184 }, `Abort events for ${desc} signals fire in the right order ${suffix}`);
185+
186+ test(t => {
187+ const controller = new controllerInterface();
188+ const signal1 = signalInterface.any([controller.signal]);
189+ const signal2 = signalInterface.any([signal1]);
190+ let eventFired = false;
191+
192+ controller.signal.addEventListener('abort', () => {
193+ const signal3 = signalInterface.any([signal2]);
194+ assert_true(controller.signal.aborted);
195+ assert_true(signal1.aborted);
196+ assert_true(signal2.aborted);
197+ assert_true(signal3.aborted);
198+ eventFired = true;
199+ });
200+
201+ controller.abort();
202+ assert_true(eventFired, "event fired");
203+ }, `Dependent signals for ${desc} are marked aborted before abort events fire ${suffix}`);
204+
205+ test(t => {
206+ const controller1 = new controllerInterface();
207+ const controller2 = new controllerInterface();
208+ const signal = signalInterface.any([controller1.signal, controller2.signal]);
209+ let count = 0;
210+
211+ controller1.signal.addEventListener('abort', () => {
212+ controller2.abort("reason 2");
213+ });
214+
215+ signal.addEventListener('abort', () => {
216+ count++;
217+ });
218+
219+ controller1.abort("reason 1");
220+ assert_equals(count, 1);
221+ assert_true(signal.aborted);
222+ assert_equals(signal.reason, "reason 1");
223+ }, `Dependent signals for ${desc} are aborted correctly for reentrant aborts ${suffix}`);
224+
225+ test(t => {
226+ const source = signalInterface.abort();
227+ const dependent = signalInterface.any([source]);
228+ assert_true(source.reason instanceof DOMException);
229+ assert_equals(source.reason, dependent.reason);
230+ }, `Dependent signals for ${desc} should use the same DOMException instance from the already aborted source signal ${suffix}`);
231+
232+ test(t => {
233+ const controller = new controllerInterface();
234+ const source = controller.signal;
235+ const dependent = signalInterface.any([source]);
236+ controller.abort();
237+ assert_true(source.reason instanceof DOMException);
238+ assert_equals(source.reason, dependent.reason);
239+ }, `Dependent signals for ${desc} should use the same DOMException instance from the source signal being aborted later ${suffix}`);
185240}
0 commit comments