4 <script src=
"/w3c/resources/testharness.js"></script>
5 <script src=
"/w3c/resources/testharnessreport.js"></script>
6 <script src=
"mediasource-util.js"></script>
7 <link rel='stylesheet' href='/w3c/resources/testharness.css'
>
12 function ErrorTest(testFunction
, description
)
14 mediasource_test(function(test
, mediaElement
, mediaSource
)
16 var segmentInfo
= MediaSourceUtil
.SEGMENT_INFO
;
19 assert_unreached("No segment info compatible with this MediaSource implementation.");
23 var sourceBuffer
= mediaSource
.addSourceBuffer(segmentInfo
.type
);
24 MediaSourceUtil
.loadBinaryData(test
, segmentInfo
.url
, function(mediaData
)
26 testFunction(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
);
31 ErrorTest(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
33 var mediaSegment
= MediaSourceUtil
.extractSegmentData(mediaData
, segmentInfo
.media
[0]);
35 test
.expectEvent(sourceBuffer
, "updateend", "mediaSegment append ended.");
36 test
.expectEvent(mediaElement
, "error", "mediaElement error.");
37 test
.expectEvent(mediaSource
, "sourceclose", "mediaSource closed.");
38 sourceBuffer
.appendBuffer(mediaSegment
);
40 test
.waitForExpectedEvents(function()
42 assert_true(mediaElement
.error
!= null);
43 assert_equals(mediaElement
.error
.code
, MediaError
.MEDIA_ERR_SRC_NOT_SUPPORTED
);
45 assert_equals(mediaSource
.sourceBuffers
.length
, 0);
46 assert_equals(mediaSource
.readyState
, "closed");
49 }, "Appending media segment before the first initialization segment.");
51 ErrorTest(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
53 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_NOTHING
);
55 test
.expectEvent(mediaElement
, "error", "mediaElement error.");
56 test
.expectEvent(mediaSource
, "sourceended", "mediaSource ended.");
57 test
.expectEvent(mediaSource
, "sourceclose", "mediaSource closed.");
59 mediaSource
.endOfStream("decode");
61 test
.waitForExpectedEvents(function()
63 assert_true(mediaElement
.error
!= null);
64 assert_equals(mediaElement
.error
.code
, MediaError
.MEDIA_ERR_SRC_NOT_SUPPORTED
);
66 assert_equals(mediaSource
.sourceBuffers
.length
, 0);
67 assert_equals(mediaSource
.readyState
, "closed");
70 }, "Signaling 'decode' error via endOfStream() before initialization segment has been appended.");
72 ErrorTest(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
74 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_NOTHING
);
76 test
.expectEvent(mediaElement
, "error", "mediaElement error.");
77 test
.expectEvent(mediaSource
, "sourceended", "mediaSource ended.");
78 test
.expectEvent(mediaSource
, "sourceclose", "mediaSource closed.");
80 mediaSource
.endOfStream("network");
82 test
.waitForExpectedEvents(function()
84 assert_true(mediaElement
.error
!= null);
85 assert_equals(mediaElement
.error
.code
, MediaError
.MEDIA_ERR_SRC_NOT_SUPPORTED
);
87 assert_equals(mediaSource
.sourceBuffers
.length
, 0);
88 assert_equals(mediaSource
.readyState
, "closed");
91 }, "Signaling 'network' error via endOfStream() before initialization segment has been appended.");
93 ErrorTest(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
95 var initSegment
= MediaSourceUtil
.extractSegmentData(mediaData
, segmentInfo
.init
);
96 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_NOTHING
);
98 test
.expectEvent(sourceBuffer
, "updateend", "mediaSegment append ended.");
99 test
.expectEvent(mediaElement
, "loadedmetadata", "mediaElement metadata.");
100 sourceBuffer
.appendBuffer(initSegment
);
102 test
.waitForExpectedEvents(function()
104 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_METADATA
);
106 test
.expectEvent(mediaElement
, "error", "mediaElement error.");
107 test
.expectEvent(mediaSource
, "sourceended", "mediaSource ended.");
108 mediaSource
.endOfStream("decode");
111 test
.waitForExpectedEvents(function()
113 assert_true(mediaElement
.error
!= null);
114 assert_equals(mediaElement
.error
.code
, MediaError
.MEDIA_ERR_DECODE
);
115 assert_equals(mediaSource
.readyState
, "ended");
118 }, "Signaling 'decode' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.");
120 ErrorTest(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
122 var initSegment
= MediaSourceUtil
.extractSegmentData(mediaData
, segmentInfo
.init
);
123 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_NOTHING
);
125 test
.expectEvent(sourceBuffer
, "updateend", "mediaSegment append ended.");
126 test
.expectEvent(mediaElement
, "loadedmetadata", "mediaElement metadata.");
127 sourceBuffer
.appendBuffer(initSegment
);
129 test
.waitForExpectedEvents(function()
131 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_METADATA
);
133 test
.expectEvent(mediaElement
, "error", "mediaElement error.");
134 test
.expectEvent(mediaSource
, "sourceended", "mediaSource ended.");
135 mediaSource
.endOfStream("network");
138 test
.waitForExpectedEvents(function()
140 assert_true(mediaElement
.error
!= null);
141 assert_equals(mediaElement
.error
.code
, MediaError
.MEDIA_ERR_NETWORK
);
142 assert_equals(mediaSource
.readyState
, "ended");
145 }, "Signaling 'network' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.");
147 ErrorTest(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
149 assert_equals(mediaElement
.readyState
, HTMLMediaElement
.HAVE_NOTHING
);
151 var mediaSegment
= MediaSourceUtil
.extractSegmentData(mediaData
, segmentInfo
.media
[0]);
152 var index
= segmentInfo
.init
.size
+ (mediaSegment
.length
- 1) / 2;
153 // Corrupt the media data from index of mediaData, so it can signal 'decode' error.
154 // Here use mediaSegment to replace the original mediaData[index, index + mediaSegment.length]
155 mediaData
.set(mediaSegment
, index
);
157 test
.expectEvent(mediaElement
, "error", "mediaElement error.");
158 sourceBuffer
.appendBuffer(mediaData
);
160 test
.waitForExpectedEvents(function()
162 assert_true(mediaElement
.error
!= null);
163 assert_equals(mediaElement
.error
.code
, MediaError
.MEDIA_ERR_DECODE
);
166 }, "Signaling 'decode' error via segment parser loop algorithm after initialization segment and partial media segment has been appended.");