| <!DOCTYPE html> | |
| <!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <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> |