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 aria-haspopup
*/
addAccessibleTask(
`
<button aria-haspopup="false" id="false">action</button>
<button aria-haspopup="menu" id="menu">action</button>
<button aria-haspopup="listbox" id="listbox">action</button>
<button aria-haspopup="tree" id="tree">action</button>
<button aria-haspopup="grid" id="grid">action</button>
<button aria-haspopup="dialog" id="dialog">action</button>
`,
async (browser, accDoc) => {
// FALSE
let falseID = getNativeInterface(accDoc, "false");
is(
falseID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup val for button with false"
);
is(
falseID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue val for button with false"
);
let attrChanged = waitForEvent(EVENT_STATE_CHANGE, "false");
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("false")
.setAttribute("aria-haspopup", "true");
});
await attrChanged;
is(
falseID.getAttributeValue("AXPopupValue"),
"true",
"Correct AXPopupValue after change for false"
);
is(
falseID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup val for button with true"
);
let stateChanged = waitForEvent(EVENT_STATE_CHANGE, "false");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("false").removeAttribute("aria-haspopup");
});
await stateChanged;
is(
falseID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue after remove for false"
);
is(
falseID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup val for button after remove"
);
// MENU
let menuID = getNativeInterface(accDoc, "menu");
is(
menuID.getAttributeValue("AXPopupValue"),
"menu",
"Correct AXPopupValue val for button with menu"
);
is(
menuID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup val for button with menu"
);
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("menu")
.setAttribute("aria-haspopup", "true");
});
await untilCacheIs(
() => menuID.getAttributeValue("AXPopupValue"),
"true",
"Correct AXPopupValue after change for menu"
);
is(
menuID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup val for button with menu"
);
stateChanged = waitForEvent(EVENT_STATE_CHANGE, "menu");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("menu").removeAttribute("aria-haspopup");
});
await stateChanged;
await untilCacheIs(
() => menuID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue after remove for menu"
);
is(
menuID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup val for button after remove"
);
// LISTBOX
let listboxID = getNativeInterface(accDoc, "listbox");
is(
listboxID.getAttributeValue("AXPopupValue"),
"listbox",
"Correct AXPopupValue for button with listbox"
);
is(
listboxID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with listbox"
);
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("listbox")
.setAttribute("aria-haspopup", "true");
});
await untilCacheIs(
() => listboxID.getAttributeValue("AXPopupValue"),
"true",
"Correct AXPopupValue after change for listbox"
);
is(
listboxID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with listbox"
);
stateChanged = waitForEvent(EVENT_STATE_CHANGE, "listbox");
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("listbox")
.removeAttribute("aria-haspopup");
});
await stateChanged;
is(
listboxID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue after remove for listbox"
);
is(
listboxID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup for button with listbox"
);
// TREE
let treeID = getNativeInterface(accDoc, "tree");
is(
treeID.getAttributeValue("AXPopupValue"),
"tree",
"Correct AXPopupValue for button with tree"
);
is(
treeID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with tree"
);
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("tree")
.setAttribute("aria-haspopup", "true");
});
await untilCacheIs(
() => treeID.getAttributeValue("AXPopupValue"),
"true",
"Correct AXPopupValue after change for tree"
);
is(
treeID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with tree"
);
stateChanged = waitForEvent(EVENT_STATE_CHANGE, "tree");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("tree").removeAttribute("aria-haspopup");
});
await stateChanged;
is(
treeID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue after remove for tree"
);
is(
treeID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup for button with tree after remove"
);
// GRID
let gridID = getNativeInterface(accDoc, "grid");
is(
gridID.getAttributeValue("AXPopupValue"),
"grid",
"Correct AXPopupValue for button with grid"
);
is(
gridID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with grid"
);
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("grid")
.setAttribute("aria-haspopup", "true");
});
await untilCacheIs(
() => gridID.getAttributeValue("AXPopupValue"),
"true",
"Correct AXPopupValue after change for grid"
);
is(
gridID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with grid"
);
stateChanged = waitForEvent(EVENT_STATE_CHANGE, "grid");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("grid").removeAttribute("aria-haspopup");
});
await stateChanged;
is(
gridID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue after remove for grid"
);
is(
gridID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup for button with grid after remove"
);
// DIALOG
let dialogID = getNativeInterface(accDoc, "dialog");
is(
dialogID.getAttributeValue("AXPopupValue"),
"dialog",
"Correct AXPopupValue for button with dialog"
);
is(
dialogID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with dialog"
);
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("dialog")
.setAttribute("aria-haspopup", "true");
});
await untilCacheIs(
() => dialogID.getAttributeValue("AXPopupValue"),
"true",
"Correct AXPopupValue after change for dialog"
);
is(
dialogID.getAttributeValue("AXHasPopup"),
1,
"Correct AXHasPopup for button with dialog"
);
stateChanged = waitForEvent(EVENT_STATE_CHANGE, "dialog");
await SpecialPowers.spawn(browser, [], () => {
content.document
.getElementById("dialog")
.removeAttribute("aria-haspopup");
});
await stateChanged;
is(
dialogID.getAttributeValue("AXPopupValue"),
null,
"Correct AXPopupValue after remove for dialog"
);
is(
dialogID.getAttributeValue("AXHasPopup"),
0,
"Correct AXHasPopup for button with dialog after remove"
);
}
);