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());