Bug 1314533: Do not expect init segment to be parsed when appending corrupted data. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Sun, 06 Nov 2016 21:57:06 +1100
changeset 434591 e248e71fe507e00608f89194cfd43f553c8e416f
parent 434580 cdbcadded32625229eca1eff1d3d4b919dad8593
child 434592 c839301cec1e4f32718a1595f8ed8f80b948b4c3
push id34779
push userbmo:jyavenard@mozilla.com
push dateMon, 07 Nov 2016 01:43:58 +0000
reviewersgerald
bugs1314533
milestone52.0a1
Bug 1314533: Do not expect init segment to be parsed when appending corrupted data. r?gerald From the Segment Parser Loop definition: https://w3c.github.io/media-source/index.html#sourcebuffer-segment-parser-loop "2. If the input buffer contains bytes that violate the SourceBuffer byte stream format specification, then run the append error algorithm and abort this algorithm." The test appends data with a valid init segment followed by corrupted content. The corrupted content satisfies the condition that the input buffer contains bytes that violate byte stream format specification. As such, the append error algorithm is to be run prior parsing the init segment. Add a new test verifying the defined behavior.
testing/web-platform/tests/media-source/mediasource-errors.html
--- a/testing/web-platform/tests/media-source/mediasource-errors.html
+++ b/testing/web-platform/tests/media-source/mediasource-errors.html
@@ -169,29 +169,66 @@
             test.step_timeout(test.step_func_done(), 0);
         });
     }, "Signaling 'network' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.");
 
     ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
     {
         assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOTHING);
 
+        var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
+        test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
+        test.expectEvent(mediaElement, "loadedmetadata", "mediaElement metadata.");
+        sourceBuffer.appendBuffer(initSegment);
+
+        test.waitForExpectedEvents(function()
+        {
+            assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_METADATA);
+            var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);
+            var index = segmentInfo.init.size + (mediaSegment.length - 1) / 2;
+            // Corrupt the media data from index of mediaData, so it can signal 'decode' error.
+            // Here use mediaSegment to replace the original mediaData[index, index + mediaSegment.length]
+            mediaData.set(mediaSegment, index);
+
+            test.expectEvent(sourceBuffer, "error", "sourceBuffer error.");
+            test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
+            test.expectEvent(mediaElement, "error", "mediaElement error.");
+            test.expectEvent(mediaSource, "sourceended", "mediaSource ended.");
+            sourceBuffer.appendBuffer(mediaData);
+        });
+
+        test.waitForExpectedEvents(function()
+        {
+            assert_true(mediaElement.error != null);
+            assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_DECODE);
+            test.done();
+        });
+    }, "Signaling 'decode' error via segment parser loop algorithm after initialization segment has been appended.");
+
+    ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
+    {
+        assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOTHING);
+
+        // Fail if the append error algorithm occurs, since the network
+        // error will be provided by us directly via endOfStream().
+        mediaElement.addEventListener("loadedmetadata", test.unreached_func("'loadedmetadata' should not be fired on mediaElement"));
+
         var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);
         var index = segmentInfo.init.size + (mediaSegment.length - 1) / 2;
         // Corrupt the media data from index of mediaData, so it can signal 'decode' error.
         // Here use mediaSegment to replace the original mediaData[index, index + mediaSegment.length]
         mediaData.set(mediaSegment, index);
 
-        test.expectEvent(mediaElement, "loadedmetadata", "mediaElement metadata.");
         test.expectEvent(sourceBuffer, "error", "sourceBuffer error.");
         test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
         test.expectEvent(mediaElement, "error", "mediaElement error.");
         test.expectEvent(mediaSource, "sourceended", "mediaSource ended.");
         sourceBuffer.appendBuffer(mediaData);
 
         test.waitForExpectedEvents(function()
         {
+            assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOTHING);
             assert_true(mediaElement.error != null);
-            assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_DECODE);
+            assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED);
             test.done();
         });
-    }, "Signaling 'decode' error via segment parser loop algorithm after initialization segment and partial media segment has been appended.");
+    }, "Signaling 'decode' error via segment parser loop algorithm.");
 </script>