<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
customElements.define("test-element", class TestElement extends HTMLElement {
    connectedCallback() {
        let shadowRoot = this.attachShadow({
            mode: "open",
            slotAssignment: this.id.substring(0, this.id.indexOf("-")),
        });

        this._slotElement = shadowRoot.appendChild(document.createElement("slot"));
        this._slotElement.name = "test-slot";
    }

    assign(...nodes) {
        this._slotElement.assign(...nodes);
    }
});

function test()
{
    let suite = InspectorTest.createAsyncSuite("CSS.nodeLayoutFlagsChanged.SlotAssigned");

    function addTestCase({name, selector, domNodeHandler})
    {
        suite.addTestCase({
            name,
            async test() {
                let documentNode = await WI.domManager.requestDocument();

                let childNodeId = await documentNode.querySelector(selector + "-child");
                let childNode = WI.domManager.nodeForId(childNodeId);
                InspectorTest.assert(childNode, `Should find DOM Node for selector '${selector}-child'.`);

                await domNodeHandler(childNode);
            },
        });
    }

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.SlotAssigned.Named.Empty",
        selector: "#named-empty",
        async domNodeHandler(childNode) {
            InspectorTest.expectFalse(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should not be slotted.");

            InspectorTest.log("Adding slot...");
            await Promise.all([
                childNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#named-empty-child").slot = "test-slot"`),
            ]);
            InspectorTest.expectTrue(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should be slotted.");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.SlotAssigned.Named.Filled",
        selector: "#named-filled",
        async domNodeHandler(childNode) {
            InspectorTest.expectTrue(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should be slotted.");

            InspectorTest.log("Removing slot...");
            await Promise.all([
                childNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#named-filled-child").slot = "invalid-slot"`),
            ]);
            InspectorTest.expectFalse(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should not be slotted.");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.SlotAssigned.Manual.Empty",
        selector: "#manual-empty",
        async domNodeHandler(childNode) {
            InspectorTest.expectFalse(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should not be slotted.");

            InspectorTest.log("Adding assigned node...");
            await Promise.all([
                childNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#manual-empty").assign(document.querySelector("#manual-empty-child"))`),
            ]);
            InspectorTest.expectTrue(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should be slotted.");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.SlotAssigned.Manual.Filled",
        selector: "#manual-filled",
        async domNodeHandler(childNode) {
            InspectorTest.expectTrue(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should be slotted.");

            InspectorTest.log("Removing assigned node...");
            await Promise.all([
                childNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#manual-filled").assign()`),
            ]);
            InspectorTest.expectFalse(childNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotAssigned), "Should not be slotted.");
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <test-element id="named-empty">
        <span slot="invalid-slot" id="named-empty-child"></span>
    </test-element>

    <test-element id="named-filled">
        <span slot="test-slot" id="named-filled-child"></span>
    </test-element>

    <test-element id="manual-empty">
        <span slot="test-slot" id="manual-empty-child"></span>
    </test-element>

    <test-element id="manual-filled">
        <span slot="invalid-slot" id="manual-filled-child"></span>
    </test-element>

    <script>
        document.querySelector("#manual-filled").assign(document.querySelector("#manual-filled-child"));
    </script>
</body>
</html>
