<html><head>
    <script>
        if (window.testRunner)
            testRunner.dumpAsText();

        // ANY_ORDERED_NODE_TYPE should be the last item in the array so that
        // there is only one node that can match (thus it does not tie us to any
        // specific ordering in the nodeset).
        var types = [ XPathResult.FIRST_ORDERED_NODE_TYPE, XPathResult.ANY_UNORDERED_NODE_TYPE ];

        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 test(type)
        {
            document.getElementsByTagName("span")[0].foo = "PASS";
            var result = document.evaluate("//span", document.documentElement, null, type, null);
            document.body.removeChild(document.getElementsByTagName("span")[0]);
            gc();
            var console = document.getElementById("console");
            console.appendChild(document.createTextNode(result.singleNodeValue.foo));
            console.appendChild(document.createElement("br"));
        }

        function tests()
        {
            while (types.length) {
                test(types.pop());
            }
        }
    </script>
</head>
<body onload="tests()">
<span></span>
<span></span>
<div> Test for bug <a href="https://bugs.webkit.org/show_bug.cgi?id=34231">34231</a>: Nodes in XPath result snapshots should keep JS wrappers alive.</div>
<div> For this test to PASS you should see 2 PASS below.</div><br>
<div id="console"></div>
</body></html>
