mirror of
https://github.com/servo/servo.git
synced 2025-10-03 18:19:14 +01:00
132 lines
3.9 KiB
HTML
132 lines
3.9 KiB
HTML
<!doctype html>
|
|
<meta charset="utf8">
|
|
<title>Events must dispatch on disabled elements</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/resources/testdriver.js"></script>
|
|
<script src="/resources/testdriver-vendor.js"></script>
|
|
<body>
|
|
<script>
|
|
// HTML elements that can be disabled
|
|
const formElements = ["button", "fieldset", "input", "select", "textarea"];
|
|
|
|
test(() => {
|
|
for (const localName of formElements) {
|
|
const elem = document.createElement(localName);
|
|
elem.disabled = true;
|
|
// pass becomes true if the event is called and it's the right type.
|
|
let pass = false;
|
|
const listener = ({ type }) => {
|
|
pass = type === "click";
|
|
};
|
|
elem.addEventListener("click", listener, { once: true });
|
|
elem.dispatchEvent(new Event("click"));
|
|
assert_true(
|
|
pass,
|
|
`Untrusted "click" Event didn't dispatch on ${elem.constructor.name}.`
|
|
);
|
|
}
|
|
}, "Can dispatch untrusted 'click' Events at disabled HTML elements.");
|
|
|
|
test(() => {
|
|
for (const localName of formElements) {
|
|
const elem = document.createElement(localName);
|
|
elem.disabled = true;
|
|
// pass becomes true if the event is called and it's the right type.
|
|
let pass = false;
|
|
const listener = ({ type }) => {
|
|
pass = type === "pass";
|
|
};
|
|
elem.addEventListener("pass", listener, { once: true });
|
|
elem.dispatchEvent(new Event("pass"));
|
|
assert_true(
|
|
pass,
|
|
`Untrusted "pass" Event didn't dispatch on ${elem.constructor.name}`
|
|
);
|
|
}
|
|
}, "Can dispatch untrusted Events at disabled HTML elements.");
|
|
|
|
test(() => {
|
|
for (const localName of formElements) {
|
|
const elem = document.createElement(localName);
|
|
elem.disabled = true;
|
|
// pass becomes true if the event is called and it's the right type.
|
|
let pass = false;
|
|
const listener = ({ type }) => {
|
|
pass = type === "custom-pass";
|
|
};
|
|
elem.addEventListener("custom-pass", listener, { once: true });
|
|
elem.dispatchEvent(new CustomEvent("custom-pass"));
|
|
assert_true(
|
|
pass,
|
|
`CustomEvent "custom-pass" didn't dispatch on ${elem.constructor.name}`
|
|
);
|
|
}
|
|
}, "Can dispatch CustomEvents at disabled HTML elements.");
|
|
|
|
test(() => {
|
|
for (const localName of formElements) {
|
|
const elem = document.createElement(localName);
|
|
|
|
// Element is disabled... so this click() MUST NOT fire an event.
|
|
elem.disabled = true;
|
|
let pass = true;
|
|
elem.onclick = e => {
|
|
pass = false;
|
|
};
|
|
elem.click();
|
|
assert_true(
|
|
pass,
|
|
`.click() must not dispatch "click" event on disabled ${
|
|
elem.constructor.name
|
|
}.`
|
|
);
|
|
|
|
// Element is (re)enabled... so this click() fires an event.
|
|
elem.disabled = false;
|
|
pass = false;
|
|
elem.onclick = e => {
|
|
pass = true;
|
|
};
|
|
elem.click();
|
|
assert_true(
|
|
pass,
|
|
`.click() must dispatch "click" event on enabled ${
|
|
elem.constructor.name
|
|
}.`
|
|
);
|
|
}
|
|
}, "Calling click() on disabled elements must not dispatch events.");
|
|
|
|
promise_test(async () => {
|
|
for (const localName of formElements) {
|
|
const elem = document.createElement(localName);
|
|
elem.disabled = true;
|
|
document.body.appendChild(elem);
|
|
|
|
// Element is disabled, so clicking must not fire events
|
|
let pass = true;
|
|
elem.onclick = e => {
|
|
pass = false;
|
|
};
|
|
await test_driver.click(elem); // triggers "onclick"
|
|
assert_true(
|
|
pass,
|
|
`${elem.constructor.name} is disabled, so onclick must not fire.`
|
|
);
|
|
|
|
// Element is (re)enabled... so this click() will fire an event.
|
|
pass = false;
|
|
elem.disabled = false;
|
|
elem.onclick = () => {
|
|
pass = true;
|
|
};
|
|
await test_driver.click(elem); // triggers "onclick"
|
|
assert_true(
|
|
pass,
|
|
`${elem.constructor.name} is enabled, so onclick must fire.`
|
|
);
|
|
elem.remove();
|
|
}
|
|
}, "Real clicks on disabled elements must not dispatch events.");
|
|
</script>
|