@@ -4,6 +4,8 @@ describe('MSE AirPlay handoff restore', () => {
44 const originalMediaSource = window . MediaSource
55 const originalCreateObjectURL = URL . createObjectURL
66 const originalRevokeObjectURL = URL . revokeObjectURL
7+ const originalWebKitPlaybackTargetAvailabilityEvent =
8+ window . WebKitPlaybackTargetAvailabilityEvent
79
810 beforeEach ( ( ) => {
911 class FakeMediaSource {
@@ -19,12 +21,56 @@ describe('MSE AirPlay handoff restore', () => {
1921 window . MediaSource = FakeMediaSource
2022 URL . createObjectURL = jest . fn ( ( ) => 'blob:https://example.com/mse' )
2123 URL . revokeObjectURL = jest . fn ( )
24+ delete window . WebKitPlaybackTargetAvailabilityEvent
2225 } )
2326
2427 afterEach ( ( ) => {
2528 window . MediaSource = originalMediaSource
2629 URL . createObjectURL = originalCreateObjectURL
2730 URL . revokeObjectURL = originalRevokeObjectURL
31+ if ( originalWebKitPlaybackTargetAvailabilityEvent === undefined ) {
32+ delete window . WebKitPlaybackTargetAvailabilityEvent
33+ } else {
34+ window . WebKitPlaybackTargetAvailabilityEvent =
35+ originalWebKitPlaybackTargetAvailabilityEvent
36+ }
37+ } )
38+
39+ test ( 'auto keeps non-AirPlay MSE attached through media src' , async ( ) => {
40+ const media = document . createElement ( 'video' )
41+ const mse = new MSE ( null , {
42+ attachMode : 'auto'
43+ } )
44+
45+ mse . bindMedia ( media )
46+
47+ expect ( media . getAttribute ( 'src' ) ) . toBe ( 'blob:https://example.com/mse' )
48+ expect ( media . querySelectorAll ( 'source' ) ) . toHaveLength ( 0 )
49+
50+ await mse . unbindMedia ( )
51+ } )
52+
53+ test ( 'auto uses source element for AirPlay-capable WebKit MSE' , async ( ) => {
54+ window . WebKitPlaybackTargetAvailabilityEvent =
55+ function WebKitPlaybackTargetAvailabilityEvent ( ) { }
56+ const media = document . createElement ( 'video' )
57+ media . webkitShowPlaybackTargetPicker = jest . fn ( )
58+
59+ const mse = new MSE ( null , {
60+ attachMode : 'auto'
61+ } )
62+
63+ mse . bindMedia ( media )
64+
65+ const sources = Array . from ( media . querySelectorAll ( 'source' ) )
66+
67+ expect ( media . getAttribute ( 'src' ) ) . toBe ( null )
68+ expect ( media . src ) . toBe ( '' )
69+ expect ( sources . map ( source => source . src ) ) . toEqual ( [
70+ 'blob:https://example.com/mse'
71+ ] )
72+
73+ await mse . unbindMedia ( )
2874 } )
2975
3076 test ( 'binds owned MSE source element without removing cast fallback source' , ( ) => {
0 commit comments