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 }