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";
/* import-globals-from ../../mochitest/role.js */
/* import-globals-from ../../mochitest/states.js */
loadScripts(
{ name: "role.js", dir: MOCHITESTS_DIR },
{ name: "states.js", dir: MOCHITESTS_DIR }
);
// Test dropdown select element
addAccessibleTask(
`<select id="select" aria-label="Choose a number">
<option id="one" selected>One</option>
<option id="two">Two</option>
<option id="three">Three</option>
<option id="four" disabled>Four</option>
</select>`,
async (browser, accDoc) => {
// Test combobox
let select = getNativeInterface(accDoc, "select");
is(
select.getAttributeValue("AXRole"),
"AXPopUpButton",
"select has AXPopupButton role"
);
ok(select.attributeNames.includes("AXValue"), "select advertises AXValue");
is(
select.getAttributeValue("AXValue"),
"One",
"select has correctt initial value"
);
ok(
!select.attributeNames.includes("AXHasPopup"),
"select does not advertise AXHasPopup"
);
is(
select.getAttributeValue("AXHasPopup"),
null,
"select does not provide value for AXHasPopup"
);
ok(select.actionNames.includes("AXPress"), "Selectt has press action");
// These four events happen in quick succession when select is pressed
let events = Promise.all([
waitForMacEvent("AXMenuOpened"),
waitForMacEvent("AXSelectedChildrenChanged"),
waitForMacEvent(
"AXFocusedUIElementChanged",
e => e.getAttributeValue("AXRole") == "AXPopUpButton"
),
waitForMacEvent(
"AXFocusedUIElementChanged",
e => e.getAttributeValue("AXRole") == "AXMenuItem"
),
]);
select.performAction("AXPress");
// Only capture the target of AXMenuOpened (first element)
let [menu] = await events;
is(menu.getAttributeValue("AXRole"), "AXMenu", "dropdown has AXMenu role");
is(
menu.getAttributeValue("AXSelectedChildren").length,
1,
"dropdown has single selected child"
);
let selectedChildren = menu.getAttributeValue("AXSelectedChildren");
is(selectedChildren.length, 1, "Only one child is selected");
is(selectedChildren[0].getAttributeValue("AXRole"), "AXMenuItem");
is(selectedChildren[0].getAttributeValue("AXTitle"), "One");
let menuParent = menu.getAttributeValue("AXParent");
is(
menuParent.getAttributeValue("AXRole"),
"AXPopUpButton",
"dropdown parent is a popup button"
);
let menuItems = menu.getAttributeValue("AXChildren").map(c => {
return [
c.getAttributeValue("AXMenuItemMarkChar"),
c.getAttributeValue("AXRole"),
c.getAttributeValue("AXTitle"),
c.getAttributeValue("AXEnabled"),
];
});
Assert.deepEqual(
menuItems,
[
["✓", "AXMenuItem", "One", true],
[null, "AXMenuItem", "Two", true],
[null, "AXMenuItem", "Three", true],
[null, "AXMenuItem", "Four", false],
],
"Menu items have correct checkmark on current value, correctt roles, correct titles, and correct AXEnabled value"
);
events = Promise.all([
waitForMacEvent("AXSelectedChildrenChanged"),
waitForMacEvent("AXFocusedUIElementChanged"),
]);
EventUtils.synthesizeKey("KEY_ArrowDown");
let [, menuItem] = await events;
is(
menuItem.getAttributeValue("AXTitle"),
"Two",
"Focused menu item has correct title"
);
selectedChildren = menu.getAttributeValue("AXSelectedChildren");
is(selectedChildren.length, 1, "Only one child is selected");
is(
selectedChildren[0].getAttributeValue("AXTitle"),
"Two",
"Selected child matches focused item"
);
events = Promise.all([
waitForMacEvent("AXSelectedChildrenChanged"),
waitForMacEvent("AXFocusedUIElementChanged"),
]);
EventUtils.synthesizeKey("KEY_ArrowDown");
[, menuItem] = await events;
is(
menuItem.getAttributeValue("AXTitle"),
"Three",
"Focused menu item has correct title"
);
selectedChildren = menu.getAttributeValue("AXSelectedChildren");
is(selectedChildren.length, 1, "Only one child is selected");
is(
selectedChildren[0].getAttributeValue("AXTitle"),
"Three",
"Selected child matches focused item"
);
events = Promise.all([
waitForMacEvent("AXMenuClosed"),
waitForMacEvent("AXFocusedUIElementChanged"),
waitForMacEvent("AXSelectedChildrenChanged"),
]);
menuItem.performAction("AXPress");
let [, newFocus] = await events;
is(
newFocus.getAttributeValue("AXRole"),
"AXPopUpButton",
"Newly focused element is AXPopupButton"
);
is(
newFocus.getAttributeValue("AXDOMIdentifier"),
"select",
"Should return focus to select"
);
is(
newFocus.getAttributeValue("AXValue"),
"Three",
"select has correct new value"
);
}
);