summaryrefslogtreecommitdiffstats
path: root/dom/media/test/test_bug1512958.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/test/test_bug1512958.html')
-rw-r--r--dom/media/test/test_bug1512958.html74
1 files changed, 74 insertions, 0 deletions
diff --git a/dom/media/test/test_bug1512958.html b/dom/media/test/test_bug1512958.html
new file mode 100644
index 0000000000..2513515542
--- /dev/null
+++ b/dom/media/test/test_bug1512958.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that pausing and resuming a captured media element with audio doesn't stall</title>
+ <script 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>
+<audio id="a"></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+function dumpEvent({target, type}) {
+ info(`${target.name} GOT EVENT ${type} currentTime=${target.currentTime} ` +
+ `paused=${target.paused} ended=${target.ended} ` +
+ `readyState=${target.readyState}`);
+}
+
+function wait(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
+
+const a = document.getElementById('a');
+
+const events = ["timeupdate", "seeking", "seeked", "ended", "playing", "pause"];
+for (let ev of events) {
+ a.addEventListener(ev, dumpEvent);
+}
+
+(async () => {
+ try {
+ SimpleTest.waitForExplicitFinish();
+ SimpleTest.requestFlakyTimeout("Timeouts for shortcutting test-timeout");
+
+ const test = getPlayableAudio(gTrackTests.filter(t => t.duration > 2));
+ if (!test) {
+ todo(false, "No playable audio");
+ return;
+ }
+
+ // Start playing and capture
+ a.src = test.name;
+ a.name = test.name;
+ const ac = new AudioContext();
+ ac.createMediaElementSource(a);
+ a.play();
+ do {
+ await new Promise(r => a.ontimeupdate = r);
+ } while(a.currentTime == 0)
+
+ // Pause to trigger recreating tracks in DecodedStream
+ a.pause();
+ await new Promise(r => a.onpause = r);
+
+ // Resuming should now work. Bug 1512958 would cause a stall because the
+ // original track wasn't ended and we'd block on it.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=1512958#c5
+ a.play();
+ await new Promise(r => a.onplaying = r);
+ a.currentTime = test.duration - 1;
+ await Promise.race([
+ new Promise(res => a.onended = res),
+ wait(30000).then(() => Promise.reject(new Error("Timeout"))),
+ ]);
+ } catch(e) {
+ ok(false, e);
+ } finally {
+ SimpleTest.finish();
+ }
+})();
+</script>
+</pre>
+</body>
+</html>