/* 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"; /* import-globals-from ../../mochitest/layout.js */ loadScripts({ name: "layout.js", dir: MOCHITESTS_DIR }); const appUnitsPerDevPixel = 60; function testCachedScrollPosition(acc, expectedX, expectedY) { let cachedPosition = ""; try { cachedPosition = acc.cache.getStringProperty("scroll-position"); } catch (e) { // If the key doesn't exist, this means 0, 0. cachedPosition = "0, 0"; } // The value we retrieve from the cache is in app units, but the values // passed in are in pixels. Since the retrieved value is a string, // and harder to modify, adjust our expected x and y values to match its units. return ( cachedPosition == `${expectedX * appUnitsPerDevPixel}, ${expectedY * appUnitsPerDevPixel}` ); } function getCachedBounds(acc) { let cachedBounds = ""; try { cachedBounds = acc.cache.getStringProperty("relative-bounds"); } catch (e) { ok(false, "Unable to fetch cached bounds from cache!"); } return cachedBounds; } /** * Test bounds of accessibles after scrolling */ addAccessibleTask( `
`, async function(browser, docAcc) { ok(docAcc, "iframe document acc is present"); await testBoundsWithContent(docAcc, "square", browser); await testBoundsWithContent(docAcc, "rect", browser); await invokeContentTask(browser, [], () => { content.document.getElementById("square").scrollIntoView(); }); await waitForContentPaint(browser); await testBoundsWithContent(docAcc, "square", browser); await testBoundsWithContent(docAcc, "rect", browser); // Scroll rect into view, but also make it reflow so we can be sure the // bounds are correct for reflowed frames. await invokeContentTask(browser, [], () => { const rect = content.document.getElementById("rect"); rect.scrollIntoView(); rect.style.width = "300px"; rect.offsetTop; // Flush layout. rect.style.width = "200px"; rect.offsetTop; // Flush layout. }); await waitForContentPaint(browser); await testBoundsWithContent(docAcc, "square", browser); await testBoundsWithContent(docAcc, "rect", browser); }, { iframe: true, remoteIframe: true, chrome: true } ); /** * Test scroll offset on cached accessibles */ addAccessibleTask( `
`, async function(browser, docAcc) { // We can only access the `cache` attribute of an accessible when // the cache is enabled and we're in a remote browser. Verify // both these conditions hold, and return early if they don't. if (!isCacheEnabled || !browser.isRemoteBrowser) { return; } ok(docAcc, "iframe document acc is present"); await untilCacheOk( () => testCachedScrollPosition(docAcc, 0, 0), "Correct initial scroll position." ); const rectAcc = findAccessibleChildByID(docAcc, "rect"); const rectInitialBounds = getCachedBounds(rectAcc); await invokeContentTask(browser, [], () => { content.document.getElementById("square").scrollIntoView(); }); await waitForContentPaint(browser); // The only content to scroll over is `square`'s top margin // so our scroll offset here should be 3000px await untilCacheOk( () => testCachedScrollPosition(docAcc, 0, 3000), "Correct scroll position after first scroll." ); // Scroll rect into view, but also make it reflow so we can be sure the // bounds are correct for reflowed frames. await invokeContentTask(browser, [], () => { const rect = content.document.getElementById("rect"); rect.scrollIntoView(); rect.style.width = "300px"; rect.offsetTop; rect.style.width = "200px"; }); await waitForContentPaint(browser); // We have to scroll over `square`'s top margin (3000px), // `square` itself (100px), and `square`'s bottom margin (4000px). // This should give us a 7100px offset. await untilCacheOk( () => testCachedScrollPosition(docAcc, 0, 7100), "Correct final scroll position." ); await untilCacheIs( () => getCachedBounds(rectAcc), rectInitialBounds, "Cached relative bounds don't change when scrolling" ); }, { iframe: true, remoteIframe: true } );