head.js (2739B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 /* exported testMultiSelectable */ 8 9 // Load the shared-head file first. 10 Services.scriptloader.loadSubScript( 11 "chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js", 12 this 13 ); 14 15 // Loading and common.js from accessible/tests/mochitest/ for all tests, as 16 // well as promisified-events.js. 17 /* import-globals-from ../../mochitest/selectable.js */ 18 /* import-globals-from ../../mochitest/states.js */ 19 loadScripts( 20 { name: "common.js", dir: MOCHITESTS_DIR }, 21 { name: "promisified-events.js", dir: MOCHITESTS_DIR }, 22 { name: "selectable.js", dir: MOCHITESTS_DIR }, 23 { name: "states.js", dir: MOCHITESTS_DIR }, 24 { name: "role.js", dir: MOCHITESTS_DIR } 25 ); 26 27 // Handle case where multiple selection change events are coalesced into 28 // a SELECTION_WITHIN event. Promise resolves to true in that case. 29 function multipleSelectionChanged(widget, changedChildren, selected) { 30 return Promise.race([ 31 Promise.all( 32 changedChildren.map(id => 33 waitForStateChange(id, STATE_SELECTED, selected) 34 ) 35 ).then(() => false), 36 waitForEvent(EVENT_SELECTION_WITHIN, widget).then(() => true), 37 ]); 38 } 39 40 async function testMultiSelectable(widget, selectableChildren, msg = "") { 41 let isRemote = false; 42 try { 43 widget.DOMNode; 44 } catch (e) { 45 isRemote = true; 46 } 47 48 testSelectableSelection(widget, [], `${msg}: initial`); 49 50 let promise = waitForStateChange(selectableChildren[0], STATE_SELECTED, true); 51 widget.addItemToSelection(0); 52 await promise; 53 testSelectableSelection( 54 widget, 55 [selectableChildren[0]], 56 `${msg}: addItemToSelection(0)` 57 ); 58 59 promise = waitForStateChange(selectableChildren[0], STATE_SELECTED, false); 60 widget.removeItemFromSelection(0); 61 await promise; 62 testSelectableSelection(widget, [], `${msg}: removeItemFromSelection(0)`); 63 64 promise = multipleSelectionChanged(widget, selectableChildren, true); 65 let success = widget.selectAll(); 66 ok(success, `${msg}: selectAll success`); 67 await promise; 68 if (isRemote) { 69 await untilCacheIs( 70 () => widget.selectedItemCount, 71 selectableChildren.length, 72 "Selection cache updated" 73 ); 74 } 75 testSelectableSelection(widget, selectableChildren, `${msg}: selectAll`); 76 77 promise = multipleSelectionChanged(widget, selectableChildren, false); 78 widget.unselectAll(); 79 await promise; 80 if (isRemote) { 81 await untilCacheIs( 82 () => widget.selectedItemCount, 83 0, 84 "Selection cache updated" 85 ); 86 } 87 testSelectableSelection(widget, [], `${msg}: selectAll`); 88 }