| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="../resources/accessibility-helper.js"></script> |
| <script src="../resources/js-test.js"></script> |
| </head> |
| <body> |
| |
| <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> |
| |
| <script> |
| var output = "This tests that scrolling to make an element visible works properly when there's an iframe off screen.\n\n"; |
| 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 = frameWindow.accessibilityController.accessibleElementById("lower_target"); |
| var upperTargetAccessibleObject = frameWindow.accessibilityController.accessibleElementById("upper_target"); |
| |
| // Initial state |
| output += "Test scrolling an offscreen iframe."; |
| window.scrollTo(0, 0); |
| output += expect("window.pageYOffset", "0"); |
| |
| // Scroll to make lower target visible and check. |
| output += "\nScroll lower target to visible."; |
| lowerTargetAccessibleObject.scrollToMakeVisible(); |
| |
| setTimeout(async function() { |
| |
| // The iframe should be scrolled into view. |
| output += "The iframe should be scrolled into view\n"; |
| await waitFor(() => { |
| window.scrolledYOffset = window.pageYOffset; |
| return window.scrolledYOffset > 0; |
| }) |
| output += expect("scrolledYOffset > 0", "true"); |
| // The content inside the iframe should be scrolled into view too |
| await testScrolledIntoView(lowerTarget, frameWindow, "Test the lower target should be scrolled into view.") |
| |
| // Scroll to make upper target visible and check. |
| output += "\nScroll upper target to visible.\n"; |
| upperTargetAccessibleObject.scrollToMakeVisible(); |
| // The iframe should be visible already |
| output += "The main window shouldn't scroll.\n"; |
| output += await expectAsync("window.pageYOffset == scrolledYOffset", "true"); |
| // The content inside the iframe should be scrolled into view too |
| await testScrolledIntoView(upperTarget, frameWindow, "Test the upper target should be scrolled into view.") |
| |
| // Reset and test iframe inside iframe |
| output += "\nReset scrolling. Test scrolling in nested iframes.\n"; |
| window.scrollTo(0, 0); |
| output += expect("window.pageYOffset", "0"); |
| |
| window.innerFrame = document.getElementById("frame2").contentWindow.document.getElementById("iframe"); |
| window.innerFrameWindow = innerFrame.contentWindow; |
| var button = innerFrameWindow.document.getElementById("button"); |
| var buttonAccessibleObject; |
| output += "\nScroll inner button to visible.\n"; |
| buttonAccessibleObject = innerFrameWindow.accessibilityController.accessibleElementById("button"); |
| buttonAccessibleObject.scrollToMakeVisible(); |
| |
| // The content inside the inner iframe should be scrolled into view too |
| await 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; |
| output += "The inner iframe should be scrolled into view\n"; |
| output += expect("outterFrameWindow.pageYOffset > 0", "true"); |
| |
| // Now make sure we can scroll back to the outter text above the inner iframe |
| var text = outterFrameWindow.document.getElementById("box").firstChild; |
| var textAccessibleObject; |
| output += "\nScroll outter text element to visible.\n"; |
| textAccessibleObject = outterFrameWindow.accessibilityController.accessibleElementById("box").childAtIndex(0); |
| textAccessibleObject.scrollToMakeVisible(); |
| output += "The Y offset of the outter iframe should be reset.\n"; |
| output += await expectAsync("outterFrameWindow.pageYOffset", "0"); |
| |
| debug(output); |
| finishJSTest(); |
| }, 0); |
| } |
| |
| async function testScrolledIntoView(object, testWindow, description) { |
| output += `${description}\n`; |
| await waitFor(() => { |
| window.frameMinYOffset = object.offsetTop + object.offsetHeight - testWindow.innerHeight; |
| window.frameMaxYOffset = object.offsetTop; |
| window.scrolledIntoView = testWindow.pageYOffset >= frameMinYOffset && testWindow.pageYOffset <= frameMaxYOffset; |
| return window.scrolledIntoView; |
| }); |
| output += expect("scrolledIntoView", "true"); |
| } |
| |
| window.addEventListener("load", function() { |
| setTimeout(runTest, 0); |
| }, false); |
| </script> |
| </body> |
| </html> |
| |