<script src="../../resources/run-after-layout-and-paint.js"></script>
<script>
    if (window.internals)
        internals.runtimeFlags.compositeOpaqueScrollersEnabled = true;

    if (window.testRunner) {
        testRunner.dumpAsTextWithPixelResults();
        testRunner.waitUntilDone();
    }

    function hasOpaqueCompositedScrollingContentsLayer(layer) {
        if (layer.name == "Scrolling Contents Layer")
            return layer.contentsOpaque;
        if (layer.children) {
            for (var i = 0; i < layer.children.length; i++) {
                if (hasOpaqueCompositedScrollingContentsLayer(layer.children[i]))
                    return true;
            }
        }
        return false;
    }

    function hasCompositedScrollingContentsLayer(layer) {
        if (layer.name == "Scrolling Contents Layer")
            return true;
        if (layer.children) {
            for (var i = 0; i < layer.children.length; i++) {
                if (hasCompositedScrollingContentsLayer(layer.children[i]))
                    return true;
            }
        }
        return false;
    }

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

        var result = "Should not have opaque composited scrolling contents layer: ";
        if (!hasCompositedScrollingContentsLayer(JSON.parse(window.internals.layerTreeAsText(document))))
            result += "Pass.\n";
        else
            result += "Fail.\n";
        document.getElementById("test-1-output").innerHTML = result;

        scrollerElement = document.getElementById("scroller");
        scrollerElement.style.background = "green local content-box";

        runAfterLayoutAndPaint(function() {
            var result = "Should have opaque composited scrolling contents layer: ";
            if (hasOpaqueCompositedScrollingContentsLayer(JSON.parse(window.internals.layerTreeAsText(document))))
                result += "Pass.\n";
            else
                result += "Fail.\n";
            document.getElementById("test-2-output").innerHTML = result;
            runAfterLayoutAndPaint(function() { testRunner.notifyDone(); });
        });
    }
</script>
<style>
#scroller {
    background: transparent local content-box;
    border: 10px solid rgba(0, 255, 0, 0.5);
    overflow: scroll;
    width: 200px;
    height: 200px;
}
.spacer {
    height: 300px;
}
</style>
<div id="scroller"><div class="spacer"></div></div>
<p>Scroller background should be green</p>
<p id="test-1-output"></p>
<p id="test-2-output"></p>

