<style>
    body {
        overflow: hidden;
    }
    .composited {
        transform: translateZ(0);
    }

    .box {
        width: 100px;
        height: 100px;
        background-color: blue;
    }

    img {
        background-color: black;
        width: 100px;
        height: 100px;
        border: none !important;
    }

    div.inline {
        width: 100px;
        height: 100px;
        background-color: red;
    }
    img.to-visible {
        visibility: hidden;
    }
    body.changed img.to-visible {
        visibility: visible;
    }

    img.to-hidden {
        visibility: visible;
    }
    body.changed img.to-hidden {
        visibility: hidden;
    }

    #layers {
        opacity: 0; /* hide from pixel result */
    }

    .box {
        width: 100px;
        height: 100px;
        background-color: green;
    }

    .indicator {
        position: absolute;
        left: 0;
        z-index: 1;
    }
</style>
<script>
    if (window.testRunner) {
        testRunner.dumpAsText(true);
        testRunner.waitUntilDone();
    }

    function doTest()
    {
        window.setTimeout(function() {
            document.body.classList.add('changed');
            if (window.testRunner) {
                document.getElementById('layers').innerText = window.internals.layerTreeAsText(document);
                testRunner.notifyDone();
            }
        }, 0);
    }
    window.addEventListener('load', doTest, false);
</script>
<body>
    <!-- You should see no red. -->
    <div class="indicator box" style="top: 0px"></div>
    <div class="indicator box" style="top: 250px"></div>

    <div style="position: absolute; left: 0px; top: 0px; z-index: 0; " class="composited">
        <div class="inline"></div>
        <img class="composited" style="position: absolute; left: 50px; top: 50px; z-index: -1;">
        <img style="position: absolute; left: 400px; top: 150px; z-index: 0;" class="to-visible">
    </div>

    <div style="position: absolute; left: 0px; top: 250px; z-index: 0; " class="composited">
        <div class="inline"></div>
        <img class="composited" style="position: absolute; left: 50px; top: 50px; z-index: -1;">
        <img style="position: absolute; left: 400px; top: 150px; z-index: 0;" class="to-hidden">
    </div>

<pre id="layers">Layer tree goes here in DRT</pre>
</body>