Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <script src="/w3c/resources/testharness.js"></script> | 4 <script src="/w3c/resources/testharness.js"></script> |
| 5 <script src="/w3c/resources/testharnessreport.js"></script> | 5 <script src="/w3c/resources/testharnessreport.js"></script> |
| 6 <script src="mediasource-util.js"></script> | 6 <script src="mediasource-util.js"></script> |
| 7 <link rel='stylesheet' href='/w3c/resources/testharness.css'> | 7 <link rel='stylesheet' href='/w3c/resources/testharness.css'> |
| 8 </head> | 8 </head> |
| 9 <body> | 9 <body> |
| 10 <div id="log"></div> | 10 <div id="log"></div> |
|
wolenetz
2016/06/18 00:27:55
aside: MSE layout test cleanup of these obsolete p
| |
| 11 <script> | 11 <script> |
| 12 function ErrorTest(testFunction, description) | 12 function ErrorTest(testFunction, description) |
| 13 { | 13 { |
| 14 mediasource_test(function(test, mediaElement, mediaSource) | 14 mediasource_test(function(test, mediaElement, mediaSource) |
| 15 { | 15 { |
| 16 var segmentInfo = MediaSourceUtil.SEGMENT_INFO; | 16 var segmentInfo = MediaSourceUtil.SEGMENT_INFO; |
| 17 | 17 |
| 18 if (!segmentInfo) { | 18 if (!segmentInfo) { |
| 19 assert_unreached("No segment info compatible with this M ediaSource implementation."); | 19 assert_unreached("No segment info compatible with this M ediaSource implementation."); |
| 20 return; | 20 return; |
| 21 } | 21 } |
| 22 | 22 |
| 23 var sourceBuffer = mediaSource.addSourceBuffer(segmentInfo.t ype); | 23 var sourceBuffer = mediaSource.addSourceBuffer(segmentInfo.t ype); |
| 24 MediaSourceUtil.loadBinaryData(test, segmentInfo.url, functi on(mediaData) | 24 MediaSourceUtil.loadBinaryData(test, segmentInfo.url, functi on(mediaData) |
| 25 { | 25 { |
| 26 testFunction(test, mediaElement, mediaSource, segmentInf o, sourceBuffer, mediaData); | 26 testFunction(test, mediaElement, mediaSource, segmentInf o, sourceBuffer, mediaData); |
| 27 }); | 27 }); |
| 28 }, description); | 28 }, description); |
| 29 } | 29 } |
| 30 | 30 |
| 31 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) | 31 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) |
| 32 { | 32 { |
| 33 var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]); | 33 var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]); |
| 34 | 34 |
| 35 test.expectEvent(sourceBuffer, "error", "sourceBuffer error."); | |
|
wolenetz
2016/06/18 00:27:55
Note to reviewers: This was the critically missing
| |
| 35 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); | 36 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); |
| 36 test.expectEvent(mediaElement, "error", "mediaElement error."); | 37 test.expectEvent(mediaElement, "error", "mediaElement error."); |
| 38 test.expectEvent(mediaSource, "sourceended", "mediaSource ended. "); | |
| 37 test.expectEvent(mediaSource, "sourceclose", "mediaSource closed ."); | 39 test.expectEvent(mediaSource, "sourceclose", "mediaSource closed ."); |
| 38 sourceBuffer.appendBuffer(mediaSegment); | 40 sourceBuffer.appendBuffer(mediaSegment); |
| 39 | 41 |
| 40 test.waitForExpectedEvents(function() | 42 test.waitForExpectedEvents(function() |
| 41 { | 43 { |
| 42 assert_true(mediaElement.error != null); | 44 assert_true(mediaElement.error != null); |
| 43 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ SRC_NOT_SUPPORTED); | 45 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ SRC_NOT_SUPPORTED); |
| 44 | 46 |
| 45 assert_equals(mediaSource.sourceBuffers.length, 0); | 47 assert_equals(mediaSource.sourceBuffers.length, 0); |
| 46 assert_equals(mediaSource.readyState, "closed"); | 48 assert_equals(mediaSource.readyState, "closed"); |
| 47 test.done(); | 49 test.done(); |
| 48 }); | 50 }); |
| 49 }, "Appending media segment before the first initialization segment. "); | 51 }, "Appending media segment before the first initialization segment. "); |
| 50 | 52 |
| 51 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) | 53 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) |
| 52 { | 54 { |
| 53 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); | 55 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); |
| 54 | 56 |
| 57 // Fail if the append error algorithm occurs, since the decode | |
| 58 // error will be provided by us directly via endOfStream(). | |
| 59 sourceBuffer.addEventListener("error", test.unreached_func("'err or' should not be fired on sourceBuffer")); | |
| 60 | |
| 55 test.expectEvent(mediaElement, "error", "mediaElement error."); | 61 test.expectEvent(mediaElement, "error", "mediaElement error."); |
| 56 test.expectEvent(mediaSource, "sourceended", "mediaSource ended. "); | 62 test.expectEvent(mediaSource, "sourceended", "mediaSource ended. "); |
| 57 test.expectEvent(mediaSource, "sourceclose", "mediaSource closed ."); | 63 test.expectEvent(mediaSource, "sourceclose", "mediaSource closed ."); |
| 58 | 64 |
| 59 mediaSource.endOfStream("decode"); | 65 mediaSource.endOfStream("decode"); |
| 60 | 66 |
| 61 test.waitForExpectedEvents(function() | 67 test.waitForExpectedEvents(function() |
| 62 { | 68 { |
| 63 assert_true(mediaElement.error != null); | 69 assert_true(mediaElement.error != null); |
| 64 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ SRC_NOT_SUPPORTED); | 70 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ SRC_NOT_SUPPORTED); |
| 65 | 71 |
| 66 assert_equals(mediaSource.sourceBuffers.length, 0); | 72 assert_equals(mediaSource.sourceBuffers.length, 0); |
| 67 assert_equals(mediaSource.readyState, "closed"); | 73 assert_equals(mediaSource.readyState, "closed"); |
| 68 test.done(); | |
| 69 }); | 74 }); |
| 75 | |
| 76 // Give a short time for a broken implementation to errantly fir e | |
| 77 // "error" on sourceBuffer. | |
| 78 test.waitForExpectedEvents(test.step_func_done()); | |
| 70 }, "Signaling 'decode' error via endOfStream() before initialization segment has been appended."); | 79 }, "Signaling 'decode' error via endOfStream() before initialization segment has been appended."); |
| 71 | 80 |
| 72 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) | 81 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) |
| 73 { | 82 { |
| 74 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); | 83 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); |
| 75 | 84 |
| 85 // Fail if the append error algorithm occurs, since the network | |
| 86 // error will be provided by us directly via endOfStream(). | |
| 87 sourceBuffer.addEventListener("error", test.unreached_func("'err or' should not be fired on sourceBuffer")); | |
| 88 | |
| 76 test.expectEvent(mediaElement, "error", "mediaElement error."); | 89 test.expectEvent(mediaElement, "error", "mediaElement error."); |
| 77 test.expectEvent(mediaSource, "sourceended", "mediaSource ended. "); | 90 test.expectEvent(mediaSource, "sourceended", "mediaSource ended. "); |
| 78 test.expectEvent(mediaSource, "sourceclose", "mediaSource closed ."); | 91 test.expectEvent(mediaSource, "sourceclose", "mediaSource closed ."); |
| 79 | 92 |
| 80 mediaSource.endOfStream("network"); | 93 mediaSource.endOfStream("network"); |
| 81 | 94 |
| 82 test.waitForExpectedEvents(function() | 95 test.waitForExpectedEvents(function() |
| 83 { | 96 { |
| 84 assert_true(mediaElement.error != null); | 97 assert_true(mediaElement.error != null); |
| 85 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ SRC_NOT_SUPPORTED); | 98 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ SRC_NOT_SUPPORTED); |
| 86 | 99 |
| 87 assert_equals(mediaSource.sourceBuffers.length, 0); | 100 assert_equals(mediaSource.sourceBuffers.length, 0); |
| 88 assert_equals(mediaSource.readyState, "closed"); | 101 assert_equals(mediaSource.readyState, "closed"); |
| 89 test.done(); | |
| 90 }); | 102 }); |
| 103 | |
| 104 // Give a short time for a broken implementation to errantly fir e | |
| 105 // "error" on sourceBuffer. | |
| 106 test.waitForExpectedEvents(test.step_func_done()); | |
| 91 }, "Signaling 'network' error via endOfStream() before initializatio n segment has been appended."); | 107 }, "Signaling 'network' error via endOfStream() before initializatio n segment has been appended."); |
| 92 | 108 |
| 93 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) | 109 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) |
| 94 { | 110 { |
| 95 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); | 111 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); |
| 96 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); | 112 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); |
| 97 | 113 |
| 114 // Fail if the append error algorithm occurs, since the decode | |
| 115 // error will be provided by us directly via endOfStream(). | |
| 116 sourceBuffer.addEventListener("error", test.unreached_func("'err or' should not be fired on sourceBuffer")); | |
| 117 | |
| 98 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); | 118 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); |
| 99 test.expectEvent(mediaElement, "loadedmetadata", "mediaElement m etadata."); | 119 test.expectEvent(mediaElement, "loadedmetadata", "mediaElement m etadata."); |
| 100 sourceBuffer.appendBuffer(initSegment); | 120 sourceBuffer.appendBuffer(initSegment); |
| 101 | 121 |
| 102 test.waitForExpectedEvents(function() | 122 test.waitForExpectedEvents(function() |
| 103 { | 123 { |
| 104 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE _METADATA); | 124 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE _METADATA); |
| 105 | 125 |
| 106 test.expectEvent(mediaElement, "error", "mediaElement error. "); | 126 test.expectEvent(mediaElement, "error", "mediaElement error. "); |
| 107 test.expectEvent(mediaSource, "sourceended", "mediaSource en ded."); | 127 test.expectEvent(mediaSource, "sourceended", "mediaSource en ded."); |
| 108 mediaSource.endOfStream("decode"); | 128 mediaSource.endOfStream("decode"); |
| 109 }); | 129 }); |
| 110 | 130 |
| 111 test.waitForExpectedEvents(function() | 131 test.waitForExpectedEvents(function() |
| 112 { | 132 { |
| 113 assert_true(mediaElement.error != null); | 133 assert_true(mediaElement.error != null); |
| 114 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ DECODE); | 134 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ DECODE); |
| 115 assert_equals(mediaSource.readyState, "ended"); | 135 assert_equals(mediaSource.readyState, "ended"); |
| 116 test.done(); | |
| 117 }); | 136 }); |
| 137 | |
| 138 // Give a short time for a broken implementation to errantly fir e | |
| 139 // "error" on sourceBuffer. | |
| 140 test.waitForExpectedEvents(test.step_func_done()); | |
| 118 }, "Signaling 'decode' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA."); | 141 }, "Signaling 'decode' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA."); |
| 119 | 142 |
| 120 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) | 143 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) |
| 121 { | 144 { |
| 122 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); | 145 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); |
| 123 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); | 146 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); |
| 124 | 147 |
| 148 // Fail if the append error algorithm occurs, since the network | |
| 149 // error will be provided by us directly via endOfStream(). | |
| 150 sourceBuffer.addEventListener("error", test.unreached_func("'err or' should not be fired on sourceBuffer")); | |
| 151 | |
| 125 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); | 152 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); |
| 126 test.expectEvent(mediaElement, "loadedmetadata", "mediaElement m etadata."); | 153 test.expectEvent(mediaElement, "loadedmetadata", "mediaElement m etadata."); |
| 127 sourceBuffer.appendBuffer(initSegment); | 154 sourceBuffer.appendBuffer(initSegment); |
| 128 | 155 |
| 129 test.waitForExpectedEvents(function() | 156 test.waitForExpectedEvents(function() |
| 130 { | 157 { |
| 131 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE _METADATA); | 158 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE _METADATA); |
| 132 | 159 |
| 133 test.expectEvent(mediaElement, "error", "mediaElement error. "); | 160 test.expectEvent(mediaElement, "error", "mediaElement error. "); |
| 134 test.expectEvent(mediaSource, "sourceended", "mediaSource en ded."); | 161 test.expectEvent(mediaSource, "sourceended", "mediaSource en ded."); |
| 135 mediaSource.endOfStream("network"); | 162 mediaSource.endOfStream("network"); |
| 136 }); | 163 }); |
| 137 | 164 |
| 138 test.waitForExpectedEvents(function() | 165 test.waitForExpectedEvents(function() |
| 139 { | 166 { |
| 140 assert_true(mediaElement.error != null); | 167 assert_true(mediaElement.error != null); |
| 141 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ NETWORK); | 168 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ NETWORK); |
| 142 assert_equals(mediaSource.readyState, "ended"); | 169 assert_equals(mediaSource.readyState, "ended"); |
| 143 test.done(); | |
| 144 }); | 170 }); |
| 171 | |
| 172 // Give a short time for a broken implementation to errantly fir e | |
| 173 // "error" on sourceBuffer. | |
| 174 test.waitForExpectedEvents(test.step_func_done()); | |
| 145 }, "Signaling 'network' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.") ; | 175 }, "Signaling 'network' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.") ; |
| 146 | 176 |
| 147 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) | 177 ErrorTest(function(test, mediaElement, mediaSource, segmentInfo, sou rceBuffer, mediaData) |
| 148 { | 178 { |
| 149 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); | 179 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_NOT HING); |
| 150 | 180 |
| 151 var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]); | 181 var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]); |
| 152 var index = segmentInfo.init.size + (mediaSegment.length - 1) / 2; | 182 var index = segmentInfo.init.size + (mediaSegment.length - 1) / 2; |
| 153 // Corrupt the media data from index of mediaData, so it can sig nal 'decode' error. | 183 // Corrupt the media data from index of mediaData, so it can sig nal 'decode' error. |
| 154 // Here use mediaSegment to replace the original mediaData[index , index + mediaSegment.length] | 184 // Here use mediaSegment to replace the original mediaData[index , index + mediaSegment.length] |
| 155 mediaData.set(mediaSegment, index); | 185 mediaData.set(mediaSegment, index); |
| 156 | 186 |
| 187 test.expectEvent(mediaElement, "loadedmetadata", "mediaElement m etadata."); | |
| 188 test.expectEvent(sourceBuffer, "error", "sourceBuffer error."); | |
|
wolenetz
2016/06/18 00:27:55
ditto note to reviewers
| |
| 189 test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended."); | |
| 157 test.expectEvent(mediaElement, "error", "mediaElement error."); | 190 test.expectEvent(mediaElement, "error", "mediaElement error."); |
| 191 test.expectEvent(mediaSource, "sourceended", "mediaSource ended. "); | |
| 158 sourceBuffer.appendBuffer(mediaData); | 192 sourceBuffer.appendBuffer(mediaData); |
| 159 | 193 |
| 160 test.waitForExpectedEvents(function() | 194 test.waitForExpectedEvents(function() |
| 161 { | 195 { |
| 162 assert_true(mediaElement.error != null); | 196 assert_true(mediaElement.error != null); |
| 163 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ DECODE); | 197 assert_equals(mediaElement.error.code, MediaError.MEDIA_ERR_ DECODE); |
| 164 test.done(); | 198 test.done(); |
| 165 }); | 199 }); |
| 166 }, "Signaling 'decode' error via segment parser loop algorithm after initialization segment and partial media segment has been appended."); | 200 }, "Signaling 'decode' error via segment parser loop algorithm after initialization segment and partial media segment has been appended."); |
| 167 </script> | 201 </script> |
| 168 </body> | 202 </body> |
| 169 </html> | 203 </html> |
| OLD | NEW |