<!DOCTYPE html>
<meta charset=utf-8>
<title>EventListener::handleEvent()</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://dom.spec.whatwg.org/#callbackdef-eventlistener">
<div id=log></div>
<script>
setup({ allow_uncaught_exception: true });

test(function(t) {
    var type = "foo";
    var target = document.createElement("div");
    var eventListener = {
        handleEvent: function(evt) {
            var that = this;
            t.step(function() {
                assert_equals(evt.type, type);
                assert_equals(evt.target, target);
                assert_equals(evt.srcElement, target);
                assert_equals(that, eventListener);
            });
        },
    };

    target.addEventListener(type, eventListener);
    target.dispatchEvent(new Event(type));
}, "calls `handleEvent` method of `EventListener`");

test(function(t) {
    var type = "foo";
    var target = document.createElement("div");
    var thrownError = { name: "test" };
    var uncaughtError;
    var errorHandler = function(event) {
        uncaughtError = event.error;
    };

    window.addEventListener("error", errorHandler);
    t.add_cleanup(function() {
        window.removeEventListener("error", errorHandler);
    });

    target.addEventListener(type, {
        get handleEvent() {
            throw thrownError;
        },
    });

    target.dispatchEvent(new Event(type));
    assert_equals(thrownError, uncaughtError);
}, "rethrows errors when getting `handleEvent`");

test(function(t) {
    var type = "foo";
    var target = document.createElement("div");
    var calls = 0;

    target.addEventListener(type, {
        get handleEvent() {
            calls++;
            return function() {};
        },
    });

    assert_equals(calls, 0);
    target.dispatchEvent(new Event(type));
    target.dispatchEvent(new Event(type));
    assert_equals(calls, 2);
}, "performs `Get` every time event is dispatched");

test(function(t) {
    var type = "foo";
    var target = document.createElement("div");
    var calls = 0;
    var eventListener = function() { calls++; };
    eventListener.handleEvent = t.unreached_func("`handleEvent` method should not be called on functions");

    target.addEventListener(type, eventListener);
    target.dispatchEvent(new Event(type));
    assert_equals(calls, 1);
}, "doesn't call `handleEvent` method on callable `EventListener`");

test(function(t) {
    var type = "foo";
    var target = document.createElement("div");
    var uncaughtError;
    var errorHandler = function(event) {
        uncaughtError = event.error;
    };

    window.addEventListener("error", errorHandler);
    t.add_cleanup(function() {
        window.removeEventListener("error", errorHandler);
    });

    target.addEventListener(type, {
        handleEvent: null,
    });

    target.dispatchEvent(new Event(type));
    assert_true(uncaughtError instanceof TypeError);
}, "throws if `handleEvent` is falsy and not callable");

test(function(t) {
    var type = "foo";
    var target = document.createElement("div");
    var uncaughtError;
    var errorHandler = function(event) {
        uncaughtError = event.error;
    };

    window.addEventListener("error", errorHandler);
    t.add_cleanup(function() {
        window.removeEventListener("error", errorHandler);
    });

    target.addEventListener(type, {
        handleEvent: 1,
    });

    target.dispatchEvent(new Event(type));
    assert_true(uncaughtError instanceof TypeError);
}, "throws if `handleEvent` is thruthy and not callable");
</script>
