<!DOCTYPE html>
<!--
 | This test checks that intersection observer events get fired when
 | intersection information changes as the result of the target undergoing a
 | transition.
 | The target element is initially green when it intersects completely with the
 | viewport, but when it moves partially offscreen (as it should after the
 | transition) it should turn yellow.
 |   https://www.w3.org/TR/intersection-observer/
 -->
<html>
<head>
  <style>
    div {
      margin: 50px;
    }
    #static1 {
      background-color: red;
      width: 200px;
      height: 200px;
      position: absolute;
    }
    #static2 {
      background-color: blue;
      width: 200px;
      height: 200px;
      position: absolute;
    }
    #moving {
      background-color: green;
      width: 200px;
      height: 200px;
      transition: transform 1s linear;
    }
  </style>
</head>
<body>
  <div id="static1">
    <div id="static2">
      <div id="moving">
      </div>
    </div>
  </div>

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

    window.addEventListener("load", function() {
      var firstStaticElement = document.querySelector('#static1');
      var secondStaticElement = document.querySelector('#static2');
      var movingElement = document.querySelector('#moving');

      function handleIntersect(entries, observer) {
        entries.forEach(function(entry) {
          console.log(entry.intersectionRatio);
          if (entry.intersectionRatio < 1) {
            entry.target.style.backgroundColor = "yellow";
          }
        });
      }

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

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

      createObserver();

      movingElement.style.transform = "translate(-200px, 0)";

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

</body>
</html>
