[FIX] web: crash manager correctly formats error message in Firefox

Have a piece of code that throws an Error

In browsers not powered by V8, the stack trace won't be formatted and the Error
type won't appear in the crash manager modal report.

This happens because Error.prototype.stack is non-standard, although most
browsers have an implementation of it. Chrome for example automatically formats
the Error.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
https://v8.dev/docs/stack-trace-api\#compatibility

After this commit, the Error is formatted in the crash manager report, the same
way as Chrome does it.

task-2191727

closes odoo/odoo#56318

X-original-commit: dbf670f2e0ec797aeaf998aa28b32afbdd2c3b4c
Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
Signed-off-by: Christophe Monniez (moc) <moc@odoo.com>
Co-authored-by: Lucas Perais <lpe@odoo.com>
Co-authored-by: Hardik Prajapati <hap@odoo.com>
This commit is contained in:
Mohammed Shekha
2020-08-21 14:33:45 +00:00
committed by Lucas Perais (lpe)
co-authored by Lucas Perais Hardik Prajapati
parent 6a5ee406d8
commit 1ca3a590f7
@@ -27,6 +27,14 @@ window.addEventListener('unhandledrejection', ev =>
let active = true;
// Note: we already have this function in browser_detection.js but browser_detection.js
// is in assets_backend while crash_managere.js is in common so it will have dependency
// of file browser_detection.js which will not be available in frontend, so copy function here
const isBrowserChrome = function () {
return $.browser.chrome && // depends on jquery 1.x, removed in jquery 2 and above
navigator.userAgent.toLocaleLowerCase().indexOf('edge') === -1; // as far as jquery is concerned, Edge is chrome
};
/**
* An extension of Dialog Widget to render the warnings and errors on the website.
* Extend it with your template of choice like ErrorDialog/WarningDialog
@@ -141,7 +149,17 @@ var CrashManager = AbstractService.extend({
// promise has been rejected due to a crash
core.bus.on('crash_manager_unhandledrejection', this, function (ev) {
if (ev.reason && ev.reason instanceof Error) {
var traceback = ev.reason.stack;
// Error.prototype.stack is non-standard.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
// However, most engines provide an implementation.
// In particular, Chrome formats the contents of Error.stack
// https://v8.dev/docs/stack-trace-api#compatibility
let traceback;
if (isBrowserChrome()) {
traceback = ev.reason.stack;
} else {
traceback = `${_t("Error:")} ${ev.reason.message}\n${ev.reason.stack}`;
}
self.show_error({
type: _t("Odoo Client Error"),
message: '',