<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p class="description">
Tests that dispatchEvent raises DISPATCH_REQUEST_ERR if the event
being dispatched is already being dispatched.
</p>
<pre id="console">
</pre>
<script>
if (window.testRunner)
    testRunner.dumpAsText();

jsTestIsAsync = true;

function shouldBeDispatchRequestErr(exception) {
    var ok = EventException.prototype.isPrototypeOf(exception) && exception.code == EventException.DISPATCH_REQUEST_ERR;
    (ok ? testPassed : testFailed)("should have got DISPATCH_REQUEST_ERR EventException");
}

// try redispatching an event in the process of being dispatched with
// dispatchEvent

function redispatchCustom(event) {
    try {
        window.dispatchEvent(event);
        testFailed('dispatchEvent of an event being dispatched should throw an exception');
    } catch (ex) {
        shouldBeDispatchRequestErr(ex);
    }

    redispatchCustom.wasInvoked = true;
}

var customEvent = document.createEvent('CustomEvent');
customEvent.initCustomEvent('foo', true, true, null);
var p = document.querySelector('.description');
p.addEventListener('foo', redispatchCustom);
p.dispatchEvent(customEvent);
shouldBeTrue('redispatchCustom.wasInvoked');

// try redispatching an event that has already finished being dispatched

function checkCustom(event) {
    checkCustom.wasInvoked = true;
}

p.removeEventListener('foo', redispatchCustom, true);
p.addEventListener('foo', checkCustom, true);
p.dispatchEvent(customEvent);
shouldBeTrue('checkCustom.wasInvoked');

// try redispatching an event in the process of being dispatched by
// the browser

function redispatchLoad(event) {
    if (redispatchLoad.dispatching) {
        testFailed('dispatchEvent of an event being dispatched should not dispatch the event again');
        return;
    }

    try {
        redispatchLoad.dispatching = true;
        document.dispatchEvent(event);
        testFailed('dispatchEvent of an event being dispatched should throw an exception');
    } catch (ex) {
        shouldBeDispatchRequestErr(ex);
    } finally {
        delete redispatchLoad.dispatching;
    }

    finishJSTest();
}

window.addEventListener('load', redispatchLoad, true);
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
