diff options
Diffstat (limited to 'accessible/tests/browser/windows/uia/browser_relationProps.js')
-rw-r--r-- | accessible/tests/browser/windows/uia/browser_relationProps.js | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/accessible/tests/browser/windows/uia/browser_relationProps.js b/accessible/tests/browser/windows/uia/browser_relationProps.js new file mode 100644 index 0000000000..ff4059f99e --- /dev/null +++ b/accessible/tests/browser/windows/uia/browser_relationProps.js @@ -0,0 +1,143 @@ +/* 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"; + +function testUiaRelationArray(id, prop, targets) { + return isUiaElementArray( + `findUiaByDomId(doc, "${id}").Current${prop}`, + targets, + `${id} has correct ${prop} targets` + ); +} + +/** + * Test the ControllerFor property. + */ +addUiaTask( + ` +<input id="controls" aria-controls="t1 t2"> +<input id="error" aria-errormessage="t3 t4" aria-invalid="true"> +<input id="controlsError" aria-controls="t1 t2" aria-errormessage="t3 t4" aria-invalid="true"> +<div id="t1">t1</div> +<div id="t2">t2</div> +<div id="t3">t3</div> +<div id="t4">t4</div> +<button id="none">none</button> + `, + async function testControllerFor() { + await definePyVar("doc", `getDocUia()`); + await testUiaRelationArray("controls", "ControllerFor", ["t1", "t2"]); + // The IA2 -> UIA proxy doesn't support IA2_RELATION_ERROR. + if (gIsUiaEnabled) { + await testUiaRelationArray("error", "ControllerFor", ["t3", "t4"]); + await testUiaRelationArray("controlsError", "ControllerFor", [ + "t1", + "t2", + "t3", + "t4", + ]); + } + await testUiaRelationArray("none", "ControllerFor", []); + } +); + +/** + * Test the DescribedBy property. + */ +addUiaTask( + ` +<input id="describedby" aria-describedby="t1 t2"> +<input id="details" aria-details="t3 t4"> +<input id="describedbyDetails" aria-describedby="t1 t2" aria-details="t3 t4" aria-invalid="true"> +<div id="t1">t1</div> +<div id="t2">t2</div> +<div id="t3">t3</div> +<div id="t4">t4</div> +<button id="none">none</button> + `, + async function testDescribedBy() { + await definePyVar("doc", `getDocUia()`); + await testUiaRelationArray("describedby", "DescribedBy", ["t1", "t2"]); + // The IA2 -> UIA proxy doesn't support IA2_RELATION_DETAILS. + if (gIsUiaEnabled) { + await testUiaRelationArray("details", "DescribedBy", ["t3", "t4"]); + await testUiaRelationArray("describedbyDetails", "DescribedBy", [ + "t1", + "t2", + "t3", + "t4", + ]); + } + await testUiaRelationArray("none", "DescribedBy", []); + } +); + +/** + * Test the FlowsFrom and FlowsTo properties. + */ +addUiaTask( + ` +<div id="t1" aria-flowto="t2">t1</div> +<div id="t2">t2</div> +<button id="none">none</button> + `, + async function testFlows() { + await definePyVar("doc", `getDocUia()`); + await testUiaRelationArray("t1", "FlowsTo", ["t2"]); + await testUiaRelationArray("t2", "FlowsFrom", ["t1"]); + await testUiaRelationArray("none", "FlowsFrom", []); + await testUiaRelationArray("none", "FlowsTo", []); + } +); + +/** + * Test the LabeledBy property. + */ +addUiaTask( + ` +<label id="label">label</label> +<input id="input" aria-labelledby="label"> +<label id="wrappingLabel"> + <input id="wrappedInput" value="wrappedInput"> + <p id="wrappingLabelP">wrappingLabel</p> +</label> +<button id="button" aria-labelledby="label">content</button> +<button id="noLabel">noLabel</button> + `, + async function testLabeledBy() { + await definePyVar("doc", `getDocUia()`); + // input's LabeledBy should be label's text leaf. + let result = await runPython(` + input = findUiaByDomId(doc, "input") + label = findUiaByDomId(doc, "label") + labelLeaf = uiaClient.RawViewWalker.GetFirstChildElement(label) + return uiaClient.CompareElements(input.CurrentLabeledBy, labelLeaf) + `); + ok(result, "input has correct LabeledBy"); + // wrappedInput's LabeledBy should be wrappingLabelP's text leaf. + result = await runPython(` + wrappedInput = findUiaByDomId(doc, "wrappedInput") + wrappingLabelP = findUiaByDomId(doc, "wrappingLabelP") + wrappingLabelLeaf = uiaClient.RawViewWalker.GetFirstChildElement(wrappingLabelP) + return uiaClient.CompareElements(wrappedInput.CurrentLabeledBy, wrappingLabelLeaf) + `); + ok(result, "wrappedInput has correct LabeledBy"); + // button has aria-labelledby, but UIA prohibits LabeledBy on buttons. + ok( + !(await runPython( + `bool(findUiaByDomId(doc, "button").CurrentLabeledBy)` + )), + "button has no LabeledBy" + ); + ok( + !(await runPython( + `bool(findUiaByDomId(doc, "noLabel").CurrentLabeledBy)` + )), + "noLabel has no LabeledBy" + ); + }, + // The IA2 -> UIA proxy doesn't expose LabeledBy properly. + { uiaEnabled: true, uiaDisabled: false } +); |