chromium/third_party/blink/web_tests/resize-observer/garbage_collection.html

<!doctype html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<p>ResizeObserver garbage collection tests</p>
<div id="target1" style="width:100px;height:100px;">t1
</div>
<script>
'use strict';

let result;
let target = document.querySelector("#target1");
let test = async_test("ResizeObserver garbage collection");

function initResizeObserver() {
  // The callback routine will be garbage collected unless it is kept alive
  // in C++ code.
  let ro = new ResizeObserver( entries => result = entries );
  ro.observe(target);
}

function test1() {
  initResizeObserver();
  window.requestAnimationFrame( _ => {
    test.step( _ => {
      assert_not_equals(result, null, "initial notification");
      assert_not_equals(window.gc, null, "window.gc required to run this test");
      if (window.gc)
        window.gc();
      test1part2();
    });
  });
}

function test1part2() {
  target.style.width = "200px";
  result = null;
  window.requestAnimationFrame( _ => {
    test.step( _ => {
      assert_not_equals(result, null, "resize notification did not happen because callback was garbage collected");
      test.done();
    });
  });
}

test1();
</script>