<DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="scroller" style="width: 800px; overflow: hidden">
    <div id="scroller-cont" style="height: 245px; width: 1600px; position: relative; top: 0; left: 0; -webkit-transform: translate(0px, 0px) translateZ(0px);">
        <div id="wrapper1" style="-webkit-transform: translate3d(0px, 0px, 0px); width: 800px; height: 245px; float: left; margin: 0; padding: 0">
            <iframe id="testFrame1" src="resources/iframe-with-animated-gif.html" style="width: 245px; height: 245px;" onload="frameLoaded()"></iframe>
        </div>
        <div id="wrapper2" style="-webkit-transform: translate3d(0px, 0px, 0px); width: 800px; height: 245px; float: left; margin: 0; padding: 0">
            <iframe id="testFrame2" src="resources/iframe-with-animated-gif2.html" style="width: 245px; height: 245px;" onload="frameLoaded()"></iframe>
        </div>
    </div>
</div>
<div id="console"></div>
<script>
description("Test that animated images in iframes are correctly paused / resumed when the iframe is translated in and out of view using -webkit-transform.");
jsTestIsAsync = true;

function isFirstImagePaused()
{
  var firstFrame = document.getElementById("testFrame1");
  return internals.hasPausedImageAnimations(firstFrame.contentDocument.getElementById('testImage'));
}

function isSecondImagePaused()
{
  var secondFrame = document.getElementById("testFrame2");
  return internals.hasPausedImageAnimations(secondFrame.contentDocument.getElementById('testImage'));
}

function forceLayout()
{
  document.getElementById("scroller-cont").offsetLeft;
}

function checkSecondImageUnpaused()
{
  shouldBecomeEqual("isSecondImagePaused()", "false", translateImagesRight);
}

function checkSecondImagePaused()
{
  shouldBecomeEqual("isSecondImagePaused()", "true", finishJSTest);
}

function translateImagesLeft()
{
  shouldBeFalse("isFirstImagePaused()");
  debug("Translating images left so that first image is no longer visible, but second image is.");
  forceLayout();
  document.getElementById("scroller-cont").style["-webkit-transform"] = "translate(-800px, 0px)";
  shouldBecomeEqual("isFirstImagePaused()", "true", checkSecondImageUnpaused);
}

function translateImagesRight()
{
  debug("Translating images right so that second image is no longer visible, but first image is.");
  forceLayout();
  document.getElementById("scroller-cont").style["-webkit-transform"] = "translate(0px, 0px)";
  shouldBecomeEqual("isFirstImagePaused()", "false", checkSecondImagePaused);
}

var numberFramesLoaded = 0;
function frameLoaded()
{
  ++numberFramesLoaded;
  if (numberFramesLoaded != 2)
    return;
  shouldBecomeEqual("!isFirstImagePaused() && isSecondImagePaused()", "true", translateImagesLeft);
}

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
