/* 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 } ); function getSelectedIds(selectable) { return selectable .getAttributeValue("AXSelectedChildren") .map(c => c.getAttributeValue("AXDOMIdentifier")); } /** * Test aria tabs */ addAccessibleTask("mac/doc_aria_tabs.html", async (browser, accDoc) => { let tablist = getNativeInterface(accDoc, "tablist"); is( tablist.getAttributeValue("AXRole"), "AXTabGroup", "Correct role for tablist" ); let tabMacAccs = tablist.getAttributeValue("AXTabs"); is(tabMacAccs.length, 3, "3 items in AXTabs"); let selectedTabs = tablist.getAttributeValue("AXSelectedChildren"); is(selectedTabs.length, 1, "one selected tab"); let tab = selectedTabs[0]; is(tab.getAttributeValue("AXRole"), "AXRadioButton", "Correct role for tab"); is( tab.getAttributeValue("AXSubrole"), "AXTabButton", "Correct subrole for tab" ); is(tab.getAttributeValue("AXTitle"), "First Tab", "Correct title for tab"); let tabToSelect = tabMacAccs[1]; is( tabToSelect.getAttributeValue("AXTitle"), "Second Tab", "Correct title for tab" ); let actions = tabToSelect.actionNames; ok(true, actions); ok(actions.includes("AXPress"), "Has switch action"); let evt = waitForMacEvent("AXSelectedChildrenChanged"); tabToSelect.performAction("AXPress"); await evt; selectedTabs = tablist.getAttributeValue("AXSelectedChildren"); is(selectedTabs.length, 1, "one selected tab"); is( selectedTabs[0].getAttributeValue("AXTitle"), "Second Tab", "Correct title for tab" ); }); addAccessibleTask('

hello

', async (browser, accDoc) => { let p = getNativeInterface(accDoc, "p"); ok( p.attributeNames.includes("AXSelected"), "html element includes 'AXSelected' attribute" ); is(p.getAttributeValue("AXSelected"), 0, "AX selected is 'false'"); }); addAccessibleTask( ``, async (browser, accDoc) => { let select = getNativeInterface(accDoc, "select"); let one = getNativeInterface(accDoc, "one"); let two = getNativeInterface(accDoc, "two"); let three = getNativeInterface(accDoc, "three"); let four = getNativeInterface(accDoc, "four"); is( select.getAttributeValue("AXTitle"), "Choose a number", "Select titled correctly" ); ok( select.attributeNames.includes("AXOrientation"), "Have orientation attribute" ); ok( select.isAttributeSettable("AXSelectedChildren"), "Select can have AXSelectedChildren set" ); is(one.getAttributeValue("AXTitle"), "", "Option should not have a title"); is( one.getAttributeValue("AXValue"), "One", "Option should have correct value" ); is( one.getAttributeValue("AXRole"), "AXStaticText", "Options should have AXStaticText role" ); ok(one.isAttributeSettable("AXSelected"), "Option can have AXSelected set"); is(select.getAttributeValue("AXSelectedChildren").length, 1); let evt = waitForMacEvent("AXSelectedChildrenChanged"); one.setAttributeValue("AXSelected", false); await evt; is(select.getAttributeValue("AXSelectedChildren").length, 0); evt = waitForMacEvent("AXSelectedChildrenChanged"); three.setAttributeValue("AXSelected", true); await evt; is(select.getAttributeValue("AXSelectedChildren").length, 1); ok(getSelectedIds(select).includes("three"), "'three' is selected"); evt = waitForMacEvent("AXSelectedChildrenChanged"); select.setAttributeValue("AXSelectedChildren", [one, two]); await evt; await untilCacheOk(() => { let ids = getSelectedIds(select); return ids[0] == "one" && ids[1] == "two"; }, "Got correct selected children"); evt = waitForMacEvent("AXSelectedChildrenChanged"); select.setAttributeValue("AXSelectedChildren", [three, two, four]); await evt; await untilCacheOk(() => { let ids = getSelectedIds(select); return ids[0] == "two" && ids[1] == "three"; }, "Got correct selected children"); ok(!four.getAttributeValue("AXEnabled"), "Disabled option is disabled"); } ); addAccessibleTask( ``, async (browser, accDoc) => { let select = getNativeInterface(accDoc, "select"); is( select.getAttributeValue("AXTitle"), "Choose a thing", "Select titled correctly" ); ok( select.attributeNames.includes("AXOrientation"), "Have orientation attribute" ); ok( select.isAttributeSettable("AXSelectedChildren"), "Select can have AXSelectedChildren set" ); let childValueSelectablePairs = select .getAttributeValue("AXChildren") .map(c => [ c.getAttributeValue("AXValue"), c.isAttributeSettable("AXSelected"), c.getAttributeValue("AXEnabled"), ]); [ ["​", false, 0], ["Fruits", false, 0], ["Banana", true, 1], ["Apple", true, 1], ["Orange", true, 1], ["​", false, 0], ["Vegetables", false, 0], ["Lettuce", true, 1], ["Tomato", true, 1], ["Onion", true, 1], ["​", false, 0], ["Spices", false, 0], ["Cumin", true, 1], ["Coriander", true, 1], ["Allspice", true, 1], ["Everything", true, 1], ]; Assert.deepEqual( childValueSelectablePairs, [ ["​", false, false], ["Fruits", false, false], ["Banana", true, true], ["Apple", true, true], ["Orange", true, true], ["​", false, false], ["Vegetables", false, false], ["Lettuce", true, true], ["Tomato", true, true], ["Onion", true, true], ["​", false, false], ["Spices", false, false], ["Cumin", true, true], ["Coriander", true, true], ["Allspice", true, true], ["Everything", true, true], ], "Options are selectable, group labels are not" ); let allspice = getNativeInterface(accDoc, "allspice"); is( allspice.getAttributeValue("AXTitle"), "", "Option should not have a title" ); is( allspice.getAttributeValue("AXValue"), "Allspice", "Option should have a value" ); is( allspice.getAttributeValue("AXRole"), "AXStaticText", "Options should have AXStaticText role" ); ok( allspice.isAttributeSettable("AXSelected"), "Option can have AXSelected set" ); is( allspice .getAttributeValue("AXParent") .getAttributeValue("AXDOMIdentifier"), "select", "Select is direct parent of nested option" ); let groupLabel = select.getAttributeValue("AXChildren")[1]; ok( !groupLabel.isAttributeSettable("AXSelected"), "Group label should not be selectable" ); is( groupLabel.getAttributeValue("AXValue"), "Fruits", "Group label should have a value" ); is( groupLabel.getAttributeValue("AXTitle"), null, "Group label should not have a title" ); is( groupLabel.getAttributeValue("AXRole"), "AXStaticText", "Group label should have AXStaticText role" ); is( groupLabel .getAttributeValue("AXParent") .getAttributeValue("AXDOMIdentifier"), "select", "Select is direct parent of group label" ); Assert.deepEqual(getSelectedIds(select), ["banana", "lettuce", "allspice"]); } ); addAccessibleTask( `
One
Two
Three
Four
`, async (browser, accDoc) => { let select = getNativeInterface(accDoc, "select"); let one = getNativeInterface(accDoc, "one"); let two = getNativeInterface(accDoc, "two"); let three = getNativeInterface(accDoc, "three"); let four = getNativeInterface(accDoc, "four"); is( select.getAttributeValue("AXTitle"), "Choose a number", "Select titled correctly" ); ok( select.attributeNames.includes("AXOrientation"), "Have orientation attribute" ); ok( select.isAttributeSettable("AXSelectedChildren"), "Select can have AXSelectedChildren set" ); is(one.getAttributeValue("AXTitle"), "", "Option should not have a title"); is( one.getAttributeValue("AXValue"), "One", "Option should have correct value" ); is( one.getAttributeValue("AXRole"), "AXStaticText", "Options should have AXStaticText role" ); ok(one.isAttributeSettable("AXSelected"), "Option can have AXSelected set"); is(select.getAttributeValue("AXSelectedChildren").length, 1); let evt = waitForMacEvent("AXSelectedChildrenChanged"); // Change selection from content. await SpecialPowers.spawn(browser, [], () => { content.document.getElementById("one").removeAttribute("aria-selected"); }); await evt; is(select.getAttributeValue("AXSelectedChildren").length, 0); evt = waitForMacEvent("AXSelectedChildrenChanged"); three.setAttributeValue("AXSelected", true); await evt; is(select.getAttributeValue("AXSelectedChildren").length, 1); ok(getSelectedIds(select).includes("three"), "'three' is selected"); evt = waitForMacEvent("AXSelectedChildrenChanged"); select.setAttributeValue("AXSelectedChildren", [one, two]); await evt; await untilCacheOk(() => { let ids = getSelectedIds(select); return ids[0] == "one" && ids[1] == "two"; }, "Got correct selected children"); evt = waitForMacEvent("AXSelectedChildrenChanged"); select.setAttributeValue("AXSelectedChildren", [three, two, four]); await evt; await untilCacheOk(() => { let ids = getSelectedIds(select); return ids[0] == "two" && ids[1] == "three"; }, "Got correct selected children"); } );