summaryrefslogtreecommitdiffstats
path: root/accessible/tests/mochitest/selectable.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--accessible/tests/mochitest/selectable.js138
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);
+ }
+}