blob: 1eb80ccb15f0bc6fda7d04d4fc01555ea6b8ab04 [file] [log] [blame]
<!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>