<p>This test verifies that garbage collection successfully cleans up after the destruction of a frame containing a JavaScript interpreter. If the test passes, you'll see a PASS message below.</p> <hr> <pre id="log"></pre> <!-- The test: --> <iframe id="iframe" src="data:text/html,<script>;</script>" style="display:none"></iframe> <script> function log(s) { document.getElementById("log").appendChild(document.createTextNode(s)); } var wiggleRoom = 20; window.onload = function main() { if (!window.layoutTestController || !window.GCController) { log("FAIL: This test uses the layoutTestController and the GCController, so it can only run in DumpRenderTree.\n"); return; } layoutTestController.dumpAsText(); layoutTestController.waitUntilDone(); // Start with no garbage, so GC doesn't run automatically during the test. GCController.collect(); // Create a little garbage, so we can detect failure in the case where the // test doesn't produce any garbage because it fails to destroy the frame. var garbage = [ { }, { }, { }, { }, { }, { }, { }, { }, { }, { } ]; garbage = null; // Destroy a frame that has a JavaScript interpreter. var iframe = document.getElementById("iframe"); iframe.parentNode.removeChild(iframe); // Finish the test on a time-out, to allow the Frame keepAlive timer to fire // and release the frame before we generate results. var continueTest = function continueTest() { // Measure how many garbage JS objects are still around. var jsObjectCountStart = GCController.getJSObjectCount(); GCController.collect(); var jsObjectCountDelta = jsObjectCountStart - GCController.getJSObjectCount(); var garbageCount = jsObjectCountDelta > 0 ? jsObjectCountDelta : 0; // Fail if a lot of garbage was left behind. This can mean one of many things: // the frame was not destroyed; the frame destruction did not trigger GC; or // GC was not effective. if (garbageCount > wiggleRoom) { log("FAIL: " + garbageCount + " garbage JS objects left uncollected.\n"); } else { log("PASS: " + wiggleRoom + " garbage JS objects or fewer left uncollected after destroying a frame.\n"); } layoutTestController.notifyDone(); } setTimeout(continueTest, 10); } </script>