Bug 1297036: [MSE] P1. Add mochitest to verify behavior. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Fri, 26 Aug 2016 23:10:00 +1200
changeset 406634 8bb8add1f48d4f7b8546e7fa16124df3dc3b2e6d
parent 406631 072f680acd8b323f014fdcc7d5d39d395cb7dae6
child 406635 de0cfee3c576cb8cc51325cf89f88de3c782f602
push id27783
push userbmo:jyavenard@mozilla.com
push dateMon, 29 Aug 2016 07:55:20 +0000
reviewersgerald
bugs1297036
milestone51.0a1
Bug 1297036: [MSE] P1. Add mochitest to verify behavior. r?gerald Seeking in the buffered range should always succeed, even if we have no data in a given track MozReview-Commit-ID: FGjsDCNIdWC
dom/media/mediasource/test/mochitest.ini
dom/media/mediasource/test/test_SeekToEnd_mp4.html
--- a/dom/media/mediasource/test/mochitest.ini
+++ b/dom/media/mediasource/test/mochitest.ini
@@ -99,16 +99,18 @@ skip-if = ((os == "win" && os_version ==
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
 [test_SeekableBeforeEndOfStreamSplit.html]
 [test_SeekableBeforeEndOfStreamSplit_mp4.html]
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
 [test_SeekNoData_mp4.html]
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
 [test_SeekedEvent_mp4.html]
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekToEnd_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
 [test_SeekTwice_mp4.html]
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
 [test_Sequence_mp4.html]
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
 [test_SetModeThrows.html]
 [test_SplitAppendDelay.html]
 [test_SplitAppendDelay_mp4.html]
 skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
new file mode 100644
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekToEnd_mp4.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>MSE: seeking to end of data with data gap.</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="mediasource.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+
+  once(ms, 'sourceopen').then(function() {
+    ok(true, "Receive a sourceopen event");
+    var videosb = ms.addSourceBuffer("video/mp4");
+    var audiosb = ms.addSourceBuffer("audio/mp4");
+
+    fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+    .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 6), '.m4s'))
+    .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4'))
+    .then(function() {
+      is(videosb.buffered.length, 1, "continuous buffered range");
+      // Ensure we have at least 2s less audio than video.
+      audiosb.appendWindowEnd = videosb.buffered.end(0) - 2;
+      return fetchAndLoad(audiosb, 'bipbop/bipbop_audio', range(1, 6), '.m4s');
+    }).then(function() {
+      ms.endOfStream();
+      return Promise.all([once(el, "durationchange"), once(ms, "sourceended")]);
+    }).then(function() {
+      ok(true, "endOfStream completed");
+      // Seek to the middle of the gap where audio is missing. As we are in readyState = ended
+      // seeking must complete.
+      el.currentTime = videosb.buffered.end(0) / 2 + audiosb.buffered.end(0) / 2;
+      ok(el.currentTime - audiosb.buffered.end(0) > 1, "gap is big enough");
+      is(el.buffered.length, 1, "continuous buffered range");
+      is(el.buffered.end(0), videosb.buffered.end(0), "buffered range end is aligned with longest track");
+      ok(el.seeking, "element is now seeking");
+      ok(el.currentTime >= el.buffered.start(0) && el.currentTime <= el.buffered.end(0), "seeking time is in buffered range");
+      ok(el.currentTime > audiosb.buffered.end(0), "seeking point is not buffered in audio track");
+      return once(el, 'seeked');
+    }).then(function() {
+      ok(true, "we have successfully seeked");
+      // Now ensure that we can play to the end, even though we are missing data in one track.
+      el.play();
+      once(el, 'ended').then(SimpleTest.finish.bind(SimpleTest));
+    });
+  });
+});
+
+</script>
+</pre>
+</body>
+</html>