tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }