tor-browser

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

head.js (2621B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 /**
      5 * Waits for the next load to complete in any browser or the given browser.
      6 * If a <tabbrowser> is given it waits for a load in any of its browsers.
      7 *
      8 * @return promise
      9 */
     10 function waitForDocLoadComplete(aBrowser = gBrowser) {
     11  return new Promise(resolve => {
     12    let listener = {
     13      onStateChange(webProgress, req, flags, status) {
     14        let docStop =
     15          Ci.nsIWebProgressListener.STATE_IS_NETWORK |
     16          Ci.nsIWebProgressListener.STATE_STOP;
     17        info(
     18          "Saw state " +
     19            flags.toString(16) +
     20            " and status " +
     21            status.toString(16)
     22        );
     23 
     24        // When a load needs to be retargetted to a new process it is cancelled
     25        // with NS_BINDING_ABORTED so ignore that case
     26        if ((flags & docStop) == docStop && status != Cr.NS_BINDING_ABORTED) {
     27          aBrowser.removeProgressListener(this);
     28          waitForDocLoadComplete.listeners.delete(this);
     29 
     30          let chan = req.QueryInterface(Ci.nsIChannel);
     31          info("Browser loaded " + chan.originalURI.spec);
     32          resolve();
     33        }
     34      },
     35      QueryInterface: ChromeUtils.generateQI([
     36        "nsIWebProgressListener",
     37        "nsISupportsWeakReference",
     38      ]),
     39    };
     40    aBrowser.addProgressListener(listener);
     41    waitForDocLoadComplete.listeners.add(listener);
     42    info("Waiting for browser load");
     43  });
     44 }
     45 
     46 function setupMockAlertsService(expectedObj) {
     47  const alertsService = {
     48    showAlert: (alert, clickCallback) => {
     49      // We need to invoke the event handler ourselves.
     50      clickCallback(null, "alertshow", null);
     51 
     52      // check the expectations, if passed in
     53      if (expectedObj) {
     54        expectedObj.title && Assert.equal(alert.title, expectedObj.title);
     55        expectedObj.body && Assert.equal(alert.text, expectedObj.body);
     56      }
     57 
     58      // We are invoking the event handler ourselves directly.
     59      clickCallback(null, "alertclickcallback", null);
     60      clickCallback(null, "alertfinished", null);
     61    },
     62  };
     63  const { AccountsGlue } = ChromeUtils.importESModule(
     64    "resource:///modules/AccountsGlue.sys.mjs"
     65  );
     66  const wrappedService = { wrappedJSObject: alertsService };
     67  AccountsGlue.observe(
     68    wrappedService,
     69    "browser-glue-test",
     70    "mock-alerts-service"
     71  );
     72 }
     73 
     74 // Keep a set of progress listeners for waitForDocLoadComplete() to make sure
     75 // they're not GC'ed before we saw the page load.
     76 waitForDocLoadComplete.listeners = new Set();
     77 registerCleanupFunction(() => waitForDocLoadComplete.listeners.clear());