/* 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 */ async function testContentBounds(browser, acc, expectedWidth, expectedHeight) { let [expectedX, expectedY] = await getContentBoundsForDOMElm( browser, getAccessibleDOMNodeID(acc) ); let contentDPR = await getContentDPR(browser); let [x, y, width, height] = getBounds(acc, contentDPR); let prettyAccName = prettyName(acc); is(x, expectedX, "Wrong x coordinate of " + prettyAccName); is(y, expectedY, "Wrong y coordinate of " + prettyAccName); is(width, expectedWidth, "Wrong width of " + prettyAccName); is(height, expectedHeight, "Wrong height of " + prettyAccName); } /** * Test accessible bounds with different combinations of overflow and * non-zero frame area. */ addAccessibleTask( `
`, async function (browser, accDoc) { const a1 = findAccessibleChildByID(accDoc, "a1"); const a2 = findAccessibleChildByID(accDoc, "a2"); const a3 = findAccessibleChildByID(accDoc, "a3"); await testContentBounds(browser, a1, 100, 100); await testContentBounds(browser, a2, 100, 100); await testContentBounds(browser, a3, 200, 200); } ); /** * Ensure frames with zero area have their x, y coordinates correctly reported * in bounds() */ addAccessibleTask( `
`, async function (browser, accDoc) { const a = findAccessibleChildByID(accDoc, "a"); await testContentBounds(browser, a, 0, 0); } ); /** * Ensure accessibles have accurately signed dimensions and position when * offscreen. */ addAccessibleTask( ` `, async function (browser, accDoc) { const radio = findAccessibleChildByID(accDoc, "radio"); const contentDPR = await getContentDPR(browser); const [x, y, width, height] = getBounds(radio, contentDPR); Assert.less(x, 0, "X coordinate should be negative"); Assert.greater(y, 0, "Y coordinate should be positive"); Assert.greater(width, 0, "Width should be positive"); Assert.greater(height, 0, "Height should be positive"); // Note: the exact values of x, y, width, and height // are inconsistent with the DOM element values of those // fields, so we don't check our bounds against them with // `testContentBounds` here. DOM reports a negative width, // positive height, and a slightly different (+/- 20) // x and y. } ); /** * Test height: 0 with align-items: flex-end. This causes the content to * overflow above the frame's main rect. */ addAccessibleTask( ` `, async function (browser, docAcc) { await testBoundsWithContent(docAcc, "inner0", browser); await testBoundsWithContent(docAcc, "inner1", browser); }, { chrome: true, topLevel: true, remoteIframe: true } ); /** * Test a div (block) inside a span (inline). This causes the span's primary * frame to have an empty rect offset from its visible content. */ addAccessibleTask( `
Testing
`, async function (browser, docAcc) { await testBoundsWithContent(docAcc, "span", browser); await testBoundsWithContent(docAcc, "div", browser); }, { chrome: true, topLevel: true, remoteIframe: true } );