tor-browser

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

head.js (2111B)


      1 function pushPrefs(...aPrefs) {
      2  return SpecialPowers.pushPrefEnv({ set: aPrefs });
      3 }
      4 
      5 function promiseWaitForEvent(
      6  object,
      7  eventName,
      8  capturing = false,
      9  chrome = false
     10 ) {
     11  return new Promise(resolve => {
     12    function listener(event) {
     13      info("Saw " + eventName);
     14      object.removeEventListener(eventName, listener, capturing, chrome);
     15      resolve(event);
     16    }
     17 
     18    info("Waiting for " + eventName);
     19    object.addEventListener(eventName, listener, capturing, chrome);
     20  });
     21 }
     22 
     23 /**
     24 * Waits for the next load to complete in any browser or the given browser.
     25 * If a <tabbrowser> is given it waits for a load in any of its browsers.
     26 *
     27 * @return promise
     28 */
     29 function waitForDocLoadComplete(aBrowser = gBrowser) {
     30  return new Promise(resolve => {
     31    let listener = {
     32      onStateChange(webProgress, req, flags, status) {
     33        let docStop =
     34          Ci.nsIWebProgressListener.STATE_IS_NETWORK |
     35          Ci.nsIWebProgressListener.STATE_STOP;
     36        info(
     37          "Saw state " +
     38            flags.toString(16) +
     39            " and status " +
     40            status.toString(16)
     41        );
     42        // When a load needs to be retargetted to a new process it is cancelled
     43        // with NS_BINDING_ABORTED so ignore that case
     44        if ((flags & docStop) == docStop && status != Cr.NS_BINDING_ABORTED) {
     45          aBrowser.removeProgressListener(this);
     46          waitForDocLoadComplete.listeners.delete(this);
     47          let chan = req.QueryInterface(Ci.nsIChannel);
     48          info("Browser loaded " + chan.originalURI.spec);
     49          resolve();
     50        }
     51      },
     52      QueryInterface: ChromeUtils.generateQI([
     53        "nsIWebProgressListener",
     54        "nsISupportsWeakReference",
     55      ]),
     56    };
     57    aBrowser.addProgressListener(listener);
     58    waitForDocLoadComplete.listeners.add(listener);
     59    info("Waiting for browser load");
     60  });
     61 }
     62 // Keep a set of progress listeners for waitForDocLoadComplete() to make sure
     63 // they're not GC'ed before we saw the page load.
     64 waitForDocLoadComplete.listeners = new Set();
     65 registerCleanupFunction(() => waitForDocLoadComplete.listeners.clear());