chromium/third_party/blink/web_tests/media/video-paint-test.js

function waitForMultipleEvents(name, times, func) {
    var count = 0;
    document.addEventListener(name, function() {
        if (++count == times) {
            func();
        }
    }, true);
}

function waitForAllCallbacks(callCount, func) {
    var rvfc_calls = 0;
    return function() {
        if(++rvfc_calls == callCount) {
            func();
        }
    }
}

function setVideoSrcAndWaitForFirstFrame(src) {
    var videos = document.getElementsByTagName('video');

    var endTestCallback = waitForAllCallbacks(videos.length, () => {
        if (window.testRunner)
            testRunner.notifyDone();
    });

    for (var i = 0; i < videos.length; ++i) {
        videos[i].requestVideoFrameCallback(endTestCallback);
        videos[i].src = src;
    }
}

function init()
{
    var videos = document.getElementsByTagName('video');

    waitForMultipleEvents("canplaythrough", videos.length, function() {
        for (var i = 0; i < videos.length; ++i) {
            videos[i].play();
            videos[i].addEventListener("playing", function(event) {
                event.target.pause();
                event.target.currentTime = 0;
            });
        }

        waitForMultipleEvents("seeked", videos.length, function() {
            if (window.testRunner)
                testRunner.notifyDone();
        });
    });
}

if (window.testRunner) {
    testRunner.waitUntilDone();
    setTimeout(function() {
        document.body.appendChild(document.createTextNode('FAIL'));
        if (window.testRunner)
            testRunner.notifyDone();
    } , 8000);
}

function initAndPause()
{
    var videos = document.getElementsByTagName('video');

    waitForMultipleEvents("canplaythrough", videos.length, function() {
        for (var i = 0; i < videos.length; ++i) {
            videos[i].play();
            videos[i].addEventListener("playing", function(event) {
                event.target.pause();
            });
        }

        waitForMultipleEvents("pause", videos.length, function() {
            if (window.testRunner)
                testRunner.notifyDone();
        });
    });

}

function initAndSeeked()
{
    var videos = document.getElementsByTagName('video');

    waitForMultipleEvents("seeked", videos.length, function() {
        if (window.testRunner)
            testRunner.notifyDone();
    });
}