<!DOCTYPE html>
<head>
<style>
.composited {
will-change: transform;
}

.box {
  width: 100px;
  height: 100px;
}

.behind {
  position: absolute;
  z-index: 1;
  top: 100px;
  left: 100px;
  background-color: blue;
}

.middle {
  position: absolute;
  z-index: 1;
  top: 180px;
  left: 180px;
  background-color: lime;
}

.middle2 {
  position: absolute;
  z-index: 1;
  top: 260px;
  left: 260px;
  background-color: magenta;
}

.top {
  position: absolute;
  z-index: 1;
  top: 340px;
  left: 340px;
  background-color: cyan;
}

div:hover {
  background-color: green;
  will-change: transform;
}

</style>
<script>
    if (window.testRunner)
        testRunner.dumpAsText();

    function runTest()
    {
        if (!window.internals)
            return;

        document.getElementById('Case1').textContent = internals.layerTreeAsText(document);

        hoverOverMiddleDiv();
        document.getElementById('Case2').textContent = internals.layerTreeAsText(document);

        hoverOverMiddle2Div();
        document.getElementById('Case3').textContent = internals.layerTreeAsText(document);

        hoverOverTopDiv();
        document.getElementById('Case4').textContent = internals.layerTreeAsText(document);

        hoverAtZero();
        document.getElementById('Case5').textContent = internals.layerTreeAsText(document);

        document.getElementById('testTitle').style.display = '';
        document.getElementById('testResults').style.display = '';
    }

    function hoverAtZero()
    {
        internals.setIsCursorVisible(document, true);
        eventSender.mouseMoveTo(0, 0);
    }

    function hoverOverMiddleDiv()
    {
        internals.setIsCursorVisible(document, true);
        eventSender.mouseMoveTo(190, 190);
    }

    function hoverOverMiddle2Div()
    {
        internals.setIsCursorVisible(document, true);
        eventSender.mouseMoveTo(270, 270);
    }

    function hoverOverTopDiv()
    {
        internals.setIsCursorVisible(document, true);
        eventSender.mouseMoveTo(350, 350);
    }
</script>
</head>
<body onload="runTest()">
  <div class="composited box behind"></div>
  <div class="box middle"></div>
  <div class="box middle2"></div>
  <div class="box top"></div>

  <p id="testTitle" style="display:none">Test overlap is rendered correctly when hovering over elements</p>

  <div class="composited"></div>
  <div id="A" class="overlap1"></div>
  <div id="B" class="overlap2"></div>
  <div id="C" class="overlap3"></div>

  <div id="testResults" style="display:none">
    Case 1, original layer tree:
    <pre id="Case1"></pre>
    Case 2: hovering over the "middle" element (causes that div to become its own composited layer)
    <pre id="Case2"></pre>
    Case 3: hovering over the "middle2" element (causes that div to become its own composited layer)
    <pre id="Case3"></pre>
    Case 4: hovering over the "top" element (causes that div to become its own composited layer)
    <pre id="Case4"></pre>
    Case 5: back to situation in case 1
    <pre id="Case5"></pre>
  </div>

</body>
</body>
