Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

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