chromium/third_party/blink/web_tests/media/video-loop.html

<!DOCTYPE html>
<title>Test video looping.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<video autoplay></video>
<script>
// Test looping by:
// Play to end with "loop" set to true.
// When "seeked" event fires, verify that time has jumped back and movie is playing.
// Set "loop" to false and play again.
// Verify that "ended" event fires.
async_test(function(t) {
    var video = document.querySelector("video");
    // Test setting/removing the attribute.
    assert_equals(video.getAttribute("loop"), null);
    assert_false(video.loop);

    video.loop = true;
    assert_true(video.loop);
    assert_not_equals(video.getAttribute("loop"), null);

    video.removeAttribute("loop");
    assert_false(video.loop);

    video.onplay = t.step_func(function() {
        video.onplay = null;
        assert_false(video.paused);

        // Pause playback so the movie can't possibly loop before the seeked event fires.
        video.pause();
        // seek to near the end, wait for "seeked" event to announce loop.
        var seekCount = 0;
        video.onseeked = t.step_func(function() {
            switch (++seekCount) {
            case 1:
                // first seek completed, beginning playback.
                assert_true(video.paused);
                assert_false(video.ended);
                video.play();
                break;
            case 2:
                // second seek completed because video looped, toggle "loop" and seek to near end again.
                assert_false(video.paused);
                assert_false(video.ended);
                video.pause();
                assert_greater_than_equal(video.currentTime, 0);
                assert_less_than(video.currentTime, video.duration);
                video.loop = false;
                video.currentTime = video.duration - 0.4;
                break;
            case 3:
                // third seek completed, beginning playback for the last time.
                assert_true(video.paused);
                assert_false(video.ended);
                video.play();
                break;
            }
        });

        video.currentTime = video.duration - 0.4;
    });

    video.onended = t.step_func_done(function() {
        assert_true(video.ended);
        assert_equals(video.currentTime, video.duration);
    });

    // Set "loop" to true and begin playing.
    video.loop = true;
    video.src = "content/test.ogv";
});
</script>