<html>
    <head>
        <script>
            if (window.testRunner) {
                testRunner.dumpAsText();
                testRunner.waitUntilDone();
            }
            
            function gc()
            {
                if (window.GCController)
                    return GCController.collect();

                for (var i = 0; i < 10000; i++) { // force garbage collection (FF requires about 9K allocations before a collect).
                    var s = new String("abc");
                }
            }
            
            function runTest()
            {
                aElement = document.createElement('a');
                divElement = document.createElement('div');
                document.body.appendChild(divElement);
                nodeIterator = win.document.createNodeIterator(aElement);
                win.document.body.appendChild(aElement);

                delete nodeIterator;
                gc();
                document.body.removeChild(divElement);
                gc();
                
                if (window.testRunner)
                    testRunner.notifyDone();
            }
        </script>
    </head>
    <body>
        <iframe onload="this.onload = null; win = this.contentWindow; runTest();"></iframe>
        Test passes if it does not crash.
    </body>
</html>

