<!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.SlotFilled");

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

                let containerNodeId = await documentNode.querySelector(selector);
                let containerNode = WI.domManager.nodeForId(containerNodeId);
                InspectorTest.assert(containerNode, `Should find DOM Node for selector '${selector}'.`);

                let slotNodeId = await containerNode.shadowRoots()[0].querySelector("slot");
                let slotNode = WI.domManager.nodeForId(slotNodeId);
                InspectorTest.assert(slotNode, `Should find <slot> inside DOM Node for selector '${selector}'.`);

                await domNodeHandler(slotNode);
            },
        });
    }

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

            InspectorTest.log("Changing slot of child...");
            await Promise.all([
                domNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#named-empty-1").slot = "test-slot"`),
            ]);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should be filled.");

            let listener = domNode.addEventListener(WI.DOMNode.Event.LayoutFlagsChanged, (event) => {
                InspectorTest.fail("Should not change layout flags.");
            });

            InspectorTest.log("Adding child with slot...");
            await InspectorTest.evaluateInPage(`document.querySelector("#named-empty").appendChild(document.querySelector("#named-empty-2"))`);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should be filled.");

            domNode.removeEventListener(WI.DOMNode.Event.LayoutFlagsChanged, listener);
        },
    });

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

            let listener = domNode.addEventListener(WI.DOMNode.Event.LayoutFlagsChanged, (event) => {
                InspectorTest.fail("Should not change layout flags.");
            });

            InspectorTest.log("Removing first assigned node...");
            await InspectorTest.evaluateInPage(`document.querySelector("#named-filled-1").remove()`);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should be filled.");

            domNode.removeEventListener(WI.DOMNode.Event.LayoutFlagsChanged, listener);

            InspectorTest.log("Removing last assigned node...");
            await Promise.all([
                domNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#named-filled-2").slot = "invalid-slot"`),
            ]);
            InspectorTest.expectFalse(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should not be filled.");
        },
    });

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

            InspectorTest.log("Adding second child as assigned node...");
            await Promise.all([
                domNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                InspectorTest.evaluateInPage(`document.querySelector("#manual-empty").assign(document.querySelector("#manual-empty-2"))`),
            ]);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should be filled.");

            let listener = domNode.addEventListener(WI.DOMNode.Event.LayoutFlagsChanged, (event) => {
                InspectorTest.fail("Should not change layout flags.");
            });

            InspectorTest.log("Adding first child as assigned node...");
            await InspectorTest.evaluateInPage(`document.querySelector("#manual-empty").assign(...document.querySelectorAll("#manual-empty > span"))`);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should be filled.");

            domNode.removeEventListener(WI.DOMNode.Event.LayoutFlagsChanged, listener);
        },
    });

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

            let listener = domNode.addEventListener(WI.DOMNode.Event.LayoutFlagsChanged, (event) => {
                InspectorTest.fail("Should not change layout flags.");
            });

            InspectorTest.log("Removing first assigned node...");
            await InspectorTest.evaluateInPage(`document.querySelector("#manual-filled").assign(document.querySelector("#manual-filled-2"))`);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.SlotFilled), "Should be filled.");

            domNode.removeEventListener(WI.DOMNode.Event.LayoutFlagsChanged, listener);

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

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

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

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

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

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