<!DOCTYPE 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>

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

<br>
<iframe id="frame2" src="./resources/iframe.html"></iframe>

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

<script>
description("This tests that scrolling to make an element visible works properly when there's an iframe off screen.");

window.jsTestIsAsync = true;

function runTest() {

    window.frame = document.getElementById("frame");
    window.frameWindow = frame.contentWindow;

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

    var lowerTargetAccessibleObject;
    var upperTargetAccessibleObject;
    if (frameWindow.accessibilityController) {
        lowerTargetAccessibleObject = frameWindow.accessibilityController.accessibleElementById("lower_target");
        upperTargetAccessibleObject = frameWindow.accessibilityController.accessibleElementById("upper_target");
    }

    // Initial state
    debug("Test scrolling an offscreen iframe.");
    window.scrollTo(0, 0);
    shouldBeZero("window.pageYOffset");

    // Scroll to make lower target visible and check.
    debug("\nScroll lower target to visible.");
    if (frameWindow.accessibilityController)
        lowerTargetAccessibleObject.scrollToMakeVisible();
    // The iframe should be scrolled into view.
    debug("The iframe should be scrolled into view");
    window.scrolledYOffset = window.pageYOffset;
    shouldBeTrue("scrolledYOffset > 0");
    // The content inside the iframe should be scrolled into view too
    testScrolledIntoView(lowerTarget, frameWindow, "Test the lower target should be scrolled into view.")

    // Scroll to make upper target visible and check.
    debug("\nScroll upper target to visible.");
    if (frameWindow.accessibilityController)
        upperTargetAccessibleObject.scrollToMakeVisible();
    // The iframe should be visible already
    debug("The main window shouldn't scroll.");
    shouldBeTrue("window.pageYOffset == scrolledYOffset");
    // The content inside the iframe should be scrolled into view too
    testScrolledIntoView(upperTarget, frameWindow, "Test the upper target should be scrolled into view.")

    // Reset and test iframe inside iframe
    debug("\nReset scrolling. Test scrolling in nested iframes.");
    window.scrollTo(0, 0);
    shouldBeZero("window.pageYOffset");

    window.innerFrame = document.getElementById("frame2").contentWindow.document.getElementById("iframe");
    window.innerFrameWindow = innerFrame.contentWindow;
    var button = innerFrameWindow.document.getElementById("button");
    var buttonAccessibleObject;
    debug("\nScroll inner button to visible.");
    if (innerFrameWindow.accessibilityController) {
        buttonAccessibleObject = innerFrameWindow.accessibilityController.accessibleElementById("button");
        buttonAccessibleObject.scrollToMakeVisible();
    }
    // The content inside the inner iframe should be scrolled into view too
    testScrolledIntoView(button, innerFrameWindow, "Test the button inside the inner frame should be scrolled into view");
    // Use outter frame to determine the inner frame is scrolled into view.
    window.outterFrame = document.getElementById("frame2");
    window.outterFrameWindow = outterFrame.contentWindow;
    debug("The inner iframe should be scrolled into view");
    shouldBeTrue("outterFrameWindow.pageYOffset > 0");

    // Now make sure we can scroll back to the outter text above the inner iframe
    var text = outterFrameWindow.document.getElementById("box").firstChild;
    var textAccessibleObject;
    debug("\nScroll outter text element to visible.");
    if (outterFrameWindow.accessibilityController) {
        textAccessibleObject = outterFrameWindow.accessibilityController.accessibleElementById("box").childAtIndex(0);
        textAccessibleObject.scrollToMakeVisible();
    }
    debug("The Y offset of the outter iframe should be reset.")
    shouldBeZero("outterFrameWindow.pageYOffset");

    finishJSTest();
}

function testScrolledIntoView(object, testWindow, description) {
    debug(description);
    window.frameMinYOffset = object.offsetTop + object.offsetHeight - testWindow.innerHeight;
    window.frameMaxYOffset = object.offsetTop;
    window.scrolledIntoView = testWindow.pageYOffset >= frameMinYOffset && testWindow.pageYOffset <= frameMaxYOffset;
    shouldBeTrue("scrolledIntoView");
}

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

</script>

</body>
</html>
