diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/media/mediacontrol/tests/browser/browser_media_control_supported_keys.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | dom/media/mediacontrol/tests/browser/browser_media_control_supported_keys.js | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/dom/media/mediacontrol/tests/browser/browser_media_control_supported_keys.js b/dom/media/mediacontrol/tests/browser/browser_media_control_supported_keys.js new file mode 100644 index 0000000000..2312e90c88 --- /dev/null +++ b/dom/media/mediacontrol/tests/browser/browser_media_control_supported_keys.js @@ -0,0 +1,130 @@ +const PAGE_NON_AUTOPLAY = + "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_non_autoplay.html"; + +const testVideoId = "video"; +const sDefaultSupportedKeys = ["focus", "play", "pause", "playpause", "stop"]; + +add_task(async function setupTestingPref() { + await SpecialPowers.pushPrefEnv({ + set: [ + ["media.mediacontrol.testingevents.enabled", true], + ["dom.media.mediasession.enabled", true], + ], + }); +}); + +/** + * Supported media keys are used for indicating what UI button should be shown + * on the virtual control interface. All supported media keys are listed in + * `MediaKey` in `MediaController.webidl`. Some media keys are defined as + * default media keys which are always supported. Otherwise, other media keys + * have to have corresponding action handler on the active media session in + * order to be added to the supported keys. + */ +add_task(async function testDefaultSupportedKeys() { + info(`open media page`); + const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY); + + info(`start media`); + await playMedia(tab, testVideoId); + + info(`should use default supported keys`); + await supportedKeysShouldEqualTo(tab, sDefaultSupportedKeys); + + info(`remove tab`); + await tab.close(); +}); + +add_task(async function testNoActionHandlerBeingSet() { + info(`open media page`); + const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY); + + info(`start media`); + await playMedia(tab, testVideoId); + + info(`create media session but not set any action handler`); + await setMediaSessionSupportedAction(tab, []); + + info( + `should use default supported keys even if ` + + `media session doesn't have any action handler` + ); + await supportedKeysShouldEqualTo(tab, sDefaultSupportedKeys); + + info(`remove tab`); + await tab.close(); +}); + +add_task(async function testSettingActionsWhichAreAlreadyDefaultKeys() { + info(`open media page`); + const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY); + + info(`start media`); + await playMedia(tab, testVideoId); + + info(`create media session but not set any action handler`); + await setMediaSessionSupportedAction(tab, ["play", "pause", "stop"]); + + info( + `those actions has already been included in default supported keys, so ` + + `the result should still be default supported keys` + ); + await supportedKeysShouldEqualTo(tab, sDefaultSupportedKeys); + + info(`remove tab`); + await tab.close(); +}); + +add_task(async function testSettingActionsWhichAreNotDefaultKeys() { + info(`open media page`); + const tab = await createLoadedTabWrapper(PAGE_NON_AUTOPLAY); + + info(`start media`); + await playMedia(tab, testVideoId); + + info(`create media session but not set any action handler`); + let nonDefaultActions = [ + "seekbackward", + "seekforward", + "previoustrack", + "nexttrack", + ]; + await setMediaSessionSupportedAction(tab, nonDefaultActions); + + info( + `supported keys should include those actions which are not default supported keys` + ); + let expectedKeys = sDefaultSupportedKeys.concat(nonDefaultActions); + await supportedKeysShouldEqualTo(tab, expectedKeys); + + info(`remove tab`); + await tab.close(); +}); + +/** + * The following are helper functions. + */ +async function supportedKeysShouldEqualTo(tab, expectedKeys) { + const controller = tab.linkedBrowser.browsingContext.mediaController; + const supportedKeys = controller.supportedKeys; + while (JSON.stringify(expectedKeys) != JSON.stringify(supportedKeys)) { + await new Promise(r => (controller.onsupportedkeyschange = r)); + } + for (let idx = 0; idx < expectedKeys.length; idx++) { + is( + supportedKeys[idx], + expectedKeys[idx], + `'${supportedKeys[idx]}' should equal to '${expectedKeys[idx]}'` + ); + } +} + +function setMediaSessionSupportedAction(tab, actions) { + return SpecialPowers.spawn(tab.linkedBrowser, [actions], actionArr => { + for (let action of actionArr) { + content.navigator.mediaSession.setActionHandler(action, () => { + info(`set '${action}' action handler`); + }); + } + }); +} |