<html>
<head>
    <!--
        This test verifies that software layers are promoted to composited layers when their filter
        outsets change to overlap a hardware layer.

        If the test passes, the green drop-shadow of the black layer should appear over the blue
        composited layer.

        Note: Safari will paint the filter in software because drop-shadow is not the last filter in
        the chain.
    -->
    <style>
        #software-layer-to-promote {
            background-color: black;
            position: absolute;
            top: 100px;
            left: 100px;
            width: 100px;
            height: 100px;
        }
        .initial-drop-shadow {
            /* Safari paints filters in software when drop-shadow is not the last filter in the chain. */
            filter: drop-shadow(10px 10px 0px green) grayscale(0.5);
        }
        .final-drop-shadow {
            filter: drop-shadow(100px 100px 0px green) grayscale(0.5);
        }
        #composited-layer-to-overlap {
            background-color: blue;
            will-change: transform;
            position: absolute;
            top: 250px;
            left: 250px;
            width: 100px;
            height: 100px;
        }
    </style>
    <script>
        if (window.testRunner)
            testRunner.waitUntilDone();

        function appendLayerTreeTextToConsole()
        {
            if (!window.testRunner || !window.internals)
                return;

            var layerTreeText = internals.layerTreeAsText(document);
            document.getElementById("console").appendChild(document.createTextNode(layerTreeText));
        }

        function runTest()
        {
            // Dump the layer tree with the initial drop shadow, which does not overlap the composited layer.
            appendLayerTreeTextToConsole();

            // Force a software-painted drop shadow on Safari.
            var targetElement = document.getElementById("software-layer-to-promote");
            targetElement.className = "final-drop-shadow";
            appendLayerTreeTextToConsole();

            // Dump the layer tree again with the final drop shadow, which overlaps the composited layer.
            if (window.testRunner) {
                testRunner.dumpAsText();
                testRunner.notifyDone();
            }
        }
    </script>
</head>
<body onload="runTest()">
    <div id="composited-layer-to-overlap"></div>
    <div id="software-layer-to-promote" class="initial-drop-shadow"></div>
    <pre id="console"></pre>
</body>
</html>
