@@ -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