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

<p id="description"></p>

<div style="border: 1px solid #000; height: 5000px;">5000-pixel box</div>

<!-- The contents of this iframe, more nicely formatted:
 <body>
   <style>
     button {
       border: 0;
     }
   </style>
   <div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div>
   <div id='container' style='height: 100px; overflow: scroll'>
     <div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div>
     <button id='target'>Target</button>
     <div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div>
   </div>
   <div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div>
  </body>
 -->
<iframe id="frame" src="data:text/html,<body><style>button { border: 0; }</style><div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div><div id='container' style='height: 100px; overflow: scroll'><div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div><button id='target'>Target</button><div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div></div><div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div></body>"></iframe>

<div style="border: 1px solid #000; height: 5000px;">5000-pixel box</div>

<div id="console"></div>

<script>
description("Tests that scrolling to move an element to a specific point successfully scrolls both an iframe and a div with overflow.");

if (window.testRunner)
        testRunner.waitUntilDone();

window.jsTestIsAsync = true;

function runTest() {
    window.frame = document.getElementById("frame");
    window.frameWindow = frame.contentWindow;
    window.frameDoc = frameWindow.document;
    window.container = frameDoc.getElementById("container");
    window.target = frameDoc.getElementById("target");

    if (window.accessibilityController) {
        target.focus();
        var targetAccessibleObject = accessibilityController.focusedElement;
    }

    // Reset the initial scroll position (since calling focus() can scroll the page too).
    window.scrollTo(0, 0);
    frameWindow.scrollTo(0, 0);
    container.scrollTop = 0;
    shouldBe("window.pageYOffset", "0");
    shouldBe("frameWindow.pageYOffset", "0");
    shouldBe("container.scrollTop", "0");

    // Scroll to various locations and check.
    if (window.accessibilityController)
        targetAccessibleObject.scrollToGlobalPoint(0, 0);
    shouldBe("target.getBoundingClientRect().top", "0");
    if (window.accessibilityController)
        targetAccessibleObject.scrollToGlobalPoint(0, 300);
    shouldBe("target.getBoundingClientRect().top", "300");
    if (window.accessibilityController)
        targetAccessibleObject.scrollToGlobalPoint(0, 3000);
    shouldBe("target.getBoundingClientRect().top", "3000");

    finishJSTest();
}

window.addEventListener('load', function() {
    setTimeout(runTest, 10);
}, false);

</script>

</body>
</html>
