From 2bce1ea9862c70ebb69963e65bb84dcad6ebb31c Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 30 Mar 2022 13:52:24 +0800 Subject: Show messages for users if the ROOT_URL is wrong, show JavaScript errors (#18971) * ROOT_URL issues: some users did wrong to there app.ini config, then: * The assets can not be loaded (AppSubUrl != "" and users try to access http://host:3000/) *The ROOT_URL is wrong, then many URLs in Gitea are broken. Now Gitea show enough information to users. * JavaScript error issues, there are many users affected by JavaScript errors, some are caused by frontend bugs, some are caused by broken customized templates. If these JS errors can be found at first time, then maintainers do not need to ask about how bug occurs again and again. * Some people like to modify the `head.tmpl`, so we separate the script part to `head_script.tmpl`, then it's much safer. * use specialized CSS class "js-global-error", end users still have a chance to hide error messages by customized CSS styles. --- web_src/js/bootstrap.js | 41 ++++++++++++++++++++++++++++++++++++ web_src/js/features/common-global.js | 20 +++++++++++++++++- web_src/js/index.js | 7 ++++-- web_src/js/publicpath.js | 6 ------ 4 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 web_src/js/bootstrap.js delete mode 100644 web_src/js/publicpath.js (limited to 'web_src') diff --git a/web_src/js/bootstrap.js b/web_src/js/bootstrap.js new file mode 100644 index 0000000000..cf13b2a559 --- /dev/null +++ b/web_src/js/bootstrap.js @@ -0,0 +1,41 @@ +import {joinPaths} from './utils.js'; + +// DO NOT IMPORT window.config HERE! +// to make sure the error handler always works, we should never import `window.config`, because some user's custom template breaks it. + +// This sets up the URL prefix used in webpack's chunk loading. +// This file must be imported before any lazy-loading is being attempted. +__webpack_public_path__ = joinPaths(window?.config?.assetUrlPrefix ?? '/', '/'); + +export function showGlobalErrorMessage(msg) { + const pageContent = document.querySelector('.page-content'); + if (!pageContent) return; + const el = document.createElement('div'); + el.innerHTML = `
`; + el.childNodes[0].textContent = msg; + pageContent.prepend(el.childNodes[0]); +} + +/** + * @param {ErrorEvent} e + */ +function processWindowErrorEvent(e) { + showGlobalErrorMessage(`JavaScript error: ${e.message} (${e.filename} @ ${e.lineno}:${e.colno}). Open browser console to see more details.`); +} + +function initGlobalErrorHandler() { + if (!window.config) { + showGlobalErrorMessage(`Gitea JavaScript code couldn't run correctly, please check your custom templates`); + } + + // we added an event handler for window error at the very beginning of