@@ -57,6 +57,7 @@ type BufferControllerTestable = Omit<
5757 sourceBuffers : SourceBuffersTuple ;
5858 tracks : SourceBufferTrackSet ;
5959 tracksReady : boolean ;
60+ _onMediaSourceClose : ( ) => void ;
6061} ;
6162
6263describe ( 'BufferController' , function ( ) {
@@ -557,4 +558,25 @@ describe('BufferController', function () {
557558 expect ( bufferController . bufferedToEnd ) . to . be . true ;
558559 } ) ;
559560 } ) ;
561+
562+ describe ( 'Safari MediaSource bfcache close recovery' , function ( ) {
563+ it ( 'triggers recoverMediaError when sourceclose fires with media attached' , function ( ) {
564+ const media = new MockMediaElement ( ) as unknown as HTMLMediaElement ;
565+ const mediaSource = new MockMediaSource ( ) as unknown as MediaSource ;
566+ const recoverMediaErrorSpy = sandbox . spy ( hls , 'recoverMediaError' ) ;
567+ bufferController . media = media ;
568+ bufferController . mediaSource = mediaSource ;
569+ bufferController . _onMediaSourceClose ( ) ;
570+ expect ( recoverMediaErrorSpy ) . to . have . been . calledOnce ;
571+ } ) ;
572+
573+ it ( 'does not trigger recovery when sourceclose fires without media attached' , function ( ) {
574+ const mediaSource = new MockMediaSource ( ) as unknown as MediaSource ;
575+ const recoverMediaErrorSpy = sandbox . spy ( hls , 'recoverMediaError' ) ;
576+ bufferController . media = null ;
577+ bufferController . mediaSource = mediaSource ;
578+ bufferController . _onMediaSourceClose ( ) ;
579+ expect ( recoverMediaErrorSpy ) . to . not . have . been . called ;
580+ } ) ;
581+ } ) ;
560582} ) ;
0 commit comments