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