Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / media / media-source / webkitmediasource-state-changes.html
1 <!DOCTYPE html>
2 <html>
3     <head>
4         <script src="/media-resources/video-test.js"></script>
5         <script src="/media/resources/media-source/webm/segment-info.js"></script>
6         <script src="webkitmediasource-util.js"></script>
7         <script>
8             var segmentHelper = new MediaSourceTest.SegmentHelper(WebMSegmentInfo.testWebM);
9             var seekTime = 1;
10
11             function appendMediaSegmentsForSeek(segmentSeekTime)
12             {
13                 var index = segmentHelper.getMediaSegmentIndexForTimestamp(segmentSeekTime);
14                 var endIndex = index + 2;
15                 var totalMediaSegments = segmentHelper.mediaSegments.length;
16
17                 for (; (index < endIndex) && (index < totalMediaSegments); index++) {
18                     segmentHelper.appendMediaSegment(index);
19                 }
20
21                 if (index >= totalMediaSegments) {
22                     mediaSource.endOfStream();
23                     return;
24                 }
25             }
26
27             function onSourceEvent(event)
28             {
29                 consoleWrite('EVENT(' + event.type + ') : ' + event.target.readyState);
30             }
31
32             function onFirstSourceOpen(event)
33             {
34                 consoleWrite("onFirstSourceOpen");
35
36                 // This is the first time the source is opened. We just want to append
37                 // the initialization segment and all media segments until the end of stream.
38                 // This is testing the
39                 // "closed" -> "open" -> "ended" transition path.
40
41                 var mediaSource = event.target;
42                 mediaSource.removeEventListener('webkitsourceopen', onFirstSourceOpen);
43                 segmentHelper.addSourceBuffer();
44
45                 MediaSourceTest.expectSourceState(mediaSource, "open");
46
47                 segmentHelper.appendInitSegment();
48
49                 mediaSource.addEventListener('webkitsourceended', onFirstSourceEnded);
50
51                 // Start appending media segments.
52                 segmentHelper.appendUntilEndOfStream(0);
53             }
54
55             function onFirstSourceEnded(event)
56             {
57                 consoleWrite("onFirstSourceEnded");
58
59                 var mediaSource = event.target;
60                 mediaSource.removeEventListener('webkitsourceended', onFirstSourceEnded);
61
62                 MediaSourceTest.expectSourceState(mediaSource, "ended");
63
64                 video.addEventListener('playing', triggerFirstSeek);
65             }
66
67             function triggerFirstSeek(event)
68             {
69                 consoleWrite("triggerFirstSeek");
70
71                 var videoTag = event.target;
72                 videoTag.removeEventListener('playing', triggerFirstSeek);
73
74                 // Now that we have appended all of the media segments and ended the stream,
75                 // lets do a seek to make sure we stay in the "ended" state.
76                 videoTag.addEventListener('seeking', onFirstSeeking);
77                 videoTag.addEventListener('seeked', onFirstSeeked);
78                 videoTag.currentTime = seekTime;
79             }
80
81             function onFirstSeeking(event)
82             {
83                 consoleWrite("onFirstSeeking");
84
85                 var videoTag = event.target;
86                 videoTag.removeEventListener('seeking', onFirstSeeking);
87
88                 MediaSourceTest.expectSourceState(mediaSource, "ended");
89
90                 // Start appending media segments.
91                 appendMediaSegmentsForSeek(videoTag.currentTime);
92
93                 // Verify that the source state transitioned to open after the append.
94                 MediaSourceTest.expectSourceState(mediaSource, "open");
95             }
96
97             function onFirstSeeked(event)
98             {
99                 consoleWrite("onFirstSeeked");
100
101                 var videoTag = event.target;
102                 videoTag.removeEventListener('seeked', onFirstSeeked);
103
104                 MediaSourceTest.expectSourceState(mediaSource, "open");
105
106                 // Now it is time to test seeking while still in "open".
107                 videoTag.addEventListener('seeking', onSecondSeeking);
108                 videoTag.addEventListener('seeked', onSecondSeeked);
109                 videoTag.currentTime = seekTime;
110             }
111
112             function onSecondSeeking(event)
113             {
114                 consoleWrite("onSecondSeeking");
115
116                 var videoTag = event.target;
117                 videoTag.removeEventListener('seeking', onSecondSeeking);
118
119                 MediaSourceTest.expectSourceState(mediaSource, "open");
120
121                 // Start appending media segments.
122                 appendMediaSegmentsForSeek(videoTag.currentTime);
123             }
124
125             function onSecondSeeked(event)
126             {
127                 consoleWrite("onSecondSeeked");
128
129                 var videoTag = event.target;
130                 videoTag.removeEventListener('seeked', onSecondSeeked);
131
132                 MediaSourceTest.expectSourceState(mediaSource, "open");
133
134                 // Test "open" -> "closed" -> "open" transition path.
135                 mediaSource.addEventListener('webkitsourceclose', onFirstSourceClose);
136                 MediaSourceTest.setSrcToMediaSourceTestURL(videoTag);
137             }
138
139             function onFirstSourceClose(event)
140             {
141                 consoleWrite("onFirstSourceClose");
142
143                 var mediaSource = event.target;
144                 mediaSource.removeEventListener('webkitsourceclose', onFirstSourceClose);
145
146                 MediaSourceTest.expectSourceState(mediaSource, "closed");
147
148                 mediaSource.addEventListener('webkitsourceopen', onSecondSourceOpen);
149             }
150
151             function onSecondSourceOpen(event)
152             {
153                 consoleWrite("onSecondSourceOpen");
154
155                 var mediaSource = event.target;
156                 mediaSource.removeEventListener('webkitsourceopen', onSecondSourceOpen);
157                 segmentHelper.addSourceBuffer();
158
159                 MediaSourceTest.expectSourceState(mediaSource, "open");
160
161                 segmentHelper.appendInitSegment();
162
163                 mediaSource.addEventListener('webkitsourceended', onSecondSourceEnded);
164
165                 // Start appending media segments.
166                 segmentHelper.appendUntilEndOfStream(0);
167             }
168
169             function onSecondSourceEnded(event)
170             {
171                 consoleWrite("onSecondSourceEnded");
172
173                 var mediaSource = event.target;
174                 mediaSource.removeEventListener('webkitsourceended', onSecondSourceEnded);
175
176                 MediaSourceTest.expectSourceState(mediaSource, "ended");
177                 //MediaSourceTest.expectReadyState(videoTag, HTMLMediaElement.HAVE_NOTHING);
178
179                 video.addEventListener('playing', triggerSecondSourceClose);
180             }
181
182             function triggerSecondSourceClose(event)
183             {
184                 consoleWrite("triggerSecondSourceClose");
185
186                 var videoTag = event.target;
187                 videoTag.removeEventListener('playing', triggerSecondSourceClose);
188
189                 // Test "ended" -> "closed" -> "open" transition path.
190                 mediaSource.addEventListener('webkitsourceclose', onSecondSourceClose);
191                 MediaSourceTest.setSrcToMediaSourceTestURL(videoTag);
192             }
193
194             function onSecondSourceClose(event)
195             {
196                 consoleWrite("onSecondSourceClose");
197
198                 var mediaSource = event.target;
199                 mediaSource.removeEventListener('webkitsourceclose', onSecondSourceClose);
200                 MediaSourceTest.expectSourceState(mediaSource, "closed");
201
202                 mediaSource.addEventListener('webkitsourceopen', onThirdSourceOpen);
203             }
204
205             function onThirdSourceOpen(event)
206             {
207                 consoleWrite("onThirdSourceOpen");
208
209                 var mediaSource = event.target;
210                 mediaSource.removeEventListener('webkitsourceopen', onThirdSourceOpen);
211                 segmentHelper.addSourceBuffer();
212
213                 MediaSourceTest.expectSourceState(mediaSource, "open");
214
215                 endTest();
216             }
217
218             function onLoad()
219             {
220                 findMediaElement();
221
222                 mediaSource = new WebKitMediaSource();
223
224                 waitForEventAndFail('error');
225                 waitForEvent('seeking');
226                 waitForEvent('seeked');
227                 waitForEvent('ended');
228                 waitForEvent('emptied');
229
230                 mediaSource.addEventListener('webkitsourceopen', onSourceEvent);
231                 mediaSource.addEventListener('webkitsourceended', onSourceEvent);
232                 mediaSource.addEventListener('webkitsourceclose', onSourceEvent);
233
234                 mediaSource.addEventListener('webkitsourceopen', onFirstSourceOpen);
235
236                 MediaSourceTest.logSourceState(mediaSource);
237                 segmentHelper.init(video, function(success)
238                 {
239                     if (!success) {
240                         failTest("Failed to load segment data");
241                         return;
242                     }
243
244                     MediaSourceTest.setSrcToMediaSourceTestURL(video);
245                 });
246             }
247         </script>
248     </head>
249     <body onload="onLoad()">
250         <video autoplay> </video>
251         <p>Tests MediaSource API state transitions.</p>
252     </body>
253 </html>