88 lines
2.7 KiB
JavaScript
88 lines
2.7 KiB
JavaScript
/* 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";
|
|
|
|
/* exported testMultiSelectable */
|
|
|
|
// Load the shared-head file first.
|
|
Services.scriptloader.loadSubScript(
|
|
"chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js",
|
|
this
|
|
);
|
|
|
|
// Loading and common.js from accessible/tests/mochitest/ for all tests, as
|
|
// well as promisified-events.js.
|
|
/* import-globals-from ../../mochitest/selectable.js */
|
|
/* import-globals-from ../../mochitest/states.js */
|
|
loadScripts(
|
|
{ name: "common.js", dir: MOCHITESTS_DIR },
|
|
{ name: "promisified-events.js", dir: MOCHITESTS_DIR },
|
|
{ name: "selectable.js", dir: MOCHITESTS_DIR },
|
|
{ name: "states.js", dir: MOCHITESTS_DIR },
|
|
{ name: "role.js", dir: MOCHITESTS_DIR }
|
|
);
|
|
|
|
// Handle case where multiple selection change events are coalesced into
|
|
// a SELECTION_WITHIN event. Promise resolves to true in that case.
|
|
function multipleSelectionChanged(widget, changedChildren, selected) {
|
|
return Promise.race([
|
|
Promise.all(
|
|
changedChildren.map(id =>
|
|
waitForStateChange(id, STATE_SELECTED, selected)
|
|
)
|
|
).then(() => false),
|
|
waitForEvent(EVENT_SELECTION_WITHIN, widget).then(() => true),
|
|
]);
|
|
}
|
|
|
|
async function testMultiSelectable(widget, selectableChildren, msg = "") {
|
|
let isRemote = false;
|
|
try {
|
|
widget.DOMNode;
|
|
} catch (e) {
|
|
isRemote = true;
|
|
}
|
|
|
|
testSelectableSelection(widget, [], `${msg}: initial`);
|
|
|
|
let promise = waitForStateChange(selectableChildren[0], STATE_SELECTED, true);
|
|
widget.addItemToSelection(0);
|
|
await promise;
|
|
testSelectableSelection(
|
|
widget,
|
|
[selectableChildren[0]],
|
|
`${msg}: addItemToSelection(0)`
|
|
);
|
|
|
|
promise = waitForStateChange(selectableChildren[0], STATE_SELECTED, false);
|
|
widget.removeItemFromSelection(0);
|
|
await promise;
|
|
testSelectableSelection(widget, [], `${msg}: removeItemFromSelection(0)`);
|
|
|
|
promise = multipleSelectionChanged(widget, selectableChildren, true);
|
|
let success = widget.selectAll();
|
|
ok(success, `${msg}: selectAll success`);
|
|
await promise;
|
|
if (isRemote) {
|
|
await untilCacheIs(
|
|
() => widget.selectedItemCount,
|
|
selectableChildren.length,
|
|
"Selection cache updated"
|
|
);
|
|
}
|
|
testSelectableSelection(widget, selectableChildren, `${msg}: selectAll`);
|
|
|
|
promise = multipleSelectionChanged(widget, selectableChildren, false);
|
|
widget.unselectAll();
|
|
await promise;
|
|
if (isRemote) {
|
|
await untilCacheIs(
|
|
() => widget.selectedItemCount,
|
|
0,
|
|
"Selection cache updated"
|
|
);
|
|
}
|
|
testSelectableSelection(widget, [], `${msg}: selectAll`);
|
|
}
|