<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../debugger/resources/log-active-stack-trace.js"></script>
<script src="resources/dom-debugger-utilities.js"></script>
<script>
function test()
{
    let workerTarget = null;

    let suite = InspectorTest.createAsyncSuite("Worker.DOMDebugger.EventBreakpoint.Listener");

    suite.addTestCase({
        name: "Worker.DOMDebugger.EventBreakpoint.Listener.Basic",
        description: "Check that adding/removing listener event breakpoints work for a Worker target.",
        async test() {
            InspectorTest.assert(workerTarget.DOMDebuggerAgent, "Worker target should have a DOMDebuggerAgent.");
            InspectorTest.assert(workerTarget.DOMDebuggerAgent.setEventBreakpoint, "The Worker's DOMDebuggerAgent should have a setEventBreakpoint command.");
            InspectorTest.assert(workerTarget.DOMDebuggerAgent.removeEventBreakpoint, "The Worker's DOMDebuggerAgent should have a removeEventBreakpoint command.");

            const breakpointType = "listener";
            const eventName = "custom";

            await workerTarget.DOMDebuggerAgent.setEventBreakpoint(breakpointType, eventName);

            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Paused),
                InspectorTest.evaluateInPage(`worker.postMessage("triggerListener")`),
            ]);

            let paused = WI.debuggerManager.paused;

            let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target);
            let pauseReason = targetData.pauseReason;
            let pauseData = targetData.pauseData;

            let stackTrace = getActiveStackTrace();

            await workerTarget.DOMDebuggerAgent.removeEventBreakpoint(breakpointType, eventName);

            await WI.debuggerManager.resume();

            InspectorTest.expectThat(paused, "Should have paused.");
            InspectorTest.expectEqual(pauseReason, WI.DebuggerManager.PauseReason.Listener, "Pause reason should have been Listener.");
            InspectorTest.expectEqual(pauseData.eventName, eventName, `Pause data eventName should have been "${eventName}".`);
            logStackTrace(stackTrace);
        },
    });

    InspectorTest.Worker.DOMDebugger.createWorkerTarget((target) => {
        workerTarget = target;
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
<p>Tests for listener event breakpoint functionality (DOMDebugger) in a Worker.</p>
</body>
</html>
