<!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);

            function onSourceOpen()
            {
                segmentHelper.addSourceBuffer();
                waitForEventOnce('loadeddata', onLoadedData, false);
                segmentHelper.appendInitSegment();
                segmentHelper.appendAllMediaSegments();
            }

            function onLoadedData()
            {
                waitForEventOnce('seeked', onExplicitSeek, false);
                video.currentTime = 3;
            }

            function onExplicitSeek()
            {
                var currentTime = video.currentTime;
                if (currentTime != 3) {
                    failTest("Seeked to " + currentTime + " instead of 3");
                    return;
                }

                waitForEventOnce('durationchange', onDurationChange, false);
                mediaSource.duration = 2;
            }

            function onDurationChange()
            {
                MediaSourceTest.expectDuration(video, mediaSource, 2);
                waitForEventOnce('seeking', function() {
                    waitForEventOnce('seeked', onSeekToEnd, false);
                    mediaSource.endOfStream();
                }, false);
            }

            function onSeekToEnd()
            {
                var currentTime = video.currentTime;
                var duration = video.duration;
                if (currentTime != duration) {
                    failTest("Seeked to " + currentTime + " instead of " + duration);
                    return;
                }
                endTest();
            }

            function onLoad()
            {
                findMediaElement();

                mediaSource = new WebKitMediaSource();
                waitForEvent('webkitsourceopen', onSourceOpen, false, false, mediaSource);

                segmentHelper.init(video, function(success) {
                    if (!success) {
                        failTest("Failed to load segment data");
                        return;
                    }
                    MediaSourceTest.setSrcToMediaSourceTestURL(video);
                });
            }
        </script>
    </head>
    <body onload="onLoad()">
        <video> </video>
        <p>Test that the video tag seeks to the end of the file if duration is truncated before the current playback position.</p>
    </body>
</html>
