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