chromium/third_party/blink/web_tests/intersection-observer/deleted-root.html

<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="./resources/intersection-observer-test-utils.js"></script>
<script src="../resources/gc.js"></script>

<div id="root">
  <div id="target"></div>
</div>

<script>
async_test(function(t) {
  // Initialize observer and remove root in an inner function to avoid
  // references to rootDiv remaining live on this function's stack frame
  // (http://crbug.com/595672/).
  function initializeObserverThenRemoveRootDiv() {
    let rootDiv = document.getElementById("root");
    let observer = new IntersectionObserver(c => {}, {root: rootDiv});
    rootDiv.parentNode.removeChild(rootDiv);
    return observer;
  }

  var target = document.getElementById("target");
  var observer = initializeObserverThenRemoveRootDiv();
  gc();

  runTestCycle(step0, "IntersectionObserver.observe with deleted root.");

  function step0() {
    runTestCycle(step1, "IntersectionObserver.unobserve with deleted root.");
    observer.observe(target);
  }

  function step1() {
    runTestCycle(step2, "IntersectionObserver.disconnect with deleted root.");
    observer.unobserve(target);
  }

  function step2() {
    runTestCycle(step3, "IntersectionObserver.takeRecords with deleted root.");
    observer.disconnect();
  }

  function step3() {
    observer.takeRecords();
    t.done();
  }
});
</script>