blob: 79d64fbc14b35e4a6f68be2f424cd21068df38e9 [file] [edit]
<!DOCTYPE html>
<html>
<head>
<script src="/media-resources/video-test.js"></script>
<script src="/media/resources/media-source/webm/segment-info.js"></script>
<script src="media-source.js"></script>
<script>
var segmentHelper = new MediaSourceTest.SegmentHelper(WebMSegmentInfo.testWebM, true);
var defaultSourceMimetype = segmentHelper.segmentInfo.type;
function expectExceptionOnSetDuration(value, error)
{
try {
mediaSource.duration = value;
failTest("Expected an exception");
} catch (e) {
if (!(e.code == error)) {
failTest("Unexpected exception " + e);
throw e;
}
consoleWrite("Got expected exception " + e);
}
}
function testExpectExceptionOnSetDurationWhenClosed(mediaSource)
{
consoleWrite("Test setting the duration when closed.");
expectExceptionOnSetDuration(10, DOMException.INVALID_STATE_ERR);
}
function testExpectNaNOnGetDurationWhenClosed(mediaSource)
{
consoleWrite("Test getting the duration when closed.");
if (!isNaN(mediaSource.duration))
failTest("Unexpected duration value. Expected NaN got " + mediaSource.duration);
}
function testExpectExceptionOnNegativeDuration(runNextTestCase, videoTag)
{
expectExceptionOnSetDuration(-1, DOMException.INVALID_ACCESS_ERR);
runNextTestCase();
}
function testExpectExceptionOnNaNDuration(runNextTestCase, videoTag)
{
expectExceptionOnSetDuration(NaN, DOMException.INVALID_ACCESS_ERR);
runNextTestCase();
}
function testDurationChange(runNextTestCase, videoTag)
{
segmentHelper.addSourceBuffer();
segmentHelper.appendInitSegment();
waitForEventOnce('loadedmetadata', function() {
waitForEventOnce('durationchange', function() {
MediaSourceTest.expectDuration(videoTag, mediaSource, 10);
var expected_buffered = [];
for (var i = 0; i < mediaSource.sourceBuffers.length; i++)
MediaSourceTest.expectBufferedRange(mediaSource.sourceBuffers[i], expected_buffered);
runNextTestCase();
}, false, false, videoTag);
mediaSource.duration = 10;
}, false, false, videoTag);
}
function testDurationChangeThenOverwriteDuration(runNextTestCase, videoTag)
{
segmentHelper.addSourceBuffer();
segmentHelper.appendInitSegment();
waitForEventOnce('loadedmetadata', function() {
waitForEventOnce('durationchange', function() {
MediaSourceTest.expectDuration(videoTag, mediaSource, 1);
waitForEventOnce('durationchange', function() {
MediaSourceTest.expectDuration(videoTag, mediaSource, 1.593);
var expected_buffered = [[0, 1.593]];
for (var i = 0; i < mediaSource.sourceBuffers.length; i++)
MediaSourceTest.expectBufferedRange(mediaSource.sourceBuffers[i], expected_buffered);
runNextTestCase();
}, false, false, videoTag);
var segments = segmentHelper.segmentInfo.media;
for (var i = 0; i < segments.length; i++) {
segmentHelper.appendMediaSegment(i);
// Stop appending after exceeding 1s.
if (segments[i].timecode > 1)
break;
}
}, false, false, videoTag);
mediaSource.duration = 1;
}, false, false, videoTag);
}
function testDurationChangeTruncates(runNextTestCase, videoTag)
{
segmentHelper.addSourceBuffer();
segmentHelper.appendInitSegment();
waitForEventOnce('loadedmetadata', function() {
segmentHelper.appendAllMediaSegments();
var segmentDuration = segmentHelper.segmentInfo.duration;
MediaSourceTest.expectDuration(videoTag, mediaSource, segmentDuration);
waitForEventOnce('durationchange', function() {
MediaSourceTest.expectDuration(videoTag, mediaSource, 2);
var expected_buffered = [[0,2]];
for (var i = 0; i < mediaSource.sourceBuffers.length; i++)
MediaSourceTest.expectBufferedRange(mediaSource.sourceBuffers[i], expected_buffered);
runNextTestCase();
}, false, false, videoTag);
mediaSource.duration = 2;
}, false, false, videoTag);
}
function onLoad()
{
findMediaElement();
mediaSource = new WebKitMediaSource();
waitForEvent('webkitsourceopen', "", false, false, mediaSource);
testExpectExceptionOnSetDurationWhenClosed(mediaSource);
testExpectNaNOnGetDurationWhenClosed(mediaSource);
segmentHelper.init(video, function(success) {
if (!success) {
failTest("Failed to load segment data");
return;
}
var testCases = [
testExpectExceptionOnNegativeDuration,
testExpectExceptionOnNaNDuration,
testDurationChange,
testDurationChangeThenOverwriteDuration,
testDurationChangeTruncates,
];
MediaSourceTest.startSourceOpenTesting(video, testCases);
});
}
</script>
</head>
<body onload="onLoad()">
<video> </video>
<p>Tests duration attribute on MediaSource object</p>
</body>
</html>