<!DOCTYPE html>
<!--
 | This test checks that the observer objects get updated when the elements
 | themselves move around.
 | The color of the target element is blue if the intersection ratio is above
 | the threshold, and green if it is below. In this test, the intersection ratio
 | crosses the threshold when the target element moves; the target element
 | should initially be blue but end up green.
 |   https://www.w3.org/TR/intersection-observer/
 -->
<html>
<head>
  <style>
    div {
      position: absolute;
    }
    #root {
      margin: 100px;
      background-color: red;
      width: 250px;
      height: 150px;
    }
    #target {
      width: 150px;
      height: 50px;
      top: 50px;
      left: 50px;
    }
  </style>
</head>
<body>
  <div id="root">
    <div id="target"></div>
  </div>

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

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

      function handleIntersect(entries, observer) {
        entries.forEach(function(entry) {
          if (entry.intersectionRatio > 0.5) {
            entry.target.style.backgroundColor = "blue";
          } else {
            entry.target.style.backgroundColor = "green";
          }
        });
      }

      var options = {
        root: rootElement,
        rootMargin: "0px",
        threshold: 0.5
      };

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

      if (window.testRunner) {
        window.testRunner.DoNonMeasuredLayout();
      }

      // Move the target element so that the intersection ratio now crosses
      // the threshold value. An intersection observer update should be
      // triggered and the callback should run.
      targetElement.style.top = "-30px";

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

</body>
</html>
