|  | <!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> |