<!DOCTYPE html>
<html>
<head>
<style>
    .scroller {
        height: 200px;
        width: 200px;
        border: 1px solid black;
    }

    .scroller .contents {
        height: 200%;
        width: 100%;
    }

    #scroller {
        overflow: scroll;
    }
    
    #overflow-hidden {
        overflow: hidden;
    }

    #overflow-visible {
        overflow: visible;
    }
    
    #content-shrinking {
        overflow: scroll;
    }

    #content-shrinking.shrunk .contents {
        height: 80%;
    }
</style>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let documentNode;

    let suite = InspectorTest.createAsyncSuite("CSS.nodeLayoutFlagsChanged.Scrollable");

    function addTestCase({name, description, selector, setup, domNodeHandler})
    {
        suite.addTestCase({
            name,
            description,
            setup,
            async test() {
                let nodeId = await documentNode.querySelector(selector);
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, `Should find DOM Node for selector '${selector}'.`);
                await domNodeHandler(domNode);
            },
        });
    }

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.Scrollable.InitiallyScrollable",
        description: "Test that an element with overflow:scroll and scrollable contents is scrollable",
        selector: "#scroller",
        async domNodeHandler(domNode) {
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Should be scrollable");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.Scrollable.InitiallyOverflowHidden",
        description: "Test that nodes changed to `display: none` are not rendered.",
        selector: "#overflow-hidden",
        async domNodeHandler(domNode) {
            InspectorTest.assert(!domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Should not be initially scrollable.");

            InspectorTest.log("Changing to `overflow: scroll`...");
            await Promise.all([
                domNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                domNode.setAttributeValue("style", "overflow: scroll"),
            ]);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Rendered), "Should render nodes changed to `display: block`.");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.Scrollable.InitiallyOverflowVisible",
        description: "Test that nodes that change from having visible overflow to `overflow:scroll` are scrollable",
        selector: "#overflow-visible",
        async domNodeHandler(domNode) {
            InspectorTest.assert(!domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Should not be initially scrollable.");

            InspectorTest.log("Changing to `overflow: scroll`...");
            await Promise.all([
                domNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                domNode.setAttributeValue("style", "overflow: scroll"),
            ]);
            InspectorTest.expectTrue(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Should have become scrollable");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.Scrollable.ContentShrunk",
        description: "Test that nodes whose content shrinks are no longer scrollable",
        selector: "#content-shrinking",
        async domNodeHandler(domNode) {
            InspectorTest.assert(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Should be initially scrollable.");

            InspectorTest.log("Changing content length");
            await Promise.all([
                domNode.awaitEvent(WI.DOMNode.Event.LayoutFlagsChanged),
                domNode.setAttributeValue("class", "shrunk scroller"),
            ]);
            InspectorTest.expectTrue(!domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Should have become non-scrollable");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.Scrollable.IFrameContents",
        description: "Test scrollability of document nodes in an iframe",
        selector: "#iframe",
        async domNodeHandler(domNode) {
            InspectorTest.expectFalse(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "iframe element should not be scrollable.");

            let iframeDocumentNode = domNode.children[0];
            InspectorTest.expectFalse(iframeDocumentNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "iframe's #document node should not be scrollable");

            let iframeHTMLNode = WI.domManager.nodeForId(await iframeDocumentNode.querySelector("html"));
            InspectorTest.expectTrue(iframeHTMLNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Iframe <html> element should be scrollable.");

            let iframeBodyNode = WI.domManager.nodeForId(await iframeDocumentNode.querySelector("body"));
            InspectorTest.expectFalse(iframeBodyNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Iframe <body> element should not be scrollable.");
        },
    });

    addTestCase({
        name: "CSS.nodeLayoutFlagsChanged.Scrollable.IFrameWithScrollableBody",
        description: "Test scrollability of the body node in an iframe ",
        selector: "#iframe-with-scrollable-body",
        async domNodeHandler(domNode) {
            InspectorTest.expectFalse(domNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "iframe element should not be scrollable.");

            let iframeDocumentNode = domNode.children[0];
            InspectorTest.expectFalse(iframeDocumentNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "iframe's #document node should not be scrollable");

            let iframeHTMLNode = WI.domManager.nodeForId(await iframeDocumentNode.querySelector("html"));
            InspectorTest.expectFalse(iframeHTMLNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Iframe <html> element should not be scrollable.");

            let iframeBodyNode = WI.domManager.nodeForId(await iframeDocumentNode.querySelector("body"));
            InspectorTest.expectTrue(iframeBodyNode.layoutFlags.includes(WI.DOMNode.LayoutFlag.Scrollable), "Iframe <body> element should be scrollable.");
        },
    });

    WI.domManager.requestDocument().then((doc) => {
        documentNode = doc;
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
    <p>Tests for the CSS.nodeLayoutFlagsChanged event with the Scrollable enum.</p>

    <div class="scroller" id="scroller">
        <div class="contents"></div>
    </div>

    <div class="scroller" id="overflow-hidden">
        <div class="contents"></div>
    </div>

    <div class="scroller" id="overflow-visible">
        <div class="contents"></div>
    </div>

    <div class="scroller" id="content-shrinking">
        <div class="contents"></div>
    </div>

    <iframe id="iframe" srcdoc="
    <html><style>body { height: 3000px; }</style><body>iframe document</body></html>
    "></iframe>

    <iframe id="iframe-with-scrollable-body" srcdoc="
    <!DOCTYPE html><html><style>html { height: 100%; overflow: hidden; } body { height: 100%; overflow: scroll; } div { height: 1000px; }</style><body><div>contents</div></body></html>
    "></iframe>
</body>
</html>
