Index: third_party/WebKit/LayoutTests/inspector-protocol/worker/worker-console.js |
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/worker/worker-console.js b/third_party/WebKit/LayoutTests/inspector-protocol/worker/worker-console.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a294421df86a8137e569a2122f59e50ec219b57c |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/worker/worker-console.js |
@@ -0,0 +1,244 @@ |
+(async function(testRunner) { |
+ let {page, session, dp} = await testRunner.startBlank(''); |
+ |
+ await session.evaluate(` |
+ var worker = null; |
+ var onMessageCallbacks = {}; |
+ |
+ function startWorker() { |
+ var callback; |
+ var promise = new Promise((fulfill) => callback = fulfill); |
+ worker = new Worker('${testRunner.url('../resources/worker-console-worker.js')}'); |
+ worker.onmessage = function(event) { |
+ worker.onmessage = onMessageFromWorker; |
+ callback(); |
+ }; |
+ return promise; |
+ } |
+ |
+ function logInWorkerFromPage(message, callback) { |
+ onMessageCallbacks[message] = callback; |
+ worker.postMessage(message); |
+ } |
+ |
+ function onMessageFromWorker(event) { |
+ var callback = onMessageCallbacks[event.data]; |
+ delete onMessageCallbacks[event.data]; |
+ if (callback) |
+ callback(); |
+ } |
+ |
+ function stopWorker() { |
+ worker.terminate(); |
+ worker = null; |
+ } |
+ `); |
+ |
+ var workerEventHandler = {}; |
+ dp.Target.onAttachedToTarget(onWorkerCreated); |
+ dp.Target.onReceivedMessageFromTarget(onWorkerMessage); |
+ workerEventHandler['Runtime.consoleAPICalled'] = onConsoleAPICalledFromWorker; |
+ |
+ var workerId; |
+ |
+ function onWorkerCreated(payload) { |
+ testRunner.log('Worker.created'); |
+ workerId = payload.params.targetInfo.targetId; |
+ } |
+ |
+ var requestId = 0; |
+ var dispatchTable = []; |
+ |
+ function sendCommandToWorker(method, params, callback) { |
+ dispatchTable[++requestId] = callback; |
+ var messageObject = { |
+ 'method': method, |
+ 'params': params, |
+ 'id': requestId |
+ }; |
+ dp.Target.sendMessageToTarget({ |
+ targetId: workerId, |
+ message: JSON.stringify(messageObject) |
+ }); |
+ } |
+ |
+ function onWorkerMessage(payload) { |
+ if (payload.params.targetId !== workerId) |
+ testRunner.log('targetId mismatch'); |
+ var messageObject = JSON.parse(payload.params.message); |
+ var messageId = messageObject['id']; |
+ if (typeof messageId === 'number') { |
+ var handler = dispatchTable[messageId]; |
+ dispatchTable[messageId] = null; |
+ if (handler && typeof handler === 'function') |
+ handler(messageObject); |
+ } else { |
+ var eventName = messageObject['method']; |
+ var eventHandler = workerEventHandler[eventName]; |
+ if (eventHandler) |
+ eventHandler(messageObject); |
+ } |
+ } |
+ |
+ function logInWorker(message, next) { |
+ testRunner.log('Logging in worker: ' + message); |
+ dp.Log.onEntryAdded(onLogEntry); |
+ session.evaluate('logInWorkerFromPage(\'' + message + '\')'); |
+ |
+ function onLogEntry(payload) { |
+ testRunner.log('Got log message from page: ' + payload.params.entry.text); |
+ dp.Log.offEntryAdded(onLogEntry); |
+ next(); |
+ } |
+ } |
+ |
+ var gotMessages = []; |
+ var waitingForMessage; |
+ var waitingForMessageCallback; |
+ |
+ function onConsoleAPICalledFromWorker(payload) { |
+ var message = payload.params.args[0].value; |
+ testRunner.log('Got console API call from worker: ' + message); |
+ gotMessages.push(message); |
+ if (message === waitingForMessage) |
+ waitingForMessageCallback(); |
+ } |
+ |
+ function waitForMessage(message, next) { |
+ if (gotMessages.indexOf(message) !== -1) { |
+ next(); |
+ return; |
+ } |
+ waitingForMessage = message; |
+ waitingForMessageCallback = next; |
+ } |
+ |
+ var steps = [ |
+ function listenToConsole(next) { |
+ dp.Log.enable().then(next); |
+ }, |
+ |
+ function start0(next) { |
+ testRunner.log('Starting worker'); |
+ session.evaluateAsync('startWorker()').then(next); |
+ }, |
+ |
+ function log0(next) { |
+ logInWorker('message0', next); |
+ }, |
+ |
+ function stop0(next) { |
+ testRunner.log('Stopping worker'); |
+ session.evaluate('stopWorker()').then(next); |
+ }, |
+ |
+ function start1(next) { |
+ testRunner.log('Starting worker'); |
+ session.evaluateAsync('startWorker()').then(next); |
+ }, |
+ |
+ function log1(next) { |
+ logInWorker('message1', next); |
+ }, |
+ |
+ function enable1(next) { |
+ testRunner.log('Starting autoattach'); |
+ dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false}).then(next); |
+ }, |
+ |
+ function consoleEnable1(next) { |
+ testRunner.log('Sending Runtime.enable to worker'); |
+ waitForMessage('message1', next); |
+ sendCommandToWorker('Runtime.enable', {}); |
+ }, |
+ |
+ function log2(next) { |
+ logInWorker('message2', next); |
+ }, |
+ |
+ function waitForMessage2(next) { |
+ waitForMessage('message2', next); |
+ }, |
+ |
+ function throw1(next) { |
+ logInWorker('throw1', next); |
+ }, |
+ |
+ function disable1(next) { |
+ testRunner.log('Stopping autoattach'); |
+ dp.Target.setAutoAttach({autoAttach: false, waitForDebuggerOnStart: false}).then(next); |
+ }, |
+ |
+ function log3(next) { |
+ logInWorker('message3', next); |
+ }, |
+ |
+ function stop1(next) { |
+ testRunner.log('Stopping worker'); |
+ session.evaluate('stopWorker()').then(next); |
+ }, |
+ |
+ function enable2(next) { |
+ testRunner.log('Starting autoattach'); |
+ dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false}).then(next); |
+ }, |
+ |
+ function start2(next) { |
+ testRunner.log('Starting worker'); |
+ session.evaluateAsync('startWorker()').then(next); |
+ }, |
+ |
+ function log4(next) { |
+ logInWorker('message4', next); |
+ }, |
+ |
+ function consoleEnable2(next) { |
+ testRunner.log('Sending Runtime.enable to worker'); |
+ waitForMessage('message4', next); |
+ sendCommandToWorker('Runtime.enable', {}); |
+ }, |
+ |
+ function log5(next) { |
+ logInWorker('message5', next); |
+ }, |
+ |
+ function waitForMessage5(next) { |
+ waitForMessage('message5', next); |
+ }, |
+ |
+ function stop2(next) { |
+ testRunner.log('Stopping worker'); |
+ session.evaluate('stopWorker()').then(next); |
+ }, |
+ |
+ function start3(next) { |
+ testRunner.log('Starting worker'); |
+ session.evaluateAsync('startWorker()').then(next); |
+ }, |
+ |
+ function log6(next) { |
+ logInWorker('message6', next); |
+ }, |
+ |
+ function stop3(next) { |
+ testRunner.log('Stopping worker'); |
+ session.evaluate('stopWorker()').then(next); |
+ }, |
+ |
+ function disable2(next) { |
+ testRunner.log('Stopping autoattach'); |
+ dp.Target.setAutoAttach({autoAttach: false, waitForDebuggerOnStart: false}).then(next); |
+ } |
+ ]; |
+ |
+ function runNextStep() { |
+ if (!steps.length) { |
+ testRunner.completeTest(); |
+ return; |
+ } |
+ var nextStep = steps.shift(); |
+ nextStep(runNextStep); |
+ } |
+ |
+ runNextStep(); |
+}) |