Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / media / media-source / mediasource-sourcebuffer-mode.html
1 <!DOCTYPE html>
2 <html>
3     <head>
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>
8
9         <link rel='stylesheet' href='/w3c/resources/testharness.css'>
10     </head>
11     <body>
12         <div id="log"></div>
13         <script>
14           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
15           {
16               assert_equals(sourceBuffer.mode, 'segments', 'default append mode should be \'segments\'');
17               test.done();
18           }, 'Test initial value of SourceBuffer.mode is "segments"');
19
20           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
21           {
22               sourceBuffer.mode = 'sequence';
23               assert_equals(sourceBuffer.mode, 'sequence', 'mode after setting it to \'sequence\'');
24
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');
31
32               sourceBuffer.mode = 'segments';
33               assert_equals(sourceBuffer.mode, 'segments', 'mode after setting it to \'segments\'');
34               test.done();
35           }, 'Test setting SourceBuffer.mode');
36
37           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
38           {
39               mediaSource.removeSourceBuffer(sourceBuffer);
40               assert_throws('InvalidStateError',
41                   function() { sourceBuffer.mode = 'segments'; },
42                   'Setting valid sourceBuffer.mode on removed SourceBuffer should throw InvalidStateError.');
43               test.done();
44           }, 'Test setting a removed SourceBuffer\'s mode');
45
46           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
47           {
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.');
53               test.done();
54           }, 'Test setting SourceBuffer.mode while still updating');
55
56           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
57           {
58               test.expectEvent(sourceBuffer, 'updateend', 'Append ended.');
59               sourceBuffer.appendBuffer(mediaData);
60
61               test.waitForExpectedEvents(function()
62               {
63                   assert_false(sourceBuffer.updating, 'updating attribute is false');
64
65                   test.expectEvent(mediaSource, 'sourceended', 'MediaSource sourceended event');
66                   mediaSource.endOfStream();
67                   assert_equals(mediaSource.readyState, 'ended', 'MediaSource readyState is \'ended\'');
68               });
69
70               test.waitForExpectedEvents(function()
71               {
72                   assert_equals(mediaSource.readyState, 'ended', 'MediaSource readyState is \'ended\'');
73
74                   test.expectEvent(mediaSource, 'sourceopen', 'MediaSource sourceopen event');
75                   sourceBuffer.mode = 'segments';
76
77                   assert_equals(mediaSource.readyState, 'open', 'MediaSource readyState is \'open\'');
78               });
79
80               test.waitForExpectedEvents(function()
81               {
82                   assert_equals(mediaSource.readyState, 'open', 'MediaSource readyState is \'open\'');
83                   test.done();
84               });
85           }, 'Test setting SourceBuffer.mode triggers parent MediaSource \'ended\' to \'open\' transition.');
86
87           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
88           {
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);
94
95               // Append init segment.
96               test.expectEvent(sourceBuffer, 'updateend', 'Init segment append ended.');
97               sourceBuffer.appendBuffer(initSegment);
98
99               test.waitForExpectedEvents(function()
100               {
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.
106
107                   // Append first part of media segment.
108                   test.expectEvent(sourceBuffer, 'updateend', 'Partial media segment append ended.');
109                   sourceBuffer.appendBuffer(partialMediaSegment);
110               });
111
112               test.waitForExpectedEvents(function()
113               {
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.');
123
124                   // Append remainder of media segment.
125                   test.expectEvent(sourceBuffer, 'updateend', 'Append ended of remainder of media segment.');
126                   sourceBuffer.appendBuffer(mediaSegmentRemainder);
127               });
128
129               test.waitForExpectedEvents(function()
130               {
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.
136                   test.done();
137               });
138           }, 'Test setting SourceBuffer.mode and SourceBuffer.timestampOffset while parsing media segment.');
139
140           // FIXME: Once 'sequence' mode implemented, add verification. See http://crbug.com/249422.
141         </script>
142     </body>
143 </html>