<!DOCTYPE html>
<!--
 | This test checks that the intersection is correctly computed when an element
 | in the containing block chain undergoes a transform. One side of the border
 | box of the containing block is disproportionately large to check that the
 | rotations are being calculated relative to the border box and not any other
 | others (i.e. padding).
 | The containing block element turns yellow only if the intersection between
 | the target and the viewport is correctly computed to be 0.5.
 |   https://www.w3.org/TR/intersection-observer/
 -->
<html>
<head>
  <style>
    #moving {
      border-left-width: 100px;
      border-style: solid;
      background-color: red;
      width: 100px;
      height: 100px;
      left: 0px;
      top: 0px;
      position: absolute;
    }
    #target {
      background-color: green;
      width: 100px;
      height: 100px;
      left: -100px;
      top: 0px;
      position: relative;
    }
  </style>
</head>
<body>
  <div id="moving">
    <div id="target">
    </div>
  </div>

  <script>
    if (window.testRunner) {
      window.testRunner.waitUntilDone();
    }

    window.addEventListener("load", function() {
      var movingElement = document.querySelector('#moving');
      var targetElement = document.querySelector('#target');
      var expectedRatio = 0.5;
      // leave room for some rounding differences due to rotation calculations
      var epsilon = 0.02;

      function buildThresholdsList() {
        var thresholds = []
        var numSteps = 100;
        for (var i = 0; i < numSteps; i++) {
          thresholds.push(i / numSteps);
        }
        return thresholds;
      }

      function handleIntersect(entries, observer) {
        entries.forEach(function(entry) {
          console.log(entry.intersectionRatio);
          if (Math.abs(entry.intersectionRatio - expectedRatio) < epsilon) {
            movingElement.style.backgroundColor = "yellow";
          }
        });
      }

      function createObserver() {
        var options = {
          root: null,
          rootMargin: "0px",
          threshold: buildThresholdsList()
        };

        var observer = new IntersectionObserver(handleIntersect, options);
        observer.observe(targetElement);
      }

      createObserver();

      movingElement.style.transform = "rotate(90deg)";

      if (window.testRunner) {
        window.testRunner.DoNonMeasuredLayout();
        window.setTimeout(function() { window.testRunner.notifyDone(); }, 0);
      }
    });
  </script>

</body>
</html>
