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

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

<iframe id="frame" src="data:text/html,<body><button id='upper_target'>Upper Target</button><div style='border: 1px solid #000; height: 5000px;'>5000-pixel box</div><button id='lower_target'>Lower Target</button></body>"></iframe>

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

<script>
description("Tests that scrolling to make an element visible successfully scrolls an iframe.");

window.jsTestIsAsync = true;

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

    var upperTarget = frameDoc.getElementById("upper_target");
    var lowerTarget = frameDoc.getElementById("lower_target");

    var lowerTargetAccessibleObject;
    var upperTargetAccessibleObject;
    if (window.accessibilityController) {
        lowerTarget.focus();
        lowerTargetAccessibleObject = accessibilityController.focusedElement;
        upperTarget.focus();
        upperTargetAccessibleObject = accessibilityController.focusedElement;
    }

    // Reset the initial scroll position (since calling focus() can scroll the page too).
    frameWindow.scrollTo(0, 0);
    shouldBeZero("frameWindow.pageYOffset");

    // Scroll to make lower target visible and check.
    if (window.accessibilityController)
        lowerTargetAccessibleObject.scrollToMakeVisible();
    window.minYOffset = lowerTarget.offsetTop + lowerTarget.offsetHeight - frameWindow.innerHeight;
    window.maxYOffset = lowerTarget.offsetTop;
    shouldBeTrue("frameWindow.pageYOffset >= minYOffset");
    shouldBeTrue("frameWindow.pageYOffset <= maxYOffset");

    // Scroll to make upper target visible and check.
    if (window.accessibilityController)
        upperTargetAccessibleObject.scrollToMakeVisible();
    window.minYOffset = upperTarget.offsetTop + upperTarget.offsetHeight - frameWindow.innerHeight;
    window.maxYOffset = upperTarget.offsetTop;
    shouldBeTrue("frameWindow.pageYOffset >= minYOffset");
    shouldBeTrue("frameWindow.pageYOffset <= maxYOffset");

    finishJSTest();
}

window.addEventListener("load", function() {
    setTimeout(runTest, 0);
}, false);

</script>

</body>
</html>
