chromium/third_party/blink/web_tests/fast/dom/gc-dom-tree-lifetime.html

<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
var testCases = [["div0", "div1", "div2"],
                 ["div0", "div2", "div1"],
                 ["div1", "div0", "div2"],
                 ["div1", "div2", "div0"],
                 ["div2", "div0", "div1"],
                 ["div2", "div1", "div0"]];

var rootDiv = document.createElement("div");
document.body.appendChild(rootDiv);
var testHtml = "<div id='div0-parent'><div id='div0'><div id='div0-child'></div></div><div id='div1-parent'><div id='div1'><div id='div1-child'></div></div><div id='div2-parent'><div id='div2'><div id='div2-child'></div></div></div></div></div>";

testCases.forEach(function (test) {
    var divX, divY, divZ;
    debug("=== Initial state ===");
    rootDiv.innerHTML = testHtml;
    divX = document.getElementById(test[0]);
    divY = document.getElementById(test[1]);
    divZ = document.getElementById(test[2]);
    checkParentAndChildAlive(divX, test[0]);
    checkParentAndChildAlive(divY, test[1]);
    checkParentAndChildAlive(divZ, test[2]);

    debug("=== After clearing innerHTML ===");
    rootDiv.innerHTML = testHtml;
    divX = document.getElementById(test[0]);
    divY = document.getElementById(test[1]);
    divZ = document.getElementById(test[2]);
    rootDiv.innerHTML = "";
    checkParentAndChildAlive(divX, test[0]);
    checkParentAndChildAlive(divY, test[1]);
    checkParentAndChildAlive(divZ, test[2]);

    debug("=== After clearing innerHTML and divX ===");
    rootDiv.innerHTML = testHtml;
    divX = document.getElementById(test[0]);
    divY = document.getElementById(test[1]);
    divZ = document.getElementById(test[2]);
    rootDiv.innerHTML = "";
    divX = null;
    gc();
    checkParentAndChildAlive(divY, test[1]);
    checkParentAndChildAlive(divZ, test[2]);

    debug("=== After clearing innerHTML, divX and divY ===");
    rootDiv.innerHTML = testHtml;
    divX = document.getElementById(test[0]);
    divY = document.getElementById(test[1]);
    divZ = document.getElementById(test[2]);
    rootDiv.innerHTML = "";
    divX = null;
    divY = null;
    gc();
    checkParentAndChildAlive(divZ, test[2]);

    debug("=== After clearing innerHTML, divX, divY and divZ ===");
    rootDiv.innerHTML = testHtml;
    divX = document.getElementById(test[0]);
    divY = document.getElementById(test[1]);
    divZ = document.getElementById(test[2]);

    rootDiv.innerHTML = "";
    divX = null;
    divY = null;
    divZ = null;
});

function checkParentAndChildAlive(div, name) {
    globalDiv = div;
    shouldBeEqualToString('globalDiv.id', name);
    shouldBeEqualToString('globalDiv.parentNode.id', name + "-parent");
    shouldBeEqualToString('globalDiv.firstChild.id', name + "-child");
    globalDiv = null;
    gc();
}

var successfullyParsed = true;
</script>
</body>
</html>