| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script src="../debugger/resources/log-pause-location.js"></script> |
| <script src="resources/worker-utilities.js"></script> |
| <script> |
| TestPage.allowUncaughtExceptions = true; |
| TestPage.needToSanitizeUncaughtExceptionURLs = true; |
| |
| let worker = new Worker("resources/worker-debugger-pause.js"); |
| |
| function test() |
| { |
| let workerTarget = Array.from(WI.targets).find((target) => target.type === WI.TargetType.Worker); |
| let workerDebuggerData = WI.debuggerManager.dataForTarget(workerTarget); |
| if (!workerTarget) { |
| InspectorTest.fail("Missing Worker Target"); |
| InspectorTest.completeTest(); |
| return; |
| } |
| |
| // In each test, the Worker pauses and the Main Thread is waiting to |
| // pause on the next statement. Do an InspectorTest.log, which evaluates |
| // JavaScript in the page and should pause. Then later run work. |
| // In WebKit1, because the VM is shared between the inspector and |
| // inspected page we need to put an artificial break between our |
| // Inspector JavaScript, the Page JavaScript, and back to the Inspector. |
| function pauseTheMainThread() { |
| return new Promise((resolve, reject) => { |
| setTimeout(() => { |
| InspectorTest.log(""); |
| setTimeout(resolve); |
| }); |
| }); |
| } |
| |
| WI.debuggerManager.uncaughtExceptionsBreakpoint.disabled = false; |
| WI.debuggerManager.assertionFailuresBreakpoint.disabled = false; |
| |
| |
| let suite = InspectorTest.createAsyncSuite("Worker.Debugger.Pause"); |
| |
| suite.addTestCase({ |
| name: "Worker.Debugger.Pause.DebuggerStatement", |
| description: "Worker should pause on debugger statement.", |
| test(resolve, reject) { |
| InspectorTest.evaluateInPage(`worker.postMessage("triggerDebuggerStatement")`); |
| WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => { |
| pauseTheMainThread().then(() => { |
| InspectorTest.pass("Paused"); |
| InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame."); |
| InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.DebuggerStatement, "Pause reason should be a debugger statement."); |
| logPauseLocation(); |
| WI.debuggerManager.resume().then(resolve, reject); |
| }); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "Worker.Debugger.Pause.Breakpoint", |
| description: "Worker should pause on breakpoint.", |
| test(resolve, reject) { |
| let location = workerTarget.mainResource.createSourceCodeLocation(8, 0); |
| let breakpoint = new WI.Breakpoint(location); |
| WI.debuggerManager.addBreakpoint(breakpoint); |
| InspectorTest.evaluateInPage(`worker.postMessage("triggerBreakpoint")`); |
| WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => { |
| pauseTheMainThread().then(() => { |
| InspectorTest.pass("Paused"); |
| InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame."); |
| InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.Breakpoint, "Pause reason should be a breakpoint."); |
| logPauseLocation(); |
| WI.debuggerManager.resume().then(resolve, reject); |
| }); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "Worker.Debugger.Pause.Exception", |
| description: "Worker should pause on exception.", |
| test(resolve, reject) { |
| InspectorTest.evaluateInPage(`worker.postMessage("triggerException")`); |
| WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => { |
| pauseTheMainThread().then(() => { |
| InspectorTest.pass("Paused"); |
| InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame."); |
| InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.Exception, "Pause reason should be an exception."); |
| logPauseLocation(); |
| WI.debuggerManager.resume().then(resolve, reject); |
| }); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "Worker.Debugger.Pause.Assert", |
| description: "Worker should pause on assert.", |
| test(resolve, reject) { |
| InspectorTest.evaluateInPage(`worker.postMessage("triggerAssertion")`); |
| WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => { |
| pauseTheMainThread().then(() => { |
| InspectorTest.pass("Paused"); |
| InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame."); |
| InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.Assertion, "Pause reason should be an exception."); |
| logPauseLocation(); |
| WI.debuggerManager.resume().then(resolve, reject); |
| }); |
| }); |
| } |
| }); |
| |
| awaitTargetMainResource(workerTarget).then(() => { |
| window.loadLinesFromSourceCode(workerTarget.mainResource).then(() => { |
| suite.runTestCasesAndFinish(); |
| }); |
| }); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Ensure we can pause in Workers.</p> |
| </body> |
| </html> |