diff options
Diffstat (limited to 'accessible/tests/browser/states/browser_test_visibility.js')
-rw-r--r-- | accessible/tests/browser/states/browser_test_visibility.js | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/accessible/tests/browser/states/browser_test_visibility.js b/accessible/tests/browser/states/browser_test_visibility.js new file mode 100644 index 0000000000..25bd903ed4 --- /dev/null +++ b/accessible/tests/browser/states/browser_test_visibility.js @@ -0,0 +1,181 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +async function runTest(browser, accDoc) { + let getAcc = id => findAccessibleChildByID(accDoc, id); + + await untilCacheOk( + () => testVisibility(getAcc("div"), false, false), + "Div should be on screen" + ); + + let input = getAcc("input_scrolledoff"); + await untilCacheOk( + () => testVisibility(input, true, false), + "Input should be offscreen" + ); + + // scrolled off item (twice) + let lastLi = getAcc("li_last"); + await untilCacheOk( + () => testVisibility(lastLi, true, false), + "Last list item should be offscreen" + ); + + // scroll into view the item + await invokeContentTask(browser, [], () => { + content.document.getElementById("li_last").scrollIntoView(true); + }); + await untilCacheOk( + () => testVisibility(lastLi, false, false), + "Last list item should no longer be offscreen" + ); + + // first item is scrolled off now (testcase for bug 768786) + let firstLi = getAcc("li_first"); + await untilCacheOk( + () => testVisibility(firstLi, true, false), + "First listitem should now be offscreen" + ); + + await untilCacheOk( + () => testVisibility(getAcc("frame"), false, false), + "iframe should initially be onscreen" + ); + + let loaded = waitForEvent(EVENT_DOCUMENT_LOAD_COMPLETE, "iframeDoc"); + await invokeContentTask(browser, [], () => { + content.document.querySelector("iframe").src = + 'data:text/html,<body id="iframeDoc"><p id="p">hi</p></body>'; + }); + + const iframeDoc = (await loaded).accessible; + await untilCacheOk( + () => testVisibility(getAcc("frame"), false, false), + "iframe outer doc should now be on screen" + ); + await untilCacheOk( + () => testVisibility(iframeDoc, false, false), + "iframe inner doc should be on screen" + ); + const iframeP = findAccessibleChildByID(iframeDoc, "p"); + await untilCacheOk( + () => testVisibility(iframeP, false, false), + "iframe content should also be on screen" + ); + + // scroll into view the div + await invokeContentTask(browser, [], () => { + content.document.getElementById("div").scrollIntoView(true); + }); + + await untilCacheOk( + () => testVisibility(getAcc("frame"), true, false), + "iframe outer doc should now be off screen" + ); + await untilCacheOk( + () => testVisibility(iframeDoc, true, false), + "iframe inner doc should now be off screen" + ); + await untilCacheOk( + () => testVisibility(iframeP, true, false), + "iframe content should now be off screen" + ); + + let newTab = await BrowserTestUtils.openNewForegroundTab(gBrowser); + // Accessibles in background tab should have offscreen state and no + // invisible state. + await untilCacheOk( + () => testVisibility(getAcc("div"), true, false), + "Accs in background tab should be offscreen but not invisible." + ); + + await untilCacheOk( + () => testVisibility(getAcc("frame"), true, false), + "iframe outer doc should still be off screen" + ); + await untilCacheOk( + () => testVisibility(iframeDoc, true, false), + "iframe inner doc should still be off screen" + ); + await untilCacheOk( + () => testVisibility(iframeP, true, false), + "iframe content should still be off screen" + ); + + BrowserTestUtils.removeTab(newTab); +} + +addAccessibleTask( + ` + <div id="div" style="border:2px solid blue; width: 500px; height: 110vh;"></div> + <input id="input_scrolledoff"> + <ul style="border:2px solid red; width: 100px; height: 50px; overflow: auto;"> + <li id="li_first">item1</li><li>item2</li><li>item3</li> + <li>item4</li><li>item5</li><li id="li_last">item6</li> + </ul> + <iframe id="frame"></iframe> + `, + runTest, + { iframe: true, remoteIframe: true } +); + +/** + * Test div containers are reported as onscreen, even if some of their contents are + * offscreen. + */ +addAccessibleTask( + ` + <div id="outer" style="width:200vw; background: green; overflow:scroll;"><div id="inner"><div style="display:inline-block; width:100vw; background:red;" id="on">on screen</div><div style="background:blue; display:inline;" id="off">offscreen</div></div></div> + `, + async function (browser, accDoc) { + const outer = findAccessibleChildByID(accDoc, "outer"); + const inner = findAccessibleChildByID(accDoc, "inner"); + const on = findAccessibleChildByID(accDoc, "on"); + const off = findAccessibleChildByID(accDoc, "off"); + + await untilCacheOk( + () => testVisibility(outer, false, false), + "outer should be on screen and visible" + ); + await untilCacheOk( + () => testVisibility(inner, false, false), + "inner should be on screen and visible" + ); + await untilCacheOk( + () => testVisibility(on, false, false), + "on should be on screen and visible" + ); + await untilCacheOk( + () => testVisibility(off, true, false), + "off should be off screen and visible" + ); + }, + { chrome: true, iframe: true, remoteIframe: true } +); + +// test dynamic translation +addAccessibleTask( + `<div id="container" style="position: absolute; left: -300px; top: 100px;">Hello</div><button id="b" onclick="container.style.transform = 'translateX(400px)'">Move</button>`, + async function (browser, accDoc) { + const container = findAccessibleChildByID(accDoc, "container"); + await untilCacheOk( + () => testVisibility(container, true, false), + "container should be off screen and visible" + ); + await invokeContentTask(browser, [], () => { + let b = content.document.getElementById("b"); + b.click(); + }); + + await waitForContentPaint(browser); + await untilCacheOk( + () => testVisibility(container, false, false), + "container should be on screen and visible" + ); + }, + { chrome: true, iframe: true, remoteIframe: true } +); |