diff options
Diffstat (limited to 'dom/media/mediacontrol/tests/browser/browser_media_control_seekto.js')
-rw-r--r-- | dom/media/mediacontrol/tests/browser/browser_media_control_seekto.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/dom/media/mediacontrol/tests/browser/browser_media_control_seekto.js b/dom/media/mediacontrol/tests/browser/browser_media_control_seekto.js new file mode 100644 index 0000000000..70b75841b6 --- /dev/null +++ b/dom/media/mediacontrol/tests/browser/browser_media_control_seekto.js @@ -0,0 +1,89 @@ +const PAGE_URL = + "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_non_autoplay.html"; + +const testVideoId = "video"; + +add_task(async function setupTestingPref() { + await SpecialPowers.pushPrefEnv({ + set: [ + ["media.mediacontrol.testingevents.enabled", true], + ["dom.media.mediasession.enabled", true], + ], + }); +}); + +/** + * This test is used to check if the `seekto` action can be sent when calling + * media controller's `seekTo()`. In addition, the seeking related properties + * which would be sent to the action handler should also be correct as what we + * set in `seekTo()`. + */ +add_task(async function testSetPositionState() { + info(`open media page`); + const tab = await createLoadedTabWrapper(PAGE_URL); + + info(`start media`); + await playMedia(tab, testVideoId); + + const seektime = 0; + info(`seek to ${seektime} seconds.`); + await PerformSeekTo(tab, { + seekTime: seektime, + }); + + info(`seek to ${seektime} seconds and set fastseek to boolean`); + await PerformSeekTo(tab, { + seekTime: seektime, + fastSeek: true, + }); + + info(`seek to ${seektime} seconds and set fastseek to false`); + await PerformSeekTo(tab, { + seekTime: seektime, + fastSeek: false, + }); + + info(`remove tab`); + await tab.close(); +}); + +/** + * The following is helper function. + */ +async function PerformSeekTo(tab, seekDetails) { + await SpecialPowers.spawn( + tab.linkedBrowser, + [seekDetails, testVideoId], + (seekDetails, Id) => { + const { seekTime, fastSeek } = seekDetails; + content.navigator.mediaSession.setActionHandler("seekto", details => { + ok(details.seekTime != undefined, "Seektime must be presented"); + is(seekTime, details.seekTime, "Get correct seektime"); + if (fastSeek) { + is(fastSeek, details.fastSeek, "Get correct fastSeek"); + } else { + ok( + details.fastSeek === undefined, + "Details should not contain fastSeek" + ); + } + // We use `onseek` as a hint to know if the `seekto` has been received + // or not. The reason we don't return a resolved promise instead is + // because if we do so, it can't guarantees that the `seekto` action + // handler has been set before calling `mediaController.seekTo`. + content.document.getElementById(Id).currentTime = seekTime; + }); + } + ); + const seekPromise = SpecialPowers.spawn( + tab.linkedBrowser, + [testVideoId], + Id => { + const video = content.document.getElementById(Id); + return new Promise(r => (video.onseeking = r())); + } + ); + const { seekTime, fastSeek } = seekDetails; + tab.linkedBrowser.browsingContext.mediaController.seekTo(seekTime, fastSeek); + await seekPromise; +} |