170 lines
5.4 KiB
JavaScript
170 lines
5.4 KiB
JavaScript
/* 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";
|
|
|
|
// Checks for the AccessibleWalkerActor
|
|
|
|
add_task(async function () {
|
|
const { target, walker, a11yWalker, parentAccessibility } =
|
|
await initAccessibilityFrontsForUrl(MAIN_DOMAIN + "doc_accessibility.html");
|
|
|
|
ok(a11yWalker, "The AccessibleWalkerFront was returned");
|
|
const rootNode = await walker.getRootNode();
|
|
const a11yDoc = await a11yWalker.getAccessibleFor(rootNode);
|
|
ok(a11yDoc, "The AccessibleFront for root doc is created");
|
|
|
|
const children = await a11yWalker.children();
|
|
is(
|
|
children.length,
|
|
1,
|
|
"AccessibleWalker only has 1 child - root doc accessible"
|
|
);
|
|
is(
|
|
a11yDoc,
|
|
children[0],
|
|
"Root accessible must be AccessibleWalker's only child"
|
|
);
|
|
|
|
const buttonNode = await walker.querySelector(walker.rootNode, "#button");
|
|
const accessibleFront = await a11yWalker.getAccessibleFor(buttonNode);
|
|
|
|
checkA11yFront(accessibleFront, {
|
|
name: "Accessible Button",
|
|
role: "button",
|
|
});
|
|
|
|
const ancestry = await a11yWalker.getAncestry(accessibleFront);
|
|
is(ancestry.length, 1, "Button is a direct child of a root document.");
|
|
is(
|
|
ancestry[0].accessible,
|
|
a11yDoc,
|
|
"Button's only ancestor is a root document"
|
|
);
|
|
is(
|
|
ancestry[0].children.length,
|
|
8,
|
|
"Root doc should have correct number of children"
|
|
);
|
|
ok(
|
|
ancestry[0].children.includes(accessibleFront),
|
|
"Button accessible front is in root doc's children"
|
|
);
|
|
|
|
const browser = gBrowser.selectedBrowser;
|
|
|
|
// Ensure name-change event is emitted by walker when cached accessible's name
|
|
// gets updated (via DOM manipularion).
|
|
await emitA11yEvent(
|
|
a11yWalker,
|
|
"name-change",
|
|
(front, parent) => {
|
|
checkA11yFront(front, { name: "Renamed" }, accessibleFront);
|
|
checkA11yFront(parent, {}, a11yDoc);
|
|
},
|
|
() =>
|
|
SpecialPowers.spawn(browser, [], () =>
|
|
content.document
|
|
.getElementById("button")
|
|
.setAttribute("aria-label", "Renamed")
|
|
)
|
|
);
|
|
|
|
// Ensure reorder event is emitted by walker when DOM tree changes.
|
|
let docChildren = await a11yDoc.children();
|
|
is(docChildren.length, 8, "Root doc should have correct number of children");
|
|
|
|
await emitA11yEvent(
|
|
a11yWalker,
|
|
"reorder",
|
|
front => checkA11yFront(front, {}, a11yDoc),
|
|
() =>
|
|
SpecialPowers.spawn(browser, [], () => {
|
|
const input = content.document.createElement("input");
|
|
input.type = "text";
|
|
input.title = "This is a tooltip";
|
|
input.value = "New input";
|
|
content.document.body.appendChild(input);
|
|
})
|
|
);
|
|
|
|
docChildren = await a11yDoc.children();
|
|
is(docChildren.length, 9, "Root doc should have correct number of children");
|
|
|
|
let shown = await a11yWalker.highlightAccessible(docChildren[0]);
|
|
ok(shown, "AccessibleHighlighter highlighted the node");
|
|
|
|
shown = await a11yWalker.highlightAccessible(a11yDoc);
|
|
ok(shown, "AccessibleHighlighter highlights the document correctly.");
|
|
await a11yWalker.unhighlight();
|
|
|
|
info("Checking AccessibleWalker picker functionality");
|
|
ok(a11yWalker.pick, "AccessibleWalker pick method exists");
|
|
ok(a11yWalker.pickAndFocus, "AccessibleWalker pickAndFocus method exists");
|
|
ok(a11yWalker.cancelPick, "AccessibleWalker cancelPick method exists");
|
|
|
|
let onPickerEvent = a11yWalker.once("picker-accessible-hovered");
|
|
await a11yWalker.pick();
|
|
await BrowserTestUtils.synthesizeMouseAtCenter(
|
|
"#h1",
|
|
{ type: "mousemove" },
|
|
browser
|
|
);
|
|
let acc = await onPickerEvent;
|
|
checkA11yFront(acc, { name: "Accessibility Test" }, docChildren[0]);
|
|
|
|
onPickerEvent = a11yWalker.once("picker-accessible-previewed");
|
|
await BrowserTestUtils.synthesizeMouseAtCenter(
|
|
"#h1",
|
|
{ shiftKey: true },
|
|
browser
|
|
);
|
|
acc = await onPickerEvent;
|
|
checkA11yFront(acc, { name: "Accessibility Test" }, docChildren[0]);
|
|
|
|
onPickerEvent = a11yWalker.once("picker-accessible-canceled");
|
|
await BrowserTestUtils.synthesizeKey(
|
|
"VK_ESCAPE",
|
|
{ type: "keydown" },
|
|
browser
|
|
);
|
|
await onPickerEvent;
|
|
|
|
onPickerEvent = a11yWalker.once("picker-accessible-hovered");
|
|
await a11yWalker.pick();
|
|
await BrowserTestUtils.synthesizeMouseAtCenter(
|
|
"#h1",
|
|
{ type: "mousemove" },
|
|
browser
|
|
);
|
|
await onPickerEvent;
|
|
|
|
onPickerEvent = a11yWalker.once("picker-accessible-picked");
|
|
await BrowserTestUtils.synthesizeMouseAtCenter("#h1", {}, browser);
|
|
acc = await onPickerEvent;
|
|
checkA11yFront(acc, { name: "Accessibility Test" }, docChildren[0]);
|
|
|
|
await a11yWalker.cancelPick();
|
|
|
|
info("Checking tabbing order highlighter");
|
|
let { elm, index } = await a11yWalker.showTabbingOrder(rootNode, 0);
|
|
isnot(!!elm, "No current element when at the end of the tab order");
|
|
is(index, 3, "Current index is correct");
|
|
await a11yWalker.hideTabbingOrder();
|
|
|
|
({ elm, index } = await a11yWalker.showTabbingOrder(buttonNode, 0));
|
|
isnot(!!elm, "No current element when at the end of the tab order");
|
|
is(index, 2, "Current index is correct");
|
|
await a11yWalker.hideTabbingOrder();
|
|
|
|
info(
|
|
"When targets follow the WindowGlobal lifecycle and handle only one document, " +
|
|
"only check that the panel refreshes correctly and emit its 'reloaded' event"
|
|
);
|
|
await reloadBrowser();
|
|
|
|
await waitForA11yShutdown(parentAccessibility);
|
|
await target.destroy();
|
|
gBrowser.removeCurrentTab();
|
|
});
|