chromium/third_party/blink/web_tests/media/video-played-collapse.html

<!DOCTYPE html>
<title>Test media element's "played" attribute and range collapse.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="video-played.js"></script>
<video></video>
<script>
var video;
async_test(function(t) {
    var expectedStartTimes = [];
    var expectedEndTimes = [];
    video = document.querySelector("video");

    video.oncanplay = t.step_func(function() {
        video.oncanplay = null;
        testRanges(expectedStartTimes, expectedEndTimes);
        // Test playing when there are no ranges.
        timeRangeCount = currentTimeRange = 0;
        video.currentTime = 0.5;
        currentTimeRange++;
        startPlayingInNewRange(t, expectedStartTimes);
    });
    waitForPauseAndContinue(t, createANewRange, false, expectedStartTimes, expectedEndTimes);

    function createANewRange() {
        // Create a new range.
        var newTime = (video.played.end(0) + 0.05).toFixed(2);
        video.currentTime = newTime;
        startPlayingInNewRange(t, expectedStartTimes);
        waitForPauseAndContinue(t, jumpAndCollapseTwoRanges, false, expectedStartTimes, expectedEndTimes);
    }

    function jumpAndCollapseTwoRanges() {
        // Test playing from one range into another, should collapse the two ranges.
        timeRangeCount--;
        currentTimeRange = timeRangeCount - 1;
        expectedStartTimes[0] = (expectedStartTimes[0] - 0.1).toFixed(2);
        expectedEndTimes[0] = expectedEndTimes[1];
        video.currentTime = expectedStartTimes[0];
        playForDuration(expectedEndTimes[1] - expectedStartTimes[0], t);
        waitForPauseAndContinue(t, testLoopingAndPassToTheEnd, false, expectedStartTimes, expectedEndTimes);
    }

    function testLoopingAndPassToTheEnd() {
        // Start playing near the end of the movie so it will loop quickly.
        video.loop = true;
        var startTime = (video.duration - 0.05).toFixed(2);
        video.currentTime = startTime;

        // We will end in the very first time range
        currentTimeRange = 0;

        // Playing from near the end so we will create a new time range from startTime, duration.
        timeRangeCount++;
        expectedStartTimes[timeRangeCount - 1] = startTime;
        expectedEndTimes[timeRangeCount - 1] = video.duration.toFixed(2);

        // Playback restarts from beginning, so expect the beginning of first time range to be 0.
        expectedStartTimes[0] = "0.00";
        // Have to play for long enough to loop and play into the existing range.
        playForDuration(1.25, t);
        waitForPauseAndContinue(t, null, true, expectedStartTimes, expectedEndTimes);
    }

    video.src = "content/test.ogv";
});
</script>