Bug 1450845 - Add test to ensure seekToNextFrame rejects if a media element is playing. r?jya draft
authorBryce Van Dyk <bvandyk@mozilla.com>
Mon, 04 Jun 2018 09:10:59 -0400
changeset 803544 5c40d9d6d334c081345c77b0502924acc61be2ce
parent 803543 3799dd9d3d91916c5804b2dbc61c841f8875a0b3
push id112142
push userbvandyk@mozilla.com
push dateMon, 04 Jun 2018 14:27:53 +0000
reviewersjya
bugs1450845
milestone62.0a1
Bug 1450845 - Add test to ensure seekToNextFrame rejects if a media element is playing. r?jya MozReview-Commit-ID: C90yh4qoYTT
dom/media/test/mochitest.ini
dom/media/test/test_seekToNextFrame_failsIfPlaying.html
--- a/dom/media/test/mochitest.ini
+++ b/dom/media/test/mochitest.ini
@@ -1116,16 +1116,18 @@ skip-if = toolkit == 'android' # bug 129
 [test_seek-14.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
 [test_seekable1.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
 [test_seekLies.html]
 skip-if = android_version == '15' || android_version == '17' # android(bug 1232305)
 [test_seekToNextFrame.html]
 skip-if = toolkit == 'android' # bug 1329391, android(bug 1232305)
+[test_seekToNextFrame_failsIfPlaying.html]
+skip-if = toolkit == 'android' # bug 1329391, android(bug 1232305)
 tags=seektonextframe
 [test_source.html]
 skip-if = android_version == '17' # android(bug 1232305)
 [test_source_null.html]
 skip-if = android_version == '17' # android(bug 1232305)
 [test_source_write.html]
 skip-if = android_version == '17' # android(bug 1232305)
 [test_standalone.html]
new file mode 100644
--- /dev/null
+++ b/dom/media/test/test_seekToNextFrame_failsIfPlaying.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test seekToNextFrame fails if called on playing media</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+  <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+// See also Bug 1450845
+function startTest(test, token) {
+  var v = document.createElement("video");
+  v.preload = "auto";
+  v.token = token; // Unused in test, but used by harness
+  let seenEnded = false;
+
+  var handler = {
+    "ontimeout": function() {
+      Log(token, `timed out: ended=${seenEnded}`);
+    }
+  };
+  manager.started(token, handler);
+
+  v.src = test.name;
+  v.name = test.name;
+
+  let onCanplay = async () => {
+    let playPromise = v.play();
+    ok(!v.paused, `${token}: v.paused should be false immediately after play()`);
+    try {
+      // Should reject as we can't seek on a playing element, even if
+      // playPromise is still pending.
+      await v.seekToNextFrame();
+      ok(false, `${token}: v.seekToNextFrame() should fail on playing video`);
+    } catch (e) {
+      is(e.name,
+         "InvalidStateError",
+         `${token}: v.seekToNextFrame() should be rejected with ` +
+         "InvalidStateError if called on playing element"
+      );
+    }
+    await playPromise;
+    // Avoid raciness in the test in the unlikely case we finish playback. If
+    // we have finished playback and become paused the next seekToNextFrame
+    // will not fail as we expect.
+    if (seenEnded) {
+      finish();
+      return;
+    }
+    ok(!v.paused, `${token}: v.paused should be false after play() promise succeeds`);
+    try {
+      await v.seekToNextFrame();
+      ok(false, `${token}: v.seekToNextFrame() should fail on playing video`);
+    } catch (e) {
+      is(e.name,
+         "InvalidStateError",
+         `${token}: v.seekToNextFrame() should be rejected with ` +
+         "InvalidStateError if called on playing element"
+      );
+    }
+    finish();
+  };
+
+  let onSeeking = () => {
+    ok(false, `${token}: video should never seek!`);
+  };
+
+  let onEnded = () => {
+    seenEnded = true;
+  };
+
+  function finish() {
+    v.removeEventListener("canplay", onCanplay);
+    v.removeEventListener("seeking", onSeeking);
+    removeNodeAndSource(v);
+    manager.finished(token);
+  }
+
+  v.addEventListener("canplay", onCanplay);
+  v.addEventListener("seeking", onSeeking);
+  v.addEventListener("ended", onEnded);
+
+  document.body.appendChild(v);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+  {
+    "set": [
+      ["media.seekToNextFrame.enabled", true ],
+      ["media.dormant-on-pause-timeout-ms", -1]
+    ]
+  },
+  () => {
+    manager.runTests(gSeekToNextFrameTests, startTest);
+  }
+);
+
+</script>
+</pre>
+</body>
+</html>