blob: b7ea3029a07c1de08bf08b1b33be72a237c3fdd5 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.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]);
if (window.internals)
prevNodes = window.internals.numberOfLiveNodes();
rootDiv.innerHTML = "";
divX = null;
divY = null;
divZ = null;
gc();
if (window.internals) {
// If all the Node objects in testHtml are successfully destructed,
// at least 9 <div>s objects will be removed.
// (Actually, since testHtml rendering requires more than 9 Node objects.)
if (window.internals.numberOfLiveNodes() <= prevNodes - 9)
testPassed("All <div> objects in a DOM tree are successfully destructed.");
else
testFailed("<div> objects in a DOM tree are not destructed.");
}
});
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>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>