127 lines
5.7 KiB
HTML
127 lines
5.7 KiB
HTML
<!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.JavaScriptBreakpoint(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>
|