OLD | NEW |
(Empty) | |
| 1 (async function(testRunner) { |
| 2 let {page, session, dp} = await testRunner.startBlank(''); |
| 3 |
| 4 await session.evaluate(` |
| 5 var worker = null; |
| 6 var onMessageCallbacks = {}; |
| 7 |
| 8 function startWorker() { |
| 9 var callback; |
| 10 var promise = new Promise((fulfill) => callback = fulfill); |
| 11 worker = new Worker('${testRunner.url('../resources/worker-console-worker.
js')}'); |
| 12 worker.onmessage = function(event) { |
| 13 worker.onmessage = onMessageFromWorker; |
| 14 callback(); |
| 15 }; |
| 16 return promise; |
| 17 } |
| 18 |
| 19 function logInWorkerFromPage(message, callback) { |
| 20 onMessageCallbacks[message] = callback; |
| 21 worker.postMessage(message); |
| 22 } |
| 23 |
| 24 function onMessageFromWorker(event) { |
| 25 var callback = onMessageCallbacks[event.data]; |
| 26 delete onMessageCallbacks[event.data]; |
| 27 if (callback) |
| 28 callback(); |
| 29 } |
| 30 |
| 31 function stopWorker() { |
| 32 worker.terminate(); |
| 33 worker = null; |
| 34 } |
| 35 `); |
| 36 |
| 37 var workerEventHandler = {}; |
| 38 dp.Target.onAttachedToTarget(onWorkerCreated); |
| 39 dp.Target.onReceivedMessageFromTarget(onWorkerMessage); |
| 40 workerEventHandler['Runtime.consoleAPICalled'] = onConsoleAPICalledFromWorker; |
| 41 |
| 42 var workerId; |
| 43 |
| 44 function onWorkerCreated(payload) { |
| 45 testRunner.log('Worker.created'); |
| 46 workerId = payload.params.targetInfo.targetId; |
| 47 } |
| 48 |
| 49 var requestId = 0; |
| 50 var dispatchTable = []; |
| 51 |
| 52 function sendCommandToWorker(method, params, callback) { |
| 53 dispatchTable[++requestId] = callback; |
| 54 var messageObject = { |
| 55 'method': method, |
| 56 'params': params, |
| 57 'id': requestId |
| 58 }; |
| 59 dp.Target.sendMessageToTarget({ |
| 60 targetId: workerId, |
| 61 message: JSON.stringify(messageObject) |
| 62 }); |
| 63 } |
| 64 |
| 65 function onWorkerMessage(payload) { |
| 66 if (payload.params.targetId !== workerId) |
| 67 testRunner.log('targetId mismatch'); |
| 68 var messageObject = JSON.parse(payload.params.message); |
| 69 var messageId = messageObject['id']; |
| 70 if (typeof messageId === 'number') { |
| 71 var handler = dispatchTable[messageId]; |
| 72 dispatchTable[messageId] = null; |
| 73 if (handler && typeof handler === 'function') |
| 74 handler(messageObject); |
| 75 } else { |
| 76 var eventName = messageObject['method']; |
| 77 var eventHandler = workerEventHandler[eventName]; |
| 78 if (eventHandler) |
| 79 eventHandler(messageObject); |
| 80 } |
| 81 } |
| 82 |
| 83 function logInWorker(message, next) { |
| 84 testRunner.log('Logging in worker: ' + message); |
| 85 dp.Log.onEntryAdded(onLogEntry); |
| 86 session.evaluate('logInWorkerFromPage(\'' + message + '\')'); |
| 87 |
| 88 function onLogEntry(payload) { |
| 89 testRunner.log('Got log message from page: ' + payload.params.entry.text); |
| 90 dp.Log.offEntryAdded(onLogEntry); |
| 91 next(); |
| 92 } |
| 93 } |
| 94 |
| 95 var gotMessages = []; |
| 96 var waitingForMessage; |
| 97 var waitingForMessageCallback; |
| 98 |
| 99 function onConsoleAPICalledFromWorker(payload) { |
| 100 var message = payload.params.args[0].value; |
| 101 testRunner.log('Got console API call from worker: ' + message); |
| 102 gotMessages.push(message); |
| 103 if (message === waitingForMessage) |
| 104 waitingForMessageCallback(); |
| 105 } |
| 106 |
| 107 function waitForMessage(message, next) { |
| 108 if (gotMessages.indexOf(message) !== -1) { |
| 109 next(); |
| 110 return; |
| 111 } |
| 112 waitingForMessage = message; |
| 113 waitingForMessageCallback = next; |
| 114 } |
| 115 |
| 116 var steps = [ |
| 117 function listenToConsole(next) { |
| 118 dp.Log.enable().then(next); |
| 119 }, |
| 120 |
| 121 function start0(next) { |
| 122 testRunner.log('Starting worker'); |
| 123 session.evaluateAsync('startWorker()').then(next); |
| 124 }, |
| 125 |
| 126 function log0(next) { |
| 127 logInWorker('message0', next); |
| 128 }, |
| 129 |
| 130 function stop0(next) { |
| 131 testRunner.log('Stopping worker'); |
| 132 session.evaluate('stopWorker()').then(next); |
| 133 }, |
| 134 |
| 135 function start1(next) { |
| 136 testRunner.log('Starting worker'); |
| 137 session.evaluateAsync('startWorker()').then(next); |
| 138 }, |
| 139 |
| 140 function log1(next) { |
| 141 logInWorker('message1', next); |
| 142 }, |
| 143 |
| 144 function enable1(next) { |
| 145 testRunner.log('Starting autoattach'); |
| 146 dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false})
.then(next); |
| 147 }, |
| 148 |
| 149 function consoleEnable1(next) { |
| 150 testRunner.log('Sending Runtime.enable to worker'); |
| 151 waitForMessage('message1', next); |
| 152 sendCommandToWorker('Runtime.enable', {}); |
| 153 }, |
| 154 |
| 155 function log2(next) { |
| 156 logInWorker('message2', next); |
| 157 }, |
| 158 |
| 159 function waitForMessage2(next) { |
| 160 waitForMessage('message2', next); |
| 161 }, |
| 162 |
| 163 function throw1(next) { |
| 164 logInWorker('throw1', next); |
| 165 }, |
| 166 |
| 167 function disable1(next) { |
| 168 testRunner.log('Stopping autoattach'); |
| 169 dp.Target.setAutoAttach({autoAttach: false, waitForDebuggerOnStart: false}
).then(next); |
| 170 }, |
| 171 |
| 172 function log3(next) { |
| 173 logInWorker('message3', next); |
| 174 }, |
| 175 |
| 176 function stop1(next) { |
| 177 testRunner.log('Stopping worker'); |
| 178 session.evaluate('stopWorker()').then(next); |
| 179 }, |
| 180 |
| 181 function enable2(next) { |
| 182 testRunner.log('Starting autoattach'); |
| 183 dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false})
.then(next); |
| 184 }, |
| 185 |
| 186 function start2(next) { |
| 187 testRunner.log('Starting worker'); |
| 188 session.evaluateAsync('startWorker()').then(next); |
| 189 }, |
| 190 |
| 191 function log4(next) { |
| 192 logInWorker('message4', next); |
| 193 }, |
| 194 |
| 195 function consoleEnable2(next) { |
| 196 testRunner.log('Sending Runtime.enable to worker'); |
| 197 waitForMessage('message4', next); |
| 198 sendCommandToWorker('Runtime.enable', {}); |
| 199 }, |
| 200 |
| 201 function log5(next) { |
| 202 logInWorker('message5', next); |
| 203 }, |
| 204 |
| 205 function waitForMessage5(next) { |
| 206 waitForMessage('message5', next); |
| 207 }, |
| 208 |
| 209 function stop2(next) { |
| 210 testRunner.log('Stopping worker'); |
| 211 session.evaluate('stopWorker()').then(next); |
| 212 }, |
| 213 |
| 214 function start3(next) { |
| 215 testRunner.log('Starting worker'); |
| 216 session.evaluateAsync('startWorker()').then(next); |
| 217 }, |
| 218 |
| 219 function log6(next) { |
| 220 logInWorker('message6', next); |
| 221 }, |
| 222 |
| 223 function stop3(next) { |
| 224 testRunner.log('Stopping worker'); |
| 225 session.evaluate('stopWorker()').then(next); |
| 226 }, |
| 227 |
| 228 function disable2(next) { |
| 229 testRunner.log('Stopping autoattach'); |
| 230 dp.Target.setAutoAttach({autoAttach: false, waitForDebuggerOnStart: false}
).then(next); |
| 231 } |
| 232 ]; |
| 233 |
| 234 function runNextStep() { |
| 235 if (!steps.length) { |
| 236 testRunner.completeTest(); |
| 237 return; |
| 238 } |
| 239 var nextStep = steps.shift(); |
| 240 nextStep(runNextStep); |
| 241 } |
| 242 |
| 243 runNextStep(); |
| 244 }) |
OLD | NEW |