mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
7786077921
This commit makes all errors thrown in owl use a custom error class. The main point of this is to always wrap user-code errors that happen during the owl lifecycle so that they can be treated uniformly in onError by checking the cause property, and also allows user code to differenciate owl errors from non-owl errors reliably at runtime.
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { filterOutModifiersFromData } from "./blockdom/config";
|
|
import { STATUS } from "./status";
|
|
import { OwlError } from "./error_handling";
|
|
|
|
export const mainEventHandler = (data: any, ev: Event, currentTarget?: EventTarget | null) => {
|
|
const { data: _data, modifiers } = filterOutModifiersFromData(data);
|
|
data = _data;
|
|
let stopped = false;
|
|
if (modifiers.length) {
|
|
let selfMode = false;
|
|
const isSelf = ev.target === currentTarget;
|
|
for (const mod of modifiers) {
|
|
switch (mod) {
|
|
case "self":
|
|
selfMode = true;
|
|
if (isSelf) {
|
|
continue;
|
|
} else {
|
|
return stopped;
|
|
}
|
|
case "prevent":
|
|
if ((selfMode && isSelf) || !selfMode) ev.preventDefault();
|
|
continue;
|
|
case "stop":
|
|
if ((selfMode && isSelf) || !selfMode) ev.stopPropagation();
|
|
stopped = true;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
// If handler is empty, the array slot 0 will also be empty, and data will not have the property 0
|
|
// We check this rather than data[0] being truthy (or typeof function) so that it crashes
|
|
// as expected when there is a handler expression that evaluates to a falsy value
|
|
if (Object.hasOwnProperty.call(data, 0)) {
|
|
const handler = data[0];
|
|
if (typeof handler !== "function") {
|
|
throw new OwlError(`Invalid handler (expected a function, received: '${handler}')`);
|
|
}
|
|
let node = data[1] ? data[1].__owl__ : null;
|
|
if (node ? node.status === STATUS.MOUNTED : true) {
|
|
handler.call(node ? node.component : null, ev);
|
|
}
|
|
}
|
|
return stopped;
|
|
};
|