<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function createDetachedNode()
{
    window.__testDetachedNode = document.createElement("div");
    window.__testDetachedNode.id = "script-created-node";
    return window.__testDetachedNode;
}

function insertDetachedNode()
{
    let parentElement = document.getElementById("a");
    parentElement.insertBefore(window.__testDetachedNode, parentElement.firstChild);
}

function removePreviouslyDetachedNode()
{
    window.__testDetachedNode.remove();
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("DOM.attachedNodes");

    async function ensureDocumentSubtree() {
        let documentNode = await WI.domManager.requestDocument();

        const entireSubtreeDepth = -1;
        await WI.assumingMainTarget().DOMAgent.requestChildNodes(documentNode.id, entireSubtreeDepth);
    }

    function logNodes(nodesIterator) {
        InspectorTest.log("Dumping nodes:")
        for (let node of nodesIterator) {
            // Each test adds more content to the DOM tree, but we don't want to clutter test output with those.
            if (node.escapedIdSelector === "#end-of-prewritten-test-content")
                break;
            
            logNode(node);
        }
    }

    function logNode(node) {
        if (node.nodeType() === Node.TEXT_NODE)
            InspectorTest.log("  [text node]");
        else
            InspectorTest.log("  " + node.unescapedSelector);
    }

    suite.addTestCase({
        name: "DOM.attachedNodes.Unfiltered",
        description: "Ensure that `attachedNodes` provides a correctly ordered list of all attached DOM nodes.",
        async test() {
            await ensureDocumentSubtree();
            logNodes(WI.domManager.attachedNodes());
        }
    });

    suite.addTestCase({
        name: "DOM.attachedNodes.Filtered",
        description: "Ensure that `attachedNodes` correctly filters nodes.",
        async test() {
            await ensureDocumentSubtree();
            logNodes(WI.domManager.attachedNodes({filter: (node) => node.nodeNameInCorrectCase() === "div"}));
        }
    });

    suite.addTestCase({
        name: "DOM.attachedNodes.DetachedNode",
        description: "Ensure that `attachedNodes` provides a correctly ordered list of all attached DOM nodes, and ignored detached nodes that are known to the backend.",
        async test() {
            await ensureDocumentSubtree();

            InspectorTest.log("Creating detached node...");
            let detachedNodeRemoteObject = await InspectorTest.evaluateInPage(`createDetachedNode()`);
            let detachedNodeId = (await WI.assumingMainTarget().DOMAgent.requestNode(detachedNodeRemoteObject.objectId)).nodeId;
            let detachedNode = WI.domManager.nodeForId(detachedNodeId);
            InspectorTest.log("Created detached node: " + detachedNode.unescapedSelector);

            logNodes(WI.domManager.attachedNodes());

            InspectorTest.log("Attaching node to DOM tree...");
            await Promise.all([
                InspectorTest.evaluateInPage(`insertDetachedNode()`),
                WI.domManager.awaitEvent(WI.DOMManager.Event.NodeInserted),
            ]);
            InspectorTest.log("DOM node attached to tree.");

            logNodes(WI.domManager.attachedNodes());

            InspectorTest.log("Detaching node from DOM tree...");
            await Promise.all([
                InspectorTest.evaluateInPage(`removePreviouslyDetachedNode()`),
                WI.domManager.awaitEvent(WI.DOMManager.Event.NodeRemoved),
            ]);
            InspectorTest.log("DOM node detached from tree.");

            logNodes(WI.domManager.attachedNodes());
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
<style>
#a::before {
    content: "before";
}

#a::after {
    content: "after";
}
</style>
</head>
<body onload="runTest()">
<p id="test-description">Tests for the DOMManager.attachedNodes.</p>
<div id="a">
    <div id="a1"></div>
    <div id="a2"></div>
    <div id="a3"></div>
</div>
<div id="b">
    <div id="b1"></div>
    <div id="b2"></div>
    <div id="b3"></div>
</div>
<div id="end-of-prewritten-test-content"></div>
</body>
</html>
