<!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>