Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Events from GlobalEventHandlers must dispatch on disabled form elements #15558

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
293 changes: 293 additions & 0 deletions dom/events/Event-dispatch-on-disabled-elements.html
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,299 @@
}
}, "Calling click() on disabled elements must not dispatch events.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = [
"drag",
"dragend",
"dragenter",
"dragexit",
"dragleave",
"dragover",
"dragstart",
"drop",
];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new DragEvent(type));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive ${
DragEvent.name
} of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from DragEvent must dispatch on disabled form elements.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = [
"abort",
"cancel",
"canplay",
"canplaythrough",
"change",
"close",
"cuechange",
"durationchange",
"emptied",
"ended",
"input",
"invalid",
"loadeddata",
"loadedmetadata",
"loadend",
"pause",
"play",
"playing",
"progress",
"ratechange",
"reset",
"securitypolicyviolation",
"seeked",
"seeking",
"select",
"stalled",
"submit",
"suspend",
"timeupdate",
"toggle",
"volumechange",
"waiting",
];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new CustomEvent(type));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive Event of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from Event interface must dispatch on disabled form elements.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = ["formdata"];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new FormDataEvent(type, { formData: new FormData() }));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive FormDataEvent of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from FormDataEvent must dispatch on disabled form elements.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = ["keydown", "keypress", "keyup"];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new KeyboardEvent(type));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive KeyboardEvent of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from KeyboardEvent must dispatch on disabled form elements.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = ["loadend", "loadstart"];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new ProgressEvent(type));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive ProgressEvent of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from ProgressEvent must dispatch on disabled form elements.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = ["wheel"];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new WheelEvent(type));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive WheelEvent of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from WheelEvent must dispatch on disabled form elements.");

promise_test(async () => {
// Based on GlobalEventHandlers and mixins
// https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers
const eventTypes = [
"auxclick",
"contextmenu",
"dblclick",
"mousedown",
"mouseenter",
"mouseleave",
"mousemove",
"mouseout",
"mouseover",
"mouseup",
];
for (const localName of formElements) {
const elem = document.createElement(localName);
elem.disabled = true;
document.body.appendChild(elem);
// Each event type.
for (const type of eventTypes) {
let listenerFired = false;
elem.addEventListener(type, function f() {
listenerFired = true;
elem.removeEventListener(type, f);
});
let handlerFired = false;
const handlerAttrName = `on${type}`;
elem[handlerAttrName] = () => {
handlerFired = true;
elem[handlerAttrName] = undefined;
};
elem.dispatchEvent(new MouseEvent(type));

// Generate expectation message.
const { name: constructorName } = Object.getPrototypeOf(elem).constructor;
const msg = `on disabled ${constructorName} to receive MouseEvent of type "${type}".`;
//See how it went...
assert_true(listenerFired, `Expected listener ${msg}`);
assert_true(handlerFired, `Expected handler ${msg}`);
}
elem.remove();
}
}, "Events from MouseEvent must dispatch on disabled form elements.");

promise_test(async () => {
for (const localName of formElements) {
const elem = document.createElement(localName);
Expand Down