<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<script>
    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
    }

    function runTest() {
        if (window.internals)
            internals.settings.setAnimatedImageDebugCanvasDrawingEnabled(true);

        var image = document.getElementById("image");
        var console = document.getElementById("console");            
        var context = document.getElementById("canvas").getContext("2d");

        image.style.visibility = "visible";

        context.drawImage(image, 0, 0);
        var frameOne = context.getImageData(0, 0, 1, 1).data;

        handle = window.setInterval(function() {
            context.drawImage(image, 0, 0);
            var frameTwo = context.getImageData(0, 0, 1, 1).data;

            // Compare RGBA of the two frames
            if (frameOne[0] == frameTwo[0]
                && frameOne[1] == frameTwo[1]
                && frameOne[2] == frameTwo[2]
                && frameOne[3] == frameTwo[3])
                return;

            window.clearInterval(handle);
            console.innerHTML = "<span style='color:green'>PASS</span>";
            if (window.testRunner)
                testRunner.notifyDone();
        }, 10);
    }

    onload = () => {
        setTimeout(() => {
            window.location = "../history/resources/page-cache-helper.html";
        }, 0);
    }

    window.onpageshow = function(event) {
        if (event.persisted)
            runTest();
    }
</script>
<p>Test that animated GIFs resume animating after restoring a page from the back forward cache. To test manually, click <a href="about:blank">here</a> to visit about:blank, then press the browser's back button. On success, you should see a square that continuously animates through various shades of green followed by the word 'PASS'.</p>
<img id="image" style="visibility:hidden" src="resources/animated-10color.gif">
<div id="console"></div>
<canvas id="canvas" style="visibility:hidden"><span style="color:red">FAIL</span></canvas>
