diff options
Diffstat (limited to '')
-rw-r--r-- | accessible/tests/mochitest/selectable.js | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/accessible/tests/mochitest/selectable.js b/accessible/tests/mochitest/selectable.js new file mode 100644 index 0000000000..43c7260b0a --- /dev/null +++ b/accessible/tests/mochitest/selectable.js @@ -0,0 +1,138 @@ +/* import-globals-from common.js */ +/* import-globals-from states.js */ + +/** + * Test selection getter methods of nsIAccessibleSelectable. + * + * @param aIdentifier [in] selectable container accessible + * @param aSelectedChildren [in] array of selected children + */ +function testSelectableSelection(aIdentifier, aSelectedChildren, aMsg) { + var acc = getAccessible(aIdentifier, [nsIAccessibleSelectable]); + if (!acc) { + return; + } + + var msg = aMsg ? aMsg : ""; + var len = aSelectedChildren.length; + + // getSelectedChildren + var selectedChildren = acc.selectedItems; + is( + selectedChildren ? selectedChildren.length : 0, + len, + msg + + "getSelectedChildren: wrong selected children count for " + + prettyName(aIdentifier) + ); + + for (let idx = 0; idx < len; idx++) { + let expectedAcc = aSelectedChildren[idx]; + let expectedAccId = + expectedAcc instanceof nsIAccessible + ? getAccessibleDOMNodeID(expectedAcc) + : expectedAcc; + let actualAcc = selectedChildren.queryElementAt(idx, nsIAccessible); + let actualAccId = getAccessibleDOMNodeID(actualAcc); + is( + actualAccId, + expectedAccId, + msg + + "getSelectedChildren: wrong selected child at index " + + idx + + " for " + + prettyName(aIdentifier) + + " { actual : " + + prettyName(actualAcc) + + ", expected: " + + prettyName(expectedAcc) + + "}" + ); + } + + // selectedItemCount + is( + acc.selectedItemCount, + aSelectedChildren.length, + "selectedItemCount: wrong selected children count for " + + prettyName(aIdentifier) + ); + + // getSelectedItemAt + for (let idx = 0; idx < len; idx++) { + let expectedAcc = aSelectedChildren[idx]; + let expectedAccId = + expectedAcc instanceof nsIAccessible + ? getAccessibleDOMNodeID(expectedAcc) + : expectedAcc; + is( + getAccessibleDOMNodeID(acc.getSelectedItemAt(idx)), + expectedAccId, + msg + + "getSelectedItemAt: wrong selected child at index " + + idx + + " for " + + prettyName(aIdentifier) + ); + } + + // isItemSelected + testIsItemSelected(acc, acc, { value: 0 }, aSelectedChildren, msg); +} + +/** + * Test isItemSelected method, helper for testSelectableSelection + */ +function testIsItemSelected( + aSelectAcc, + aTraversedAcc, + aIndexObj, + aSelectedChildren, + aMsg +) { + var childCount = aTraversedAcc.childCount; + for (var idx = 0; idx < childCount; idx++) { + var child = aTraversedAcc.getChildAt(idx); + var [state /* extraState */] = getStates(child); + if (state & STATE_SELECTABLE) { + var isSelected = false; + var len = aSelectedChildren.length; + for (var jdx = 0; jdx < len; jdx++) { + let expectedAcc = aSelectedChildren[jdx]; + let matches = + expectedAcc instanceof nsIAccessible + ? child == expectedAcc + : getAccessibleDOMNodeID(child) == expectedAcc; + + if (matches) { + isSelected = true; + break; + } + } + + // isItemSelected + is( + aSelectAcc.isItemSelected(aIndexObj.value++), + isSelected, + aMsg + + "isItemSelected: wrong selected child " + + prettyName(child) + + " for " + + prettyName(aSelectAcc) + ); + + // selected state + testStates( + child, + isSelected ? STATE_SELECTED : 0, + 0, + !isSelected ? STATE_SELECTED : 0, + 0 + ); + + continue; + } + + testIsItemSelected(aSelectAcc, child, aIndexObj, aSelectedChildren); + } +} |