| <p> |
| This test verifies that DOM nodes are not garbage collected as long as a node in the |
| tree is referenced from JavaScript. |
| </p> |
| |
| <pre id="console"></pre> |
| |
| <script> |
| function log(s) |
| { |
| document.getElementById("console").appendChild(document.createTextNode(s + "\n")); |
| } |
| |
| function shouldBeNode(a, aDescription) |
| { |
| if (!(a instanceof Node)) { |
| log("FAIL: " + aDescription + " should be a Node but instead is " + a + "."); |
| return; |
| } |
| |
| log("PASS: " + aDescription + " should be a Node and is."); |
| } |
| |
| function gc() |
| { |
| if (window.GCController) |
| return GCController.collect(); |
| |
| for (var i = 0; i < 10000; i++) |
| var s = new String(""); |
| } |
| |
| (function () { |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| } |
| |
| (function() { |
| // Try to create an orphan tree by removal. |
| var p = document.createElement("p"); |
| document.body.appendChild(p); |
| p.innerHTML ='<div><span id="span"><br></span></div>'; |
| var span = document.getElementById("span"); |
| p.innerHTML = ""; |
| |
| gc(); |
| |
| shouldBeNode(span, "span"); |
| shouldBeNode(span.parentNode, "span.parentNode"); |
| shouldBeNode(span.firstChild, "span.firstChild"); |
| })(); |
| |
| (function() { |
| // Try to create an orphan tree by insertion. |
| var p = document.createElement("p"); |
| var span = document.createElement("span"); |
| p.appendChild(span); |
| p = null; |
| |
| gc(); |
| |
| shouldBeNode(span, "span"); |
| shouldBeNode(span.parentNode, "span.parentNode"); |
| })(); |
| })(); |
| </script> |