tor-browser

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

browser_audio_focus_management.js (6540B)


      1 const PAGE_AUDIBLE =
      2  "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_autoplay.html";
      3 const PAGE_INAUDIBLE =
      4  "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_muted_autoplay.html";
      5 
      6 const testVideoId = "autoplay";
      7 
      8 /**
      9 * These tests are used to ensure that the audio focus management works correctly
     10 * amongs different tabs no matter the pref is on or off. If the pref is on,
     11 * there is only one tab which is allowed to play audio at a time, the last tab
     12 * starting audio will immediately stop other tabs which own audio focus. But
     13 * notice that playing inaudible media won't gain audio focus. If the pref is
     14 * off, all audible tabs can own audio focus at the same time without
     15 * interfering each others.
     16 */
     17 add_task(async function testDisableAudioFocusManagement() {
     18  await switchAudioFocusManagerment(false);
     19 
     20  info(`open audible autoplay media in tab1`);
     21  const tab1 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     22  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
     23 
     24  info(`open same page on another tab, which shouldn't cause audio competing`);
     25  const tab2 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     26  await checkOrWaitUntilMediaStartedPlaying(tab2, testVideoId);
     27 
     28  info(`media in tab1 should be playing still`);
     29  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
     30 
     31  info(`remove tabs`);
     32  await clearTabsAndResetPref([tab1, tab2]);
     33 });
     34 
     35 add_task(async function testEnableAudioFocusManagement() {
     36  await switchAudioFocusManagerment(true);
     37 
     38  info(`open audible autoplay media in tab1`);
     39  const tab1 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     40  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
     41 
     42  info(`open same page on another tab, which should cause audio competing`);
     43  const tab2 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     44  await checkOrWaitUntilMediaStartedPlaying(tab2, testVideoId);
     45 
     46  info(`media in tab1 should be stopped`);
     47  await checkOrWaitUntilMediaStoppedPlaying(tab1, testVideoId);
     48 
     49  info(`remove tabs`);
     50  await clearTabsAndResetPref([tab1, tab2]);
     51 });
     52 
     53 add_task(async function testCheckAudioCompetingMultipleTimes() {
     54  await switchAudioFocusManagerment(true);
     55 
     56  info(`open audible autoplay media in tab1`);
     57  const tab1 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     58  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
     59 
     60  info(`open same page on another tab, which should cause audio competing`);
     61  const tab2 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     62  await checkOrWaitUntilMediaStartedPlaying(tab2, testVideoId);
     63 
     64  info(`media in tab1 should be stopped`);
     65  await checkOrWaitUntilMediaStoppedPlaying(tab1, testVideoId);
     66 
     67  info(`play media in tab1 again`);
     68  await playMedia(tab1);
     69 
     70  info(`media in tab2 should be stopped`);
     71  await checkOrWaitUntilMediaStoppedPlaying(tab2, testVideoId);
     72 
     73  info(`play media in tab2 again`);
     74  await playMedia(tab2);
     75 
     76  info(`media in tab1 should be stopped`);
     77  await checkOrWaitUntilMediaStoppedPlaying(tab1, testVideoId);
     78 
     79  info(`remove tabs`);
     80  await clearTabsAndResetPref([tab1, tab2]);
     81 });
     82 
     83 add_task(async function testMutedMediaWontInvolveAudioCompeting() {
     84  await switchAudioFocusManagerment(true);
     85 
     86  info(`open audible autoplay media in tab1`);
     87  const tab1 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
     88  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
     89 
     90  info(
     91    `open inaudible media page on another tab, which shouldn't cause audio competing`
     92  );
     93  const tab2 = await createLoadedTabWrapper(PAGE_INAUDIBLE, {
     94    needCheck: false,
     95  });
     96  await checkOrWaitUntilMediaStartedPlaying(tab2, testVideoId);
     97 
     98  info(`media in tab1 should be playing still`);
     99  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
    100 
    101  info(
    102    `open audible media page on the third tab, which should cause audio competing`
    103  );
    104  const tab3 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
    105  await checkOrWaitUntilMediaStartedPlaying(tab3, testVideoId);
    106 
    107  info(`media in tab1 should be stopped`);
    108  await checkOrWaitUntilMediaStoppedPlaying(tab1, testVideoId);
    109 
    110  info(`media in tab2 should not be affected because it's inaudible.`);
    111  await checkOrWaitUntilMediaStartedPlaying(tab2, testVideoId);
    112 
    113  info(`remove tabs`);
    114  await clearTabsAndResetPref([tab1, tab2, tab3]);
    115 });
    116 
    117 add_task(async function testStopMultipleTabsWhenSwitchingPrefDynamically() {
    118  await switchAudioFocusManagerment(false);
    119 
    120  info(`open audible autoplay media in tab1`);
    121  const tab1 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
    122  await checkOrWaitUntilMediaStartedPlaying(tab1, testVideoId);
    123 
    124  info(`open same page on another tab, which shouldn't cause audio competing`);
    125  const tab2 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
    126  await checkOrWaitUntilMediaStartedPlaying(tab2, testVideoId);
    127 
    128  await switchAudioFocusManagerment(true);
    129 
    130  info(`open same page on the third tab, which should cause audio competing`);
    131  const tab3 = await createLoadedTabWrapper(PAGE_AUDIBLE, { needCheck: false });
    132  await checkOrWaitUntilMediaStartedPlaying(tab3, testVideoId);
    133 
    134  info(`media in tab1 and tab2 should be stopped`);
    135  await checkOrWaitUntilMediaStoppedPlaying(tab1, testVideoId);
    136  await checkOrWaitUntilMediaStoppedPlaying(tab2, testVideoId);
    137 
    138  info(`remove tabs`);
    139  await clearTabsAndResetPref([tab1, tab2, tab3]);
    140 });
    141 
    142 /**
    143 * The following are helper funcions.
    144 */
    145 async function switchAudioFocusManagerment(enable) {
    146  const state = enable ? "Enable" : "Disable";
    147  info(`${state} audio focus management`);
    148  await SpecialPowers.pushPrefEnv({
    149    set: [["media.audioFocus.management", enable]],
    150  });
    151 }
    152 
    153 async function playMedia(tab) {
    154  await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
    155    return new Promise(resolve => {
    156      const video = content.document.getElementById("autoplay");
    157      if (!video) {
    158        ok(false, `can't get the media element!`);
    159      }
    160 
    161      ok(video.paused, `media has not started yet`);
    162      info(`wait until media starts playing`);
    163      video.play();
    164      video.onplaying = () => {
    165        video.onplaying = null;
    166        ok(true, `media started playing`);
    167        resolve();
    168      };
    169    });
    170  });
    171 }
    172 
    173 async function clearTabsAndResetPref(tabs) {
    174  info(`clear tabs and reset pref`);
    175  for (let tab of tabs) {
    176    await tab.close();
    177  }
    178  await switchAudioFocusManagerment(false);
    179 }