320 lines
8.3 KiB
JavaScript
320 lines
8.3 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";
|
|
|
|
/* 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"
|
|
);
|
|
}
|
|
);
|