<!DOCTYPE html>
<!--
 | This test checks that the observers no longer check the intersections
 | for targets that have been unobserved.
 | Observed targets become green if they intersect with the root (i.e. are
 | visible on the screen). Unobserved targets do not change color.
 |   https://www.w3.org/TR/intersection-observer/
 -->
<html>
<head>
  <style>
    div {
      background-color: yellow;
      width: 50px;
      height: 100px;
      margin: 25px;
      display: inline-block;
    }
  </style>
</head>
<body>
  <div id="firsttarget"></div>
  <div id="secondtarget"></div>
  <div id="thirdtarget"></div>
  <div id="fourthtarget"></div>
  <div id="fifthtarget"></div>

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

    window.addEventListener("load", function() {

      function handleIntersect(entries, observer) {
        entries.forEach(function(entry) {
          if (entry.isIntersecting) {
            entry.target.style.backgroundColor = "green";
          }
        });
      }

      function createObserverAndUnobserveTargets() {
        var firstTargetElement = document.querySelector('#firsttarget');
        var secondTargetElement = document.querySelector('#secondtarget');
        var thirdTargetElement = document.querySelector('#thirdtarget');
        var fourthTargetElement = document.querySelector('#fourthtarget');
        var fifthTargetElement = document.querySelector('#fifthtarget');

        var options = {
          root: null,
          rootMargin: "0px",
          threshold: 0.0
        };

        // Create observer and observe elements.
        var observer = new IntersectionObserver(handleIntersect, options);
        observer.observe(firstTargetElement);
        observer.observe(secondTargetElement);
        observer.observe(thirdTargetElement);
        observer.observe(fourthTargetElement);
        observer.observe(fifthTargetElement);

        // Unobserve some of these targets. When the observer checks for
        // intersections, these elements should not be included.
        observer.unobserve(secondTargetElement);
        observer.unobserve(fourthTargetElement);
        observer.unobserve(fifthTargetElement);
      }

      createObserverAndUnobserveTargets();

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

</body>
</html>
