/* 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"; addAccessibleTask( ` a

ab

a
`, async function (browser, docAcc) { const dpr = await getContentDPR(browser); // Test getOffsetAtPoint on a container containing no characters. The inner // container does not include the requested point, but the outer one does. const noChars = findAccessibleChildByID(docAcc, "noChars", [ Ci.nsIAccessibleText, ]); let [x, y] = Layout.getBounds(noChars, dpr); await testOffsetAtPoint(noChars, x, y, COORDTYPE_SCREEN_RELATIVE, -1); // Test that the correct offset is returned for a point in a second text // leaf. const twoText = findAccessibleChildByID(docAcc, "twoText", [ Ci.nsIAccessibleText, ]); const text2 = twoText.getChildAt(1); [x, y] = Layout.getBounds(text2, dpr); await testOffsetAtPoint(twoText, x, y, COORDTYPE_SCREEN_RELATIVE, 1); // Test offsetAtPoint when there is an iframe at the end of the container. const iframeAtEnd = findAccessibleChildByID(docAcc, "iframeAtEnd", [ Ci.nsIAccessibleText, ]); let width; let height; [x, y, width, height] = Layout.getBounds(iframeAtEnd, dpr); x += width - 1; y += height - 1; await testOffsetAtPoint(iframeAtEnd, x, y, COORDTYPE_SCREEN_RELATIVE, -1); // Test that 0 is returned if the point is within the container but before // the rectangle at offset 0. This is buggy behavior that some users have // unfortunately come to rely on (bug 1816601). const pointBeforeText = findAccessibleChildByID(docAcc, "pointBeforeText", [ Ci.nsIAccessibleText, ]); [x, y, width, height] = Layout.getBounds(pointBeforeText, dpr); await testOffsetAtPoint( pointBeforeText, x + 1, y + 1, COORDTYPE_SCREEN_RELATIVE, 0 ); // But this buggy behavior only applies for a point before offset 0, not // a point after the last offset. So it's asymmetrically buggy. :( await testOffsetAtPoint( pointBeforeText, x + width - 1, y + height - 1, COORDTYPE_SCREEN_RELATIVE, -1 ); }, { topLevel: true, iframe: true, remoteIframe: true, chrome: true, } );