<html>
<body>
<div id="div"></div>
<p> 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.</p>
<p>This page tests for proper invalidation of a node's event listeners. If the test passes, you'll see a PASS message below.</p>
<pre id="console">FAILED: Test did not run.</pre>
<script>
function $(id)
{
return document.getElementById(id);
}
function log(s)
{
$('console').innerHTML = s + '\n';
}
function allocate() {
for (var i = 0; i < 3000; ++i)
String(i);
}
(function () {
if (window.testRunner)
testRunner.dumpAsText();
// Fill the heap with event listeners...
var a = []
for (var i = 0; i < 5000; ++i)
a[a.length] = function() { };
// ...followed by a DOM node wrapper
var div = $("div");
// Add the listeners to the DOM node.
for (var i = 0; i < a.length; ++i)
div.addEventListener("click", a[i], false);
// Eliminate JS references to the div and its listeners, but keep a reference to the div in an XPath query.
var query = document.evaluate("//div", document.documentElement, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
div.parentNode.removeChild(div);
div = null
a = null;
// Potentially overwrite listeners with strings, but don't overwrite div.
allocate();
// Fire listeners and see if we crash.
var event = document.createEvent('MouseEvent');
event.initEvent('click', true, true);
query.snapshotItem(0).dispatchEvent(event);
log("PASS: You didn't crash.");
})();
</script>
</body></html>