chromium/third_party/blink/web_tests/fast/events/script-tests/event-listener-list-mutation.js

function TestMutation(remover, removee, result)
{
    var report = [];

    var node = document.createElement("button");
    var eventType = "click";
    document.body.appendChild(node);
    
    var listeners = [
      function() { mutateList(0); },
      function() { mutateList(1); },
      function() { mutateList(2); }
    ];

    listeners.forEach(function(listener) { node.addEventListener(eventType, listener, false); });

    node.click();
    document.body.removeChild(node);

    var log = "listener " + remover + " removing listener " + removee;

    if (report.join(" ") == result)
        testPassed(log);
    else
        testFailed(log);

    function mutateList(me)
    {
        if (remover == me)
            node.removeEventListener(eventType, listeners[removee], false);
        report.push(me);
    }
}
 
description("Tests that event list mutation preserves the order of event firing.");

debug("self-removal:");
TestMutation(0, 0, "0 1 2");
TestMutation(1, 1, "0 1 2");
TestMutation(2, 2, "0 1 2");

debug("successor removal:");
TestMutation(0, 1, "0 2");
TestMutation(0, 2, "0 1");

debug("predecessor removal:");
TestMutation(2, 0, "0 1 2");
TestMutation(2, 1, "0 1 2");