diff options
Diffstat (limited to 'dom/media/mediacontrol/tests/browser/browser_resume_latest_paused_media.js')
-rw-r--r-- | dom/media/mediacontrol/tests/browser/browser_resume_latest_paused_media.js | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/dom/media/mediacontrol/tests/browser/browser_resume_latest_paused_media.js b/dom/media/mediacontrol/tests/browser/browser_resume_latest_paused_media.js new file mode 100644 index 0000000000..58cd3f5a0f --- /dev/null +++ b/dom/media/mediacontrol/tests/browser/browser_resume_latest_paused_media.js @@ -0,0 +1,189 @@ +const PAGE_URL = + "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_multiple_audible_media.html"; + +add_task(async function setupTestingPref() { + await SpecialPowers.pushPrefEnv({ + set: [["media.mediacontrol.testingevents.enabled", true]], + }); +}); + +/** + * This test is used to check when resuming media, we would only resume latest + * paused media, not all media in the page. + */ +add_task(async function testResumingLatestPausedMedias() { + info(`open media page and play all media`); + const tab = await createLoadedTabWrapper(PAGE_URL); + await playAllMedia(tab); + + /** + * Pressing `pause` key would pause video1, video2, video3 + * So resuming from media control key would affect those three media + */ + info(`pressing 'pause' should pause all media`); + await generateMediaControlKeyEvent("pause"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: true, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + info(`all media are latest paused, pressing 'play' should resume all`); + await generateMediaControlKeyEvent("play"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: false, + shouldVideo2BePaused: false, + shouldVideo3BePaused: false, + }); + + info(`pause only one playing video by calling its webidl method`); + await pauseMedia(tab, "video3"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: false, + shouldVideo2BePaused: false, + shouldVideo3BePaused: true, + }); + + /** + * Pressing `pause` key would pause video1, video2 + * So resuming from media control key would affect those two media + */ + info(`pressing 'pause' should pause two playing media`); + await generateMediaControlKeyEvent("pause"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: true, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + info(`two media are latest paused, pressing 'play' should only affect them`); + await generateMediaControlKeyEvent("play"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: false, + shouldVideo2BePaused: false, + shouldVideo3BePaused: true, + }); + + info(`pause only one playing video by calling its webidl method`); + await pauseMedia(tab, "video2"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: false, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + /** + * Pressing `pause` key would pause video1 + * So resuming from media control key would only affect one media + */ + info(`pressing 'pause' should pause one playing media`); + await generateMediaControlKeyEvent("pause"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: true, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + info(`one media is latest paused, pressing 'play' should only affect it`); + await generateMediaControlKeyEvent("play"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: false, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + /** + * Only one media is playing, so pausing it should not stop controlling media. + * We should still be able to resume it later. + */ + info(`pause only playing video by calling its webidl method`); + await pauseMedia(tab, "video1"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: true, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + info(`pressing 'pause' for already paused media, nothing would happen`); + // All media are already paused, so no need to wait for playback state change, + // call the method directly. + MediaControlService.generateMediaControlKey("pause"); + + info(`pressing 'play' would still affect on latest paused media`); + await generateMediaControlKeyEvent("play"); + await checkMediaPausedState(tab, { + shouldVideo1BePaused: false, + shouldVideo2BePaused: true, + shouldVideo3BePaused: true, + }); + + info(`remove tab`); + await tab.close(); +}); + +/** + * The following are helper functions. + */ +async function playAllMedia(tab) { + const playbackStateChangedPromise = waitUntilDisplayedPlaybackChanged(); + await SpecialPowers.spawn(tab.linkedBrowser, [], () => { + return new Promise(r => { + const videos = content.document.getElementsByTagName("video"); + let mediaCount = 0; + docShell.chromeEventHandler.addEventListener( + "MozStartMediaControl", + () => { + if (++mediaCount == videos.length) { + info(`all media have started media control`); + r(); + } + } + ); + for (let video of videos) { + info(`play ${video.id} video`); + video.play(); + } + }); + }); + await playbackStateChangedPromise; +} + +async function pauseMedia(tab, videoId) { + await SpecialPowers.spawn(tab.linkedBrowser, [videoId], videoId => { + const video = content.document.getElementById(videoId); + if (!video) { + ok(false, `can not find ${videoId}!`); + } + video.pause(); + }); +} + +function checkMediaPausedState( + tab, + { shouldVideo1BePaused, shouldVideo2BePaused, shouldVideo3BePaused } +) { + return SpecialPowers.spawn( + tab.linkedBrowser, + [shouldVideo1BePaused, shouldVideo2BePaused, shouldVideo3BePaused], + (shouldVideo1BePaused, shouldVideo2BePaused, shouldVideo3BePaused) => { + const video1 = content.document.getElementById("video1"); + const video2 = content.document.getElementById("video2"); + const video3 = content.document.getElementById("video3"); + is( + video1.paused, + shouldVideo1BePaused, + "Correct paused state for video1" + ); + is( + video2.paused, + shouldVideo2BePaused, + "Correct paused state for video2" + ); + is( + video3.paused, + shouldVideo3BePaused, + "Correct paused state for video3" + ); + } + ); +} |