4 <script src=
"/w3c/resources/testharness.js"></script>
5 <script src=
"/w3c/resources/testharnessreport.js"></script>
6 <script src=
"mediasource-util.js"></script>
8 <link rel='stylesheet' href='/w3c/resources/testharness.css'
>
13 mediasource_testafterdataloaded(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
15 assert_equals(sourceBuffer
.mode
, 'segments', 'default append mode should be \'segments\'');
17 }, 'Test initial value of SourceBuffer.mode is "segments"');
19 mediasource_testafterdataloaded(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
21 sourceBuffer
.mode
= 'sequence';
22 assert_equals(sourceBuffer
.mode
, 'sequence', 'mode after setting it to \'sequence\'');
24 // Setting a mode that is not in AppendMode IDL enum should be ignored and not cause exception.
25 sourceBuffer
.mode
= 'invalidmode';
26 sourceBuffer
.mode
= null;
27 sourceBuffer
.mode
= '';
28 sourceBuffer
.mode
= 'Segments';
29 assert_equals(sourceBuffer
.mode
, 'sequence', 'mode unchanged by attempts to set invalid modes');
31 sourceBuffer
.mode
= 'segments';
32 assert_equals(sourceBuffer
.mode
, 'segments', 'mode after setting it to \'segments\'');
34 }, 'Test setting SourceBuffer.mode');
36 mediasource_testafterdataloaded(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
38 mediaSource
.removeSourceBuffer(sourceBuffer
);
39 assert_throws('InvalidStateError',
40 function() { sourceBuffer
.mode
= 'segments'; },
41 'Setting valid sourceBuffer.mode on removed SourceBuffer should throw InvalidStateError.');
43 }, 'Test setting a removed SourceBuffer\'s mode');
45 mediasource_testafterdataloaded(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
47 sourceBuffer
.appendBuffer(mediaData
);
48 assert_true(sourceBuffer
.updating
, 'updating attribute is true');
49 assert_throws('InvalidStateError',
50 function() { sourceBuffer
.mode
= 'segments'; },
51 'Setting valid sourceBuffer.mode on updating SourceBuffer threw InvalidStateError.');
53 }, 'Test setting SourceBuffer.mode while still updating');
55 mediasource_testafterdataloaded(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
57 test
.expectEvent(sourceBuffer
, 'updateend', 'Append ended.');
58 sourceBuffer
.appendBuffer(mediaData
);
60 test
.waitForExpectedEvents(function()
62 assert_false(sourceBuffer
.updating
, 'updating attribute is false');
64 test
.expectEvent(mediaSource
, 'sourceended', 'MediaSource sourceended event');
65 mediaSource
.endOfStream();
66 assert_equals(mediaSource
.readyState
, 'ended', 'MediaSource readyState is \'ended\'');
69 test
.waitForExpectedEvents(function()
71 assert_equals(mediaSource
.readyState
, 'ended', 'MediaSource readyState is \'ended\'');
73 test
.expectEvent(mediaSource
, 'sourceopen', 'MediaSource sourceopen event');
74 sourceBuffer
.mode
= 'segments';
76 assert_equals(mediaSource
.readyState
, 'open', 'MediaSource readyState is \'open\'');
79 test
.waitForExpectedEvents(function()
81 assert_equals(mediaSource
.readyState
, 'open', 'MediaSource readyState is \'open\'');
84 }, 'Test setting SourceBuffer.mode triggers parent MediaSource \'ended\' to \'open\' transition.');
86 mediasource_testafterdataloaded(function(test
, mediaElement
, mediaSource
, segmentInfo
, sourceBuffer
, mediaData
)
88 var initSegment
= MediaSourceUtil
.extractSegmentData(mediaData
, segmentInfo
.init
);
89 var fullMediaSegment
= MediaSourceUtil
.extractSegmentData(mediaData
, segmentInfo
.media
[0]);
90 var truncateAt
= Math
.floor(segmentInfo
.media
[0].size
* 0.5); // Pick first 50% of segment bytes.
91 var partialMediaSegment
= fullMediaSegment
.subarray(0, truncateAt
);
92 var mediaSegmentRemainder
= fullMediaSegment
.subarray(truncateAt
);
94 // Append init segment.
95 test
.expectEvent(sourceBuffer
, 'updateend', 'Init segment append ended.');
96 sourceBuffer
.appendBuffer(initSegment
);
98 test
.waitForExpectedEvents(function()
100 assert_false(sourceBuffer
.updating
, 'updating attribute is false');
101 assert_equals(sourceBuffer
.mode
, 'segments');
102 sourceBuffer
.mode
= 'segments'; // No exception should occur.
103 assert_equals(sourceBuffer
.timestampOffset
, 0.0);
104 sourceBuffer
.timestampOffset
= 10.123456789; // No exception should occur.
105 assert_equals(sourceBuffer
.timestampOffset
, 10.123456789); // Super-precise offsets should round-trip.
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.123456789);
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.123456789);
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.