tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }