| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>SourceBuffer.mode test cases.</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="mediasource-util.js"></script> |
| </head> |
| <body> |
| <div id="log"></div> |
| <script> |
| mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| assert_equals(sourceBuffer.mode, 'segments', 'default append mode should be \'segments\''); |
| test.done(); |
| }, 'Test initial value of SourceBuffer.mode is "segments"'); |
| |
| mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| sourceBuffer.mode = 'sequence'; |
| assert_equals(sourceBuffer.mode, 'sequence', 'mode after setting it to \'sequence\''); |
| |
| // Setting a mode that is not in AppendMode IDL enum should be ignored and not cause exception. |
| sourceBuffer.mode = 'invalidmode'; |
| sourceBuffer.mode = null; |
| sourceBuffer.mode = ''; |
| sourceBuffer.mode = 'Segments'; |
| assert_equals(sourceBuffer.mode, 'sequence', 'mode unchanged by attempts to set invalid modes'); |
| |
| sourceBuffer.mode = 'segments'; |
| assert_equals(sourceBuffer.mode, 'segments', 'mode after setting it to \'segments\''); |
| test.done(); |
| }, 'Test setting SourceBuffer.mode'); |
| |
| mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| mediaSource.removeSourceBuffer(sourceBuffer); |
| assert_throws('InvalidStateError', |
| function() { sourceBuffer.mode = 'segments'; }, |
| 'Setting valid sourceBuffer.mode on removed SourceBuffer should throw InvalidStateError.'); |
| test.done(); |
| }, 'Test setting a removed SourceBuffer\'s mode'); |
| |
| mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| sourceBuffer.appendBuffer(mediaData); |
| assert_true(sourceBuffer.updating, 'updating attribute is true'); |
| assert_throws('InvalidStateError', |
| function() { sourceBuffer.mode = 'segments'; }, |
| 'Setting valid sourceBuffer.mode on updating SourceBuffer threw InvalidStateError.'); |
| test.done(); |
| }, 'Test setting SourceBuffer.mode while still updating'); |
| |
| mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| test.expectEvent(sourceBuffer, 'updateend', 'Append ended.'); |
| sourceBuffer.appendBuffer(mediaData); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_false(sourceBuffer.updating, 'updating attribute is false'); |
| |
| test.expectEvent(mediaSource, 'sourceended', 'MediaSource sourceended event'); |
| mediaSource.endOfStream(); |
| assert_equals(mediaSource.readyState, 'ended', 'MediaSource readyState is \'ended\''); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_equals(mediaSource.readyState, 'ended', 'MediaSource readyState is \'ended\''); |
| |
| test.expectEvent(mediaSource, 'sourceopen', 'MediaSource sourceopen event'); |
| sourceBuffer.mode = 'segments'; |
| |
| assert_equals(mediaSource.readyState, 'open', 'MediaSource readyState is \'open\''); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_equals(mediaSource.readyState, 'open', 'MediaSource readyState is \'open\''); |
| test.done(); |
| }); |
| }, 'Test setting SourceBuffer.mode triggers parent MediaSource \'ended\' to \'open\' transition.'); |
| |
| mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); |
| var fullMediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]); |
| var truncateAt = Math.floor(segmentInfo.media[0].size * 0.5); // Pick first 50% of segment bytes. |
| var partialMediaSegment = fullMediaSegment.subarray(0, truncateAt); |
| var mediaSegmentRemainder = fullMediaSegment.subarray(truncateAt); |
| |
| // Append init segment. |
| test.expectEvent(sourceBuffer, 'updateend', 'Init segment append ended.'); |
| sourceBuffer.appendBuffer(initSegment); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_false(sourceBuffer.updating, 'updating attribute is false'); |
| assert_equals(sourceBuffer.mode, 'segments'); |
| sourceBuffer.mode = 'segments'; // No exception should occur. |
| assert_equals(sourceBuffer.timestampOffset, 0.0); |
| sourceBuffer.timestampOffset = 10.123456789; // No exception should occur. |
| assert_equals(sourceBuffer.timestampOffset, 10.123456789); // Super-precise offsets should round-trip. |
| |
| // Append first part of media segment. |
| test.expectEvent(sourceBuffer, 'updateend', 'Partial media segment append ended.'); |
| sourceBuffer.appendBuffer(partialMediaSegment); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_false(sourceBuffer.updating, 'updating attribute is false'); |
| assert_equals(sourceBuffer.mode, 'segments'); |
| assert_throws('InvalidStateError', |
| function() { sourceBuffer.mode = 'segments'; }, |
| 'Setting valid sourceBuffer.mode while still parsing media segment threw InvalidStateError.'); |
| assert_equals(sourceBuffer.timestampOffset, 10.123456789); |
| assert_throws('InvalidStateError', |
| function() { sourceBuffer.timestampOffset = 20.0; }, |
| 'Setting valid sourceBuffer.timestampOffset while still parsing media segment threw InvalidStateError.'); |
| |
| // Append remainder of media segment. |
| test.expectEvent(sourceBuffer, 'updateend', 'Append ended of remainder of media segment.'); |
| sourceBuffer.appendBuffer(mediaSegmentRemainder); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_false(sourceBuffer.updating, 'updating attribute is false'); |
| assert_equals(sourceBuffer.mode, 'segments'); |
| sourceBuffer.mode = 'segments'; // No exception should occur. |
| assert_equals(sourceBuffer.timestampOffset, 10.123456789); |
| sourceBuffer.timestampOffset = 20.0; // No exception should occur. |
| test.done(); |
| }); |
| }, 'Test setting SourceBuffer.mode and SourceBuffer.timestampOffset while parsing media segment.'); |
| </script> |
| </body> |
| </html> |