--- /dev/null
+This tests that scrolling to make an element visible works properly when there's an iframe off screen.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+5000-pixel box
+
+
+Test scrolling an offscreen iframe.
+PASS window.pageYOffset is 0
+
+Scroll lower target to visible.
+The iframe should be scrolled into view
+PASS scrolledYOffset > 0 is true
+Test the lower target should be scrolled into view.
+PASS scrolledIntoView is true
+
+Scroll upper target to visible.
+The main window shouldn't scroll.
+PASS window.pageYOffset == scrolledYOffset is true
+Test the upper target should be scrolled into view.
+PASS scrolledIntoView is true
+
+Reset scrolling. Test scrolling in nested iframes.
+PASS window.pageYOffset is 0
+
+Scroll inner button to visible.
+Test the button inside the inner frame should be scrolled into view
+PASS scrolledIntoView is true
+The inner iframe should be scrolled into view
+PASS outterFrameWindow.pageYOffset > 0 is true
+
+Scroll outter text element to visible.
+The Y offset of the outter iframe should be reset.
+PASS outterFrameWindow.pageYOffset is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+<!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 #000; 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>