/* 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,
}
);