browser_media_control_playback_state.js (3729B)
1 const PAGE_NON_AUTOPLAY = 2 "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_non_autoplay.html"; 3 4 const testVideoId = "video"; 5 6 add_task(async function setupTestingPref() { 7 await SpecialPowers.pushPrefEnv({ 8 set: [["media.mediacontrol.testingevents.enabled", true]], 9 }); 10 }); 11 12 /** 13 * This test is used to check the actual playback state [1] of the main media 14 * controller. The declared playback state is the playback state from the active 15 * media session, and the guessed playback state is determined by the media's 16 * playback state. Both the declared playback and the guessed playback state 17 * would be used to decide the final result of the actual playback state. 18 * 19 * [1] https://w3c.github.io/mediasession/#actual-playback-state 20 */ 21 add_task(async function testDefaultPlaybackStateBeforeAnyMediaStart() { 22 info(`open media page`); 23 const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY, { 24 needCheck: false, 25 }); 26 27 info(`before media starts, playback state should be 'none'`); 28 await isActualPlaybackStateEqualTo(tab, "none"); 29 30 info(`remove tab`); 31 await tab.close(); 32 }); 33 34 add_task(async function testGuessedPlaybackState() { 35 info(`open media page`); 36 const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY); 37 38 info( 39 `Now declared='none', guessed='playing', so actual playback state should be 'playing'` 40 ); 41 await setGuessedPlaybackState(tab, "playing"); 42 await isActualPlaybackStateEqualTo(tab, "playing"); 43 44 info( 45 `Now declared='none', guessed='paused', so actual playback state should be 'paused'` 46 ); 47 await setGuessedPlaybackState(tab, "paused"); 48 await isActualPlaybackStateEqualTo(tab, "paused"); 49 50 info(`remove tab`); 51 await tab.close(); 52 }); 53 54 add_task(async function testBothGuessedAndDeclaredPlaybackState() { 55 info(`open media page`); 56 const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY); 57 58 info( 59 `Now declared='paused', guessed='playing', so actual playback state should be 'playing'` 60 ); 61 await setDeclaredPlaybackState(tab, "paused"); 62 await setGuessedPlaybackState(tab, "playing"); 63 await isActualPlaybackStateEqualTo(tab, "playing"); 64 65 info( 66 `Now declared='paused', guessed='paused', so actual playback state should be 'paused'` 67 ); 68 await setGuessedPlaybackState(tab, "paused"); 69 await isActualPlaybackStateEqualTo(tab, "paused"); 70 71 info( 72 `Now declared='playing', guessed='paused', so actual playback state should be 'playing'` 73 ); 74 await setDeclaredPlaybackState(tab, "playing"); 75 await isActualPlaybackStateEqualTo(tab, "playing"); 76 77 info(`remove tab`); 78 await tab.close(); 79 }); 80 81 /** 82 * The following are helper functions. 83 */ 84 function setGuessedPlaybackState(tab, state) { 85 if (state == "playing") { 86 return playMedia(tab, testVideoId); 87 } else if (state == "paused") { 88 return pauseMedia(tab, testVideoId); 89 } 90 // We won't set the state `stopped`, which would only happen if no any media 91 // has ever been started in the page. 92 ok(false, `should only set 'playing' or 'paused' state`); 93 return Promise.resolve(); 94 } 95 96 async function isActualPlaybackStateEqualTo(tab, expectedState) { 97 const controller = tab.linkedBrowser.browsingContext.mediaController; 98 if (controller.playbackState != expectedState) { 99 await new Promise(r => (controller.onplaybackstatechange = r)); 100 } 101 is( 102 controller.playbackState, 103 expectedState, 104 `current state '${controller.playbackState}' is equal to '${expectedState}'` 105 ); 106 } 107 108 function setDeclaredPlaybackState(tab, state) { 109 return SpecialPowers.spawn(tab.linkedBrowser, [state], playbackState => { 110 info(`set declared playback state to '${playbackState}'`); 111 content.navigator.mediaSession.playbackState = playbackState; 112 }); 113 }