Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / media / media-source / webkitmediasource-duration-changed.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, true);
9             var defaultSourceMimetype = segmentHelper.segmentInfo.type;
10
11             function expectExceptionOnSetDuration(value, error)
12             {
13                 try {
14                     mediaSource.duration = value;
15                     failTest("Expected an exception");
16                 } catch (e) {
17                     if (!(e.code == error)) {
18                         failTest("Unexpected exception " + e);
19                         throw e;
20                     }
21                     consoleWrite("Got expected exception " + e);
22                 }
23             }
24
25             function testExpectExceptionOnSetDurationWhenClosed(mediaSource)
26             {
27                 consoleWrite("Test setting the duration when closed.");
28                 expectExceptionOnSetDuration(10, DOMException.INVALID_STATE_ERR);
29             }
30
31             function testExpectNaNOnGetDurationWhenClosed(mediaSource)
32             {
33                 consoleWrite("Test getting the duration when closed.");
34                 if (!isNaN(mediaSource.duration))
35                     failTest("Unexpected duration value. Expected NaN got " + mediaSource.duration);
36             }
37
38             function testExpectExceptionOnNegativeDuration(runNextTestCase, videoTag)
39             {
40                 expectExceptionOnSetDuration(-1, DOMException.INVALID_ACCESS_ERR);
41                 runNextTestCase();
42             }
43
44             function testExpectExceptionOnNaNDuration(runNextTestCase, videoTag)
45             {
46                 expectExceptionOnSetDuration(NaN, DOMException.INVALID_ACCESS_ERR);
47                 runNextTestCase();
48             }
49
50             function testDurationChange(runNextTestCase, videoTag)
51             {
52                 segmentHelper.addSourceBuffer();
53                 segmentHelper.appendInitSegment();
54
55                 waitForEventOnce('loadedmetadata', function() {
56                     waitForEventOnce('durationchange', function() {
57                         MediaSourceTest.expectDuration(videoTag, mediaSource, 10);
58                         var expected_buffered = [];
59                         for (var i = 0; i < mediaSource.sourceBuffers.length; i++)
60                           MediaSourceTest.expectBufferedRange(mediaSource.sourceBuffers[i], expected_buffered);
61                         runNextTestCase();
62                     }, false, false, videoTag);
63                     mediaSource.duration = 10;
64
65                 }, false, false, videoTag);
66             }
67
68             function testDurationChangeThenOverwriteDuration(runNextTestCase, videoTag)
69             {
70                 segmentHelper.addSourceBuffer();
71                 segmentHelper.appendInitSegment();
72
73                 waitForEventOnce('loadedmetadata', function() {
74                     waitForEventOnce('durationchange', function() {
75                         MediaSourceTest.expectDuration(videoTag, mediaSource, 1);
76
77                         waitForEventOnce('durationchange', function() {
78                             MediaSourceTest.expectDuration(videoTag, mediaSource, 1.593);
79                             var expected_buffered = [[0, 1.593]];
80                             for (var i = 0; i < mediaSource.sourceBuffers.length; i++)
81                                 MediaSourceTest.expectBufferedRange(mediaSource.sourceBuffers[i], expected_buffered);
82                             runNextTestCase();
83                         }, false, false, videoTag);
84                         var segments = segmentHelper.segmentInfo.media;
85                         for (var i = 0; i < segments.length; i++) {
86                             segmentHelper.appendMediaSegment(i);
87                             // Stop appending after exceeding 1s.
88                             if (segments[i].timecode > 1)
89                                 break;
90                         }
91
92                     }, false, false, videoTag);
93                     mediaSource.duration = 1;
94
95                 }, false, false, videoTag);
96             }
97
98             function testDurationChangeTruncates(runNextTestCase, videoTag)
99             {
100                 segmentHelper.addSourceBuffer();
101                 segmentHelper.appendInitSegment();
102
103                 waitForEventOnce('loadedmetadata', function() {
104                     segmentHelper.appendAllMediaSegments();
105                     var segmentDuration = segmentHelper.segmentInfo.duration;
106                     MediaSourceTest.expectDuration(videoTag, mediaSource, segmentDuration);
107
108                     waitForEventOnce('durationchange', function() {
109                         MediaSourceTest.expectDuration(videoTag, mediaSource, 2);
110                         var expected_buffered = [[0,2]];
111                         for (var i = 0; i < mediaSource.sourceBuffers.length; i++)
112                           MediaSourceTest.expectBufferedRange(mediaSource.sourceBuffers[i], expected_buffered);
113                         runNextTestCase();
114                     }, false, false, videoTag);
115
116                     mediaSource.duration = 2;
117
118                 }, false, false, videoTag);
119             }
120
121             function onLoad()
122             {
123                 findMediaElement();
124
125                 mediaSource = new WebKitMediaSource();
126                 waitForEvent('webkitsourceopen', "", false, false, mediaSource);
127
128                 testExpectExceptionOnSetDurationWhenClosed(mediaSource);
129                 testExpectNaNOnGetDurationWhenClosed(mediaSource);
130
131                 segmentHelper.init(video, function(success) {
132                     if (!success) {
133                         failTest("Failed to load segment data");
134                         return;
135                     }
136
137                     var testCases = [
138                         testExpectExceptionOnNegativeDuration,
139                         testExpectExceptionOnNaNDuration,
140                         testDurationChange,
141                         testDurationChangeThenOverwriteDuration,
142                         testDurationChangeTruncates,
143                     ];
144                     MediaSourceTest.startSourceOpenTesting(video, testCases);
145                 });
146             }
147         </script>
148     </head>
149     <body onload="onLoad()">
150         <video> </video>
151         <p>Tests duration attribute on MediaSource object</p>
152     </body>
153 </html>