<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../debugger/resources/breakpoint-options-utilities.js"></script>
<script src="../debugger/resources/log-active-stack-trace.js"></script>
<script src="resources/dom-breakpoint-utilities.js"></script>
<script>
function testNodeRemovedDirect() {
    let node = document.getElementById("node-removed-direct-test");
    let parent = node.parentNode;
    node.remove();
    parent.appendChild(node);
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("DOMBreakpoint.NodeRemoved");

    suite.addTestCase({
        name: `DOMBreakpoint.NodeRemoved.Direct.BreakpointEnabled`,
        description: "Check that debugger pauses for breakpoint type.",
        async test() {
            let node = await InspectorTest.DOMBreakpoint.awaitQuerySelector("#node-removed-direct-test");

            let breakpoint = await InspectorTest.DOMBreakpoint.createBreakpoint(node, WI.DOMBreakpoint.Type.NodeRemoved);

            let paused = false;
            let pausedListener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                paused = true;

                let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target);
                InspectorTest.log("PAUSED:");
                InspectorTest.expectEqual(targetData.pauseReason, WI.DebuggerManager.PauseReason.DOM, "Pause reason should be DOM.");

                let pauseData = targetData.pauseData;
                InspectorTest.expectEqual(pauseData.type, breakpoint.type, `Pause type should be '${breakpoint.type}'.`);
                InspectorTest.expectEqual(pauseData.nodeId, breakpoint.domNode.id, "Pause nodeId should be expected value.");
                InspectorTest.assert(!("targetNodeId" in pauseData), "Should not have 'targetNodeId'.");
                InspectorTest.assert(!("insertion" in pauseData), "Should not have 'insertion'.");

                logActiveStackTrace();
                WI.debuggerManager.resume();
            });

            await InspectorTest.evaluateInPage(`testNodeRemovedDirect()`);

            InspectorTest.assert(paused, "Should pause.");
            WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
        },
        teardown: InspectorTest.DOMBreakpoint.teardown,
    });

    suite.addTestCase({
        name: `DOMBreakpoint.NodeRemoved.Direct.BreakpointDisabled`,
        description: "Check that debugger does not pause for disabled breakpoint.",
        async test() {
            let paused = false;
            let pausedListener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                paused = true;

                WI.debuggerManager.resume();
            });

            let node = await InspectorTest.DOMBreakpoint.awaitQuerySelector("#node-removed-direct-test");

            let breakpoint = await InspectorTest.DOMBreakpoint.createBreakpoint(node, WI.DOMBreakpoint.Type.NodeRemoved);

            InspectorTest.log("Disabling breakpoint...");
            breakpoint.disabled = true;

            InspectorTest.log("Triggering breakpoint...");
            await InspectorTest.evaluateInPage(`testNodeRemovedDirect()`);

            InspectorTest.expectFalse(paused, "Should not pause for disabled breakpoint.");
            WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
        },
        teardown: InspectorTest.DOMBreakpoint.teardown,
    });

    suite.addTestCase({
        name: `DOMBreakpoint.NodeRemoved.Direct.DebuggerDisabled`,
        description: "Check that debugger does not pause when the debugger is disabled.",
        async test() {
            let paused = false;
            let pausedListener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                paused = true;

                WI.debuggerManager.resume();
            });

            let node = await InspectorTest.DOMBreakpoint.awaitQuerySelector("#node-removed-direct-test");

            await InspectorTest.DOMBreakpoint.createBreakpoint(node, WI.DOMBreakpoint.Type.NodeRemoved);

            InspectorTest.log("Disabling all breakpoints...");
            await DebuggerAgent.setBreakpointsActive(false);

            InspectorTest.log("Triggering breakpoint...");
            await InspectorTest.evaluateInPage(`testNodeRemovedDirect()`);

            InspectorTest.log("Enabling all breakpoints...");
            await DebuggerAgent.setBreakpointsActive(true);

            InspectorTest.expectFalse(paused, "Should not pause when all breakpoints disabled.");
            WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
        },
        teardown: InspectorTest.DOMBreakpoint.teardown,
    });

    suite.addTestCase({
        name: `DOMBreakpoint.NodeRemoved.Direct.RemoveBreakpoint`,
        description: "Check that debugger does not pause for removed breakpoint.",
        async test() {
            let paused = false;
            let pausedListener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                paused = true;

                WI.debuggerManager.resume();
            });

            let node = await InspectorTest.DOMBreakpoint.awaitQuerySelector("#node-removed-direct-test");

            let breakpoint = await InspectorTest.DOMBreakpoint.createBreakpoint(node, WI.DOMBreakpoint.Type.NodeRemoved);

            InspectorTest.log("Removing breakpoint...");
            WI.domDebuggerManager.removeDOMBreakpoint(breakpoint);

            InspectorTest.log("Triggering breakpoint...");
            await InspectorTest.evaluateInPage(`testNodeRemovedDirect()`);

            InspectorTest.expectFalse(paused, "Should not pause for removed breakpoint.");
            WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
        },
        teardown: InspectorTest.DOMBreakpoint.teardown,
    });

    InspectorTest.BreakpointOptions.addTestCases(suite, {
        testCaseNamePrefix: "Direct.",
        async createBreakpoint() {
            let node = await InspectorTest.DOMBreakpoint.awaitQuerySelector("#node-removed-direct-test");
            return InspectorTest.DOMBreakpoint.createBreakpoint(node, WI.DOMBreakpoint.Type.NodeRemoved);
        },
        async triggerBreakpoint(breakpoint) {
            return InspectorTest.evaluateInPage(`testNodeRemovedDirect()`);
        },
        skip: {
            ignoreCount: true,
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for DOM breakpoints.</p>
<div id="test-container" style="display: none">
    <div id="node-removed-direct-test"></div>
</div>
</body>
</html>
    