<!DOCTYPE html>
<html>
<head>
    <script src="../../resources/js-test-pre.js"></script>
</head>
<body>
    <canvas id="canvas"></canvas>
    <script>
        var image = new Image;
                
        function drawFrame(expectedFrame) {
            return new Promise((resolve) => {
                let canvas = document.getElementById("canvas");
                let context = canvas.getContext("2d");
                context.drawImage(image, 0, 0, canvas.width, canvas.height);
                shouldBe("internals.imageFrameIndex(image)", expectedFrame.toString());
                setTimeout(() => {
                    resolve(expectedFrame + 1);
                }, 30);
            });
        }

        function drawImage(frameCount, expectedFrame) {
            let promise = drawFrame(expectedFrame);
            for (let frame = 1; frame < frameCount; ++frame) {
                promise = promise.then((expectedFrame) => {
                    return drawFrame(expectedFrame);
                });
            }
            return promise;
        }

        function loadImage(src, frameCount) {
            return new Promise((resolve) => {
                image.onload = (() => {
                    if (window.internals)
                        internals.setImageFrameDecodingDuration(image, 0.020);
                    drawImage(Math.ceil(frameCount / 2), 0).then(() => {
                        internals.resetImageAnimation(image);
                        debug("The animation of the image was reset.");
                        drawImage(frameCount, 0).then(resolve);
                    });
                });
                image.src = src;
            });
        }

        (function() {
            if (window.internals)
                internals.clearMemoryCache();

            description("Ensure the image animation is played in order after the animation is reset.");
            jsTestIsAsync = true;
                
            loadImage("resources/animated-red-green-blue.gif", 3).then(() => {
                finishJSTest();
            });
        })();
    </script>
    <script src="../../resources/js-test-post.js"></script>
</body>
</html>
