From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser_mediaplayback_audibility_change.js | 258 +++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 browser/base/content/test/tabMediaIndicator/browser_mediaplayback_audibility_change.js (limited to 'browser/base/content/test/tabMediaIndicator/browser_mediaplayback_audibility_change.js') diff --git a/browser/base/content/test/tabMediaIndicator/browser_mediaplayback_audibility_change.js b/browser/base/content/test/tabMediaIndicator/browser_mediaplayback_audibility_change.js new file mode 100644 index 0000000000..87186ca838 --- /dev/null +++ b/browser/base/content/test/tabMediaIndicator/browser_mediaplayback_audibility_change.js @@ -0,0 +1,258 @@ +/** + * When media changes its audible state, the sound indicator should be + * updated as well, which should appear only when web audio is audible. + */ +add_task(async function testUpdateSoundIndicatorWhenMediaPlaybackChanges() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaPlaybackDocument(tab, "audio.ogg"); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear when audio stops playing`); + await pauseMedia(tab); + await waitForTabSoundIndicatorDisappears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testUpdateSoundIndicatorWhenMediaBecomeSilent() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaPlaybackDocument(tab, "audioEndedDuringPlaying.webm"); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear when audio becomes silent`); + await waitForTabSoundIndicatorDisappears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testSoundIndicatorWouldWorkForMediaWithoutPreload() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaPlaybackDocument(tab, "audio.ogg", { preload: "none" }); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear when audio stops playing`); + await pauseMedia(tab); + await waitForTabSoundIndicatorDisappears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testSoundIndicatorShouldDisappearAfterTabNavigation() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaPlaybackDocument(tab, "audio.ogg"); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear after navigating tab to blank page`); + BrowserTestUtils.loadURIString(tab.linkedBrowser, "about:blank"); + await waitForTabSoundIndicatorDisappears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testSoundIndicatorForAudioStream() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaStreamPlaybackDocument(tab); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear when audio stops playing`); + await pauseMedia(tab); + await waitForTabSoundIndicatorDisappears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testPerformPlayOnMediaLoadingNewSource() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaPlaybackDocument(tab, "audio.ogg"); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear when audio stops playing`); + await pauseMedia(tab); + await waitForTabSoundIndicatorDisappears(tab); + + info(`reset media src and play it again should make sound indicator appear`); + await assignNewSourceForAudio(tab, "audio.ogg"); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testSoundIndicatorShouldDisappearWhenAbortingMedia() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab(); + await initMediaPlaybackDocument(tab, "audio.ogg"); + + info(`sound indicator should appear when audible audio starts playing`); + await playMedia(tab); + await waitForTabSoundIndicatorAppears(tab); + + info(`sound indicator should disappear when aborting audio source`); + await assignNewSourceForAudio(tab, ""); + await waitForTabSoundIndicatorDisappears(tab); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testNoSoundIndicatorForMediaWithoutAudioTrack() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab({ needObserver: true }); + await initMediaPlaybackDocument(tab, "noaudio.webm", { createVideo: true }); + + info(`no sound indicator should show for playing media without audio track`); + await playMedia(tab, { resolveOnTimeupdate: true }); + ok(!tab.observer.hasEverUpdated(), "didn't ever update sound indicator"); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testSoundIndicatorWhenChangingMediaMuted() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab({ needObserver: true }); + await initMediaPlaybackDocument(tab, "audio.ogg", { muted: true }); + + info(`no sound indicator should show for playing muted media`); + await playMedia(tab, { resolveOnTimeupdate: true }); + ok(!tab.observer.hasEverUpdated(), "didn't ever update sound indicator"); + + info(`unmuted media should make sound indicator appear`); + await Promise.all([ + waitForTabSoundIndicatorAppears(tab), + updateMedia(tab, { muted: false }), + ]); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testSoundIndicatorWhenChangingMediaVolume() { + info("create a tab loading media document"); + const tab = await createBlankForegroundTab({ needObserver: true }); + await initMediaPlaybackDocument(tab, "audio.ogg", { volume: 0.0 }); + + info(`no sound indicator should show for playing volume zero media`); + await playMedia(tab, { resolveOnTimeupdate: true }); + ok(!tab.observer.hasEverUpdated(), "didn't ever update sound indicator"); + + info(`unmuted media by setting volume should make sound indicator appear`); + await Promise.all([ + waitForTabSoundIndicatorAppears(tab), + updateMedia(tab, { volume: 1.0 }), + ]); + + info("remove tab"); + BrowserTestUtils.removeTab(tab); +}); + +/** + * Following are helper functions + */ +function initMediaPlaybackDocument( + tab, + fileName, + { preload, createVideo, muted = false, volume = 1.0 } = {} +) { + return SpecialPowers.spawn( + tab.linkedBrowser, + [fileName, preload, createVideo, muted, volume], + // eslint-disable-next-line no-shadow + async (fileName, preload, createVideo, muted, volume) => { + if (createVideo) { + content.media = content.document.createElement("video"); + } else { + content.media = content.document.createElement("audio"); + } + if (preload) { + content.media.preload = preload; + } + content.media.muted = muted; + content.media.volume = volume; + content.media.src = fileName; + } + ); +} + +function initMediaStreamPlaybackDocument(tab) { + return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => { + content.media = content.document.createElement("audio"); + content.media.srcObject = + new content.AudioContext().createMediaStreamDestination().stream; + }); +} + +function playMedia(tab, { resolveOnTimeupdate } = {}) { + return SpecialPowers.spawn( + tab.linkedBrowser, + [resolveOnTimeupdate], + // eslint-disable-next-line no-shadow + async resolveOnTimeupdate => { + await content.media.play(); + if (resolveOnTimeupdate) { + await new Promise(r => (content.media.ontimeupdate = r)); + } + } + ); +} + +function pauseMedia(tab) { + return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => { + content.media.pause(); + }); +} + +function assignNewSourceForAudio(tab, fileName) { + // eslint-disable-next-line no-shadow + return SpecialPowers.spawn(tab.linkedBrowser, [fileName], async fileName => { + content.media.src = ""; + content.media.removeAttribute("src"); + content.media.src = fileName; + }); +} + +function updateMedia(tab, { muted, volume } = {}) { + return SpecialPowers.spawn( + tab.linkedBrowser, + [muted, volume], + // eslint-disable-next-line no-shadow + (muted, volume) => { + if (muted != undefined) { + content.media.muted = muted; + } + if (volume != undefined) { + content.media.volume = volume; + } + } + ); +} -- cgit v1.2.3