chromium/third_party/blink/web_tests/fast/events/bogus-event-listener-invalidation.html

<p>This page tests for a bogus invalidation of a node's event listeners. If the
test passes, you'll see a PASS message below.</p>
<pre id="console"></pre>

<div id="div"></div>

<script>
function $(id)
{
    return document.getElementById(id);
}

function log(s)
{
    $('console').appendChild(document.createTextNode(s + '\n'));
}

function shouldBe(aDescription, a, b)
{
    if (a === b) {
        log("PASS: " + aDescription + " should be " + b + " and is.");
        return;
    }
    log("FAIL: " + aDescription + " should be " + b + " but instead is " + a);
}

function allocate() {
    for (var i = 0; i < 5000; ++i)
        new Object;
}

(function () {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
    
    var listener = function () { return "click"; };
    
    // Fill the heap with garbage...
    var a = []
    for (var i = 0; i < 5000; ++i)
        a[a.length] = new Object;

    // ...followed by a DOM node wrapper.
    $("div");
    a = null;
    
    // Move the allocation pointer up to the DOM node wrapper.
    allocate();

    // Make a new DOM node wrapper, and add an event listener.
    $("div").onclick = listener;
    
    // Collect the original DOM node wrapper.
    for (var i = 0; i < 3; ++i)
        allocate();

    // See if the listener is still registered.
    shouldBe("div.onclick", div.onclick, listener);

    if (window.testRunner)
        testRunner.notifyDone();
})();
</script>