Suppress Monaco JavaScript errors in Safari (#3805)

Fix #3638

This is a manual Forgejo-specific version of the Gitea PR https://github.com/go-gitea/gitea/pull/30862. The weekly Forgejo PR #3772 could not cherry-pick this commit due to conflicts (eg subsequent CodeSpell changes).

Only occurs with Webkit in Safari over eg `http://192..`. (not localhost).
See https://webkit.org/blog/10855/async-clipboard-api/

---
**Before**
![Before.jpg](/attachments/c570d030-fcce-48ea-ac96-06b624541c7b)

**After**
![After.jpg](/attachments/1a9132ab-f7f3-43a5-b3ea-37b6f2b671c4)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3805
Reviewed-by: Otto <otto@codeberg.org>
Co-authored-by: David Davies-Payne <d2p@me.com>
Co-committed-by: David Davies-Payne <d2p@me.com>
(cherry picked from commit e4c3c039be)
This commit is contained in:
David Davies-Payne 2024-05-18 21:07:09 +00:00 committed by GitHub
parent a5776cc883
commit b9674b3ee9

View file

@ -6,6 +6,24 @@
// This file must be imported before any lazy-loading is being attempted. // This file must be imported before any lazy-loading is being attempted.
__webpack_public_path__ = `${window.config?.assetUrlPrefix ?? '/assets'}/`; __webpack_public_path__ = `${window.config?.assetUrlPrefix ?? '/assets'}/`;
// Ignore external and some known internal errors that we are unable to currently fix.
function shouldIgnoreError(err) {
const assetBaseUrl = String(new URL(__webpack_public_path__, window.location.origin));
if (!(err instanceof Error)) return false;
// If the error stack trace does not include the base URL of our script assets, it likely came
// from a browser extension or inline script. Ignore these errors.
if (!err.stack?.includes(assetBaseUrl)) return true;
// Ignore some known internal errors that we are unable to currently fix (eg via Monaco).
const ignorePatterns = [
'/assets/js/monaco.', // https://codeberg.org/forgejo/forgejo/issues/3638 , https://github.com/go-gitea/gitea/issues/30861 , https://github.com/microsoft/monaco-editor/issues/4496
];
for (const pattern of ignorePatterns) {
if (err.stack?.includes(pattern)) return true;
}
return false;
}
const filteredErrors = new Set([ const filteredErrors = new Set([
'getModifierState is not a function', // https://github.com/microsoft/monaco-editor/issues/4325 'getModifierState is not a function', // https://github.com/microsoft/monaco-editor/issues/4325
]); ]);
@ -47,7 +65,6 @@ export function showGlobalErrorMessage(msg) {
*/ */
function processWindowErrorEvent({error, reason, message, type, filename, lineno, colno}) { function processWindowErrorEvent({error, reason, message, type, filename, lineno, colno}) {
const err = error ?? reason; const err = error ?? reason;
const assetBaseUrl = String(new URL(__webpack_public_path__, window.location.origin));
const {runModeIsProd} = window.config ?? {}; const {runModeIsProd} = window.config ?? {};
// `error` and `reason` are not guaranteed to be errors. If the value is falsy, it is likly a // `error` and `reason` are not guaranteed to be errors. If the value is falsy, it is likly a
@ -60,11 +77,8 @@ function processWindowErrorEvent({error, reason, message, type, filename, lineno
if (runModeIsProd) return; if (runModeIsProd) return;
} }
// If the error stack trace does not include the base URL of our script assets, it likely came // In production do not display errors that should be ignored.
// from a browser extension or inline script. Do not show such errors in production. if (runModeIsProd && shouldIgnoreError(err)) return;
if (err instanceof Error && !err.stack?.includes(assetBaseUrl) && runModeIsProd) {
return;
}
let msg = err?.message ?? message; let msg = err?.message ?? message;
if (lineno) msg += ` (${filename} @ ${lineno}:${colno})`; if (lineno) msg += ` (${filename} @ ${lineno}:${colno})`;