From e4c3c039bee28bc10f5e6fe3a3a98812d01ce4be Mon Sep 17 00:00:00 2001 From: David Davies-Payne Date: Sat, 18 May 2024 21:07:09 +0000 Subject: [PATCH] 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 Co-authored-by: David Davies-Payne Co-committed-by: David Davies-Payne --- web_src/js/bootstrap.js | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/web_src/js/bootstrap.js b/web_src/js/bootstrap.js index 6cca37f7ca..c707979c48 100644 --- a/web_src/js/bootstrap.js +++ b/web_src/js/bootstrap.js @@ -6,6 +6,24 @@ // This file must be imported before any lazy-loading is being attempted. __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([ '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}) { const err = error ?? reason; - const assetBaseUrl = String(new URL(__webpack_public_path__, window.location.origin)); const {runModeIsProd} = window.config ?? {}; // `error` and `reason` are not guaranteed to be errors. If the value is falsy, it is likely a @@ -60,11 +77,8 @@ function processWindowErrorEvent({error, reason, message, type, filename, lineno if (runModeIsProd) return; } - // 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. Do not show such errors in production. - if (err instanceof Error && !err.stack?.includes(assetBaseUrl) && runModeIsProd) { - return; - } + // In production do not display errors that should be ignored. + if (runModeIsProd && shouldIgnoreError(err)) return; let msg = err?.message ?? message; if (lineno) msg += ` (${filename} @ ${lineno}:${colno})`;