chromium/third_party/blink/web_tests/fast/dom/MutationObserver/observe-gc.html

<!DOCTYPE html>
<script src="../../../resources/gc.js"></script>
<script src='../../../resources/testharness.js'></script>
<script src='../../../resources/testharnessreport.js'></script>
<script>

// All the following tests make sure that the observer callback is called even
// if there are no references to the nodes and a garbage collection kicks in
// before returning to the event loop.

async_test(function(t) {

    (function simple() {
        var d = document.createElement('div');
        var c = document.createElement('div');
        var obs = new MutationObserver(t.step_func_done(function() {}));
        obs.observe(d, {childList: true});
        d.appendChild(c);
    })();
    gc();
}, "Tests that pending callbacks retain the nodes even in the presence of garbage collection");

async_test(function(t) {
    (function addedChildNodes() {
        var d = document.createElement('div');
        var c = document.createElement('div');
        c.expando = "c";
        var obs = new MutationObserver(t.step_func_done(function(records) {
            assert_equals(1, records[0].addedNodes.length, "one node added");
            assert_equals("c", records[0].addedNodes[0].expando, "expando preserved");
        }));
        obs.observe(d, {childList: true});
        d.appendChild(c);
    })();
    gc();
}, "Tests that pending callbacks retain the nodes even in the presence of garbage collection");

async_test(function(t) {
    (function siblings() {
        var d = document.createElement('div');
        var b = document.createElement('b');
        var i = document.createElement('i');
        var p = document.createElement('p');
        d.appendChild(b);
        d.appendChild(i);
        d.appendChild(p);
        b.expando = "hello";
        p.expando = "goodbye";

        var obs = new MutationObserver(t.step_func_done(function(records) {
            assert_equals(3, records.length, "number of records");
            assert_equals("hello", records[0].previousSibling.expando, "expando preserved");
            assert_equals("goodbye", records[0].nextSibling.expando, "expando preserved");
        }));
        obs.observe(d, {childList: true});
        d = null;
        i.remove();
        i = null;
        b.remove();
        b = null;
        p.remove();
        p = null;
    })();
    gc();
}, "Tests that pending callbacks retain the nodes even in the presence of garbage collection");

</script>