99 lines
3.4 KiB
HTML
99 lines
3.4 KiB
HTML
<!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>
|