1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
/* 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`);
}
|