summaryrefslogtreecommitdiffstats
path: root/dom/media/test/test_background_video_suspend_ready_state.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/test/test_background_video_suspend_ready_state.html')
-rw-r--r--dom/media/test/test_background_video_suspend_ready_state.html74
1 files changed, 74 insertions, 0 deletions
diff --git a/dom/media/test/test_background_video_suspend_ready_state.html b/dom/media/test/test_background_video_suspend_ready_state.html
new file mode 100644
index 0000000000..af5a4811ef
--- /dev/null
+++ b/dom/media/test/test_background_video_suspend_ready_state.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>Check element's ready state while suspending video decoding</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<script src="manifest.js"></script>
+<script src="background_video.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+<script type="application/javascript">
+
+/**
+ * This test is used to ensure that the media element's ready state won't be
+ * incorrectly changed to `HAVE_METADATA` or lower when seeking happens on a
+ * null decoder that is caused by suspending video decoding.
+ */
+add_task(async function setupTestingPref() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["media.test.video-suspend", true],
+ ["media.suspend-bkgnd-video.enabled", true],
+ ["media.suspend-bkgnd-video.delay-ms", 0],
+ ],
+ });
+});
+
+add_task(async function testReadyStateWhenSuspendingVideoDecoding() {
+ const video = await createPlayingVideo();
+ assertVideoReadyStateIsSufficientForPlaying(video);
+ await suspendVideoDecoding(video);
+ await seekVideo(video);
+ assertVideoReadyStateIsSufficientForPlaying(video);
+});
+
+async function createPlayingVideo() {
+ let video = document.createElement("video");
+ video.src = "gizmo.mp4";
+ video.controls = true;
+ video.loop = true;
+ document.body.appendChild(video);
+ ok(await video.play().then(_=>true, _=>false), "video started playing");
+ return video;
+}
+
+function assertVideoReadyStateIsSufficientForPlaying(video) {
+ ok(video.readyState > HTMLMediaElement.HAVE_METADATA,
+ `Ready state ${video.readyState} is suffient for playing`);
+}
+
+async function suspendVideoDecoding(video) {
+ video.setVisible(false);
+ nextVideoSuspends(video);
+ info(`suspended video decoding`);
+ // Because the suspend event we received can only indicate MDSM finishes the
+ // setup of suspending decoding, but the actual setting the null decoder
+ // happens on MediaFormatReader where we are not able to observe the behavior
+ // via event. Instread of implementing something in MFR to propagate the event
+ // or changing the timing of current suspend event, which might increase the
+ // maintenance effect, Here choose to use a simple workaround to wait for a
+ // short while to ensure the decoding has been switched to the null decoder.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 2000));
+}
+
+async function seekVideo(video) {
+ video.currentTime = 0;
+ ok(await new Promise(r => video.onseeked = r).then(_=>true, _=>false),
+ `seeking completed`);
+}
+
+</script>
+</head>
+<body>
+</body>
+</html>