dom_worker_helper.js (3791B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 const wdm = Cc["@mozilla.org/dom/workers/workerdebuggermanager;1"].getService( 7 Ci.nsIWorkerDebuggerManager 8 ); 9 10 const BASE_URL = "chrome://mochitests/content/chrome/dom/workers/test/"; 11 12 var gRemainingTests = 0; 13 14 function waitForWorkerFinish() { 15 if (gRemainingTests == 0) { 16 SimpleTest.waitForExplicitFinish(); 17 } 18 ++gRemainingTests; 19 } 20 21 function finish() { 22 --gRemainingTests; 23 if (gRemainingTests == 0) { 24 SimpleTest.finish(); 25 } 26 } 27 28 function assertThrows(fun, message) { 29 let throws = false; 30 try { 31 fun(); 32 } catch (e) { 33 throws = true; 34 } 35 ok(throws, message); 36 } 37 38 function generateDebuggers() { 39 return wdm.getWorkerDebuggerEnumerator(); 40 } 41 42 function findDebugger(url) { 43 for (let dbg of generateDebuggers()) { 44 if (dbg.url === url) { 45 return dbg; 46 } 47 } 48 return null; 49 } 50 51 function waitForRegister(url, dbgUrl) { 52 return new Promise(function (resolve) { 53 wdm.addListener({ 54 onRegister(dbg) { 55 if (dbg.url !== url) { 56 return; 57 } 58 ok(true, "Debugger with url " + url + " should be registered."); 59 wdm.removeListener(this); 60 if (dbgUrl) { 61 info("Initializing worker debugger with url " + url + "."); 62 dbg.initialize(dbgUrl); 63 } 64 resolve(dbg); 65 }, 66 }); 67 }); 68 } 69 70 function waitForUnregister(url) { 71 return new Promise(function (resolve) { 72 wdm.addListener({ 73 onUnregister(dbg) { 74 if (dbg.url !== url) { 75 return; 76 } 77 ok(true, "Debugger with url " + url + " should be unregistered."); 78 wdm.removeListener(this); 79 resolve(); 80 }, 81 }); 82 }); 83 } 84 85 function waitForDebuggerClose(dbg) { 86 return new Promise(function (resolve) { 87 dbg.addListener({ 88 onClose() { 89 ok(true, "Debugger should be closed."); 90 dbg.removeListener(this); 91 resolve(); 92 }, 93 }); 94 }); 95 } 96 97 function waitForDebuggerError(dbg) { 98 return new Promise(function (resolve) { 99 dbg.addListener({ 100 onError(filename, lineno, message) { 101 dbg.removeListener(this); 102 resolve(new Error(message, filename, lineno)); 103 }, 104 }); 105 }); 106 } 107 108 function waitForDebuggerMessage(dbg, message) { 109 return new Promise(function (resolve) { 110 dbg.addListener({ 111 onMessage(message1) { 112 if (message !== message1) { 113 return; 114 } 115 ok(true, "Should receive " + message + " message from debugger."); 116 dbg.removeListener(this); 117 resolve(); 118 }, 119 }); 120 }); 121 } 122 123 function waitForWindowMessage(window, message) { 124 return new Promise(function (resolve) { 125 let onmessage = function (event) { 126 // eslint-disable-next-line no-self-compare 127 if (event.data !== event.data) { 128 return; 129 } 130 window.removeEventListener("message", onmessage); 131 resolve(); 132 }; 133 window.addEventListener("message", onmessage); 134 }); 135 } 136 137 function waitForWorkerMessage(worker, message) { 138 return new Promise(function (resolve) { 139 worker.addEventListener("message", function onmessage(event) { 140 if (event.data !== message) { 141 return; 142 } 143 ok(true, "Should receive " + message + " message from worker."); 144 worker.removeEventListener("message", onmessage); 145 resolve(); 146 }); 147 }); 148 } 149 150 function waitForMultiple(promises) { 151 // There used to be old logic which expects promises to be resolved in 152 // succession, but where it seems like this was an incorrect assumption. 153 // Assuming this change sticks, bug 1861778 tracks removing this method 154 // entirely in favor of Promise.all at the call-sites or transform the callers 155 // into explicitly documented awaited sequences. 156 return Promise.all(promises); 157 }