<!DOCTYPE html>
<!--
 | This test checks that the intersection ratio is correctly computed when the
 | target element has nonzero padding and border.
 | The target element is initially transparent, but if the intersection ratio is
 | computed correctly it turns opaque (becomes visibly green).
 |   https://www.w3.org/TR/intersection-observer/
 -->
<html>
<head>
  <style>
    div {
      width: 200px;
      height: 150px;
      margin: 50px;
      position: absolute;
    }
    #root {
      background-color: red;
    }
    #other {
      background-color: blue;
    }
    #target {
      background-color: rgba(0, 128, 0, 0);
      border: 10px solid;
    }
  </style>
</head>
<body>
  <div id="root">
    <div id="other">
      <div id="target">
      </div>
    </div>
  </div>

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

    window.addEventListener("load", function() {
      var rootElement = document.querySelector('#root');
      var targetElement = document.querySelector('#target');
      var expectedRatio = 0.1336898;
      var epsilon = 0.00001;

      function handleIntersect(entries, observer) {
        entries.forEach(function(entry) {
          console.log(entry.intersectionRatio);
          if (Math.abs(entry.intersectionRatio - expectedRatio) < epsilon) {
            entry.target.style.backgroundColor = "rgba(0, 128, 0, 255)";
          }
        });
      }

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

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

      createObserver();

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

</body>
</html>
