blob: 43b144a9ae2d709233f046b298fbaefec4861944 [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="flags" content="dom">
<title>CSS Test: CSSOM View MediaQueryList::addListener with handleEvent</title>
<link rel="help" href="https://dom.spec.whatwg.org/#callbackdef-eventlistener">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/matchMedia.js"></script>
<div id="log"></div>
<script>
"use strict";
setup({ allow_uncaught_exception: true });
promise_test(async t => {
const mql = await createMQL(t);
let _this;
let _event;
const listener = {
handleEvent(event) {
_this = this;
_event = event;
},
};
mql.addListener(listener);
triggerMQLEvent(mql);
await waitForChangesReported();
assert_equals(_this, listener);
assert_equals(_event.media, mql.media);
assert_equals(_event.matches, mql.matches);
}, "calls handleEvent method of event listener");
promise_test(async t => {
const mql = await createMQL(t);
let calls = 0;
mql.addListener({
get handleEvent() {
calls++;
return function() {};
},
});
assert_equals(calls, 0);
triggerMQLEvent(mql);
await waitForChangesReported();
assert_equals(calls, 1);
triggerMQLEvent(mql);
await waitForChangesReported();
assert_equals(calls, 2);
}, "looks up handleEvent method on every event dispatch");
promise_test(async t => {
const mql = await createMQL(t);
let calls = 0;
const listener = () => {
calls++;
};
Object.defineProperty(listener, "handleEvent", {
get: t.unreached_func("handleEvent method should not be looked up on functions"),
});
mql.addListener(listener);
triggerMQLEvent(mql);
await waitForChangesReported();
assert_equals(calls, 1);
}, "doesn't look up handleEvent method on callable event listeners");
const uncaught_error_test = async (t, mql, getHandleEvent) => {
const eventWatcher = new EventWatcher(t, window, "error", waitForChangesReported);
const errorPromise = eventWatcher.wait_for("error");
let calls = 0;
const listener = {
get handleEvent() {
calls++;
return getHandleEvent();
},
};
try {
mql.addListener(listener);
triggerMQLEvent(mql);
const event = await errorPromise;
throw event.error;
} finally {
assert_equals(calls, 1, "handleEvent property was not looked up");
}
};
promise_test(async t => {
const error = { name: "test" };
const mql = await createMQL(t);
return promise_rejects_exactly(t, error,
uncaught_error_test(t, mql, () => { throw error; }));
}, "rethrows errors when getting handleEvent");
promise_test(async t => {
const mql = await createMQL(t);
const global = getWindow(mql);
return promise_rejects_js(t, global.TypeError,
uncaught_error_test(t, mql, () => false));
}, "throws if handleEvent is falsy and not callable");
promise_test(async t => {
const mql = await createMQL(t);
const global = getWindow(mql);
return promise_rejects_js(t, global.TypeError,
uncaught_error_test(t, mql, () => "str"));
}, "throws if handleEvent is thruthy and not callable");
</script>