4 <script src="/w3c/resources/testharness.js"></script>
5 <script src="/w3c/resources/testharnessreport.js"></script>
6 <script src="mediasource-util.js"></script>
7 <script src="/media/resources/media-source/webm/segment-info.js"></script>
9 <link rel='stylesheet' href='/w3c/resources/testharness.css'>
14 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
16 assert_equals(sourceBuffer.mode, 'segments', 'default append mode should be \'segments\'');
18 }, 'Test initial value of SourceBuffer.mode is "segments"');
20 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
22 sourceBuffer.mode = 'sequence';
23 assert_equals(sourceBuffer.mode, 'sequence', 'mode after setting it to \'sequence\'');
25 // Setting a mode that is not in AppendMode IDL enum should be ignored and not cause exception.
26 sourceBuffer.mode = 'invalidmode';
27 sourceBuffer.mode = null;
28 sourceBuffer.mode = '';
29 sourceBuffer.mode = 'Segments';
30 assert_equals(sourceBuffer.mode, 'sequence', 'mode unchanged by attempts to set invalid modes');
32 sourceBuffer.mode = 'segments';
33 assert_equals(sourceBuffer.mode, 'segments', 'mode after setting it to \'segments\'');
35 }, 'Test setting SourceBuffer.mode');
37 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
39 mediaSource.removeSourceBuffer(sourceBuffer);
40 assert_throws('InvalidStateError',
41 function() { sourceBuffer.mode = 'segments'; },
42 'Setting valid sourceBuffer.mode on removed SourceBuffer should throw InvalidStateError.');
44 }, 'Test setting a removed SourceBuffer\'s mode');
46 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
48 sourceBuffer.appendBuffer(mediaData);
49 assert_true(sourceBuffer.updating, 'updating attribute is true');
50 assert_throws('InvalidStateError',
51 function() { sourceBuffer.mode = 'segments'; },
52 'Setting valid sourceBuffer.mode on updating SourceBuffer threw InvalidStateError.');
54 }, 'Test setting SourceBuffer.mode while still updating');
56 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
58 test.expectEvent(sourceBuffer, 'updateend', 'Append ended.');
59 sourceBuffer.appendBuffer(mediaData);
61 test.waitForExpectedEvents(function()
63 assert_false(sourceBuffer.updating, 'updating attribute is false');
65 test.expectEvent(mediaSource, 'sourceended', 'MediaSource sourceended event');
66 mediaSource.endOfStream();
67 assert_equals(mediaSource.readyState, 'ended', 'MediaSource readyState is \'ended\'');
70 test.waitForExpectedEvents(function()
72 assert_equals(mediaSource.readyState, 'ended', 'MediaSource readyState is \'ended\'');
74 test.expectEvent(mediaSource, 'sourceopen', 'MediaSource sourceopen event');
75 sourceBuffer.mode = 'segments';
77 assert_equals(mediaSource.readyState, 'open', 'MediaSource readyState is \'open\'');
80 test.waitForExpectedEvents(function()
82 assert_equals(mediaSource.readyState, 'open', 'MediaSource readyState is \'open\'');
85 }, 'Test setting SourceBuffer.mode triggers parent MediaSource \'ended\' to \'open\' transition.');
87 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
89 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
90 var fullMediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);
91 var truncateAt = Math.floor(segmentInfo.media[0].size * 0.5); // Pick first 50% of segment bytes.
92 var partialMediaSegment = fullMediaSegment.subarray(0, truncateAt);
93 var mediaSegmentRemainder = fullMediaSegment.subarray(truncateAt);
95 // Append init segment.
96 test.expectEvent(sourceBuffer, 'updateend', 'Init segment append ended.');
97 sourceBuffer.appendBuffer(initSegment);
99 test.waitForExpectedEvents(function()
101 assert_false(sourceBuffer.updating, 'updating attribute is false');
102 assert_equals(sourceBuffer.mode, 'segments');
103 sourceBuffer.mode = 'segments'; // No exception should occur.
104 assert_equals(sourceBuffer.timestampOffset, 0.0);
105 sourceBuffer.timestampOffset = 10.0; // No exception should occur.
107 // Append first part of media segment.
108 test.expectEvent(sourceBuffer, 'updateend', 'Partial media segment append ended.');
109 sourceBuffer.appendBuffer(partialMediaSegment);
112 test.waitForExpectedEvents(function()
114 assert_false(sourceBuffer.updating, 'updating attribute is false');
115 assert_equals(sourceBuffer.mode, 'segments');
116 assert_throws('InvalidStateError',
117 function() { sourceBuffer.mode = 'segments'; },
118 'Setting valid sourceBuffer.mode while still parsing media segment threw InvalidStateError.');
119 assert_equals(sourceBuffer.timestampOffset, 10.0);
120 assert_throws('InvalidStateError',
121 function() { sourceBuffer.timestampOffset = 20.0; },
122 'Setting valid sourceBuffer.timestampOffset while still parsing media segment threw InvalidStateError.');
124 // Append remainder of media segment.
125 test.expectEvent(sourceBuffer, 'updateend', 'Append ended of remainder of media segment.');
126 sourceBuffer.appendBuffer(mediaSegmentRemainder);
129 test.waitForExpectedEvents(function()
131 assert_false(sourceBuffer.updating, 'updating attribute is false');
132 assert_equals(sourceBuffer.mode, 'segments');
133 sourceBuffer.mode = 'segments'; // No exception should occur.
134 assert_equals(sourceBuffer.timestampOffset, 10.0);
135 sourceBuffer.timestampOffset = 20.0; // No exception should occur.
138 }, 'Test setting SourceBuffer.mode and SourceBuffer.timestampOffset while parsing media segment.');
140 // FIXME: Once 'sequence' mode implemented, add verification. See http://crbug.com/249422.