| <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> |