<html><head>
    <script src="../../resources/gc.js"></script>
    <script>
        if (window.testRunner)
            testRunner.dumpAsText();

        var types = [
                      XPathResult.ORDERED_NODE_ITERATOR_TYPE,
                      XPathResult.UNORDERED_NODE_ITERATOR_TYPE
                    ];

        function test(type)
        {
            var doc, result;
            function initialize() {
              doc = (new DOMParser).parseFromString("<html><body><span></span></body></html>", "text/xml");
              doc.getElementsByTagName("span")[0].foo = "PASS";
              result = doc.evaluate("//span", doc.documentElement, null, type, null);
              doc = 0;
            }

            // Do initialization work in an inner function to avoid references
            // to objects remaining live on this function's stack frame
            // (http://crbug.com/595672/).
            initialize();
            gc();
            var console = document.getElementById("console");
            console.appendChild(document.createTextNode(result.iterateNext().foo));
            console.appendChild(document.createElement("br"));
        }

        function tests()
        {
            while (types.length) {
                test(types.pop());
            }
        }
    </script>
</head>
<body onload="tests()">
<div> Test for bug <a href="https://bugs.webkit.org/show_bug.cgi?id=34231">34231</a>: Nodes in XPathResult 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>
