diff options
Diffstat (limited to 'web_src/js')
-rw-r--r-- | web_src/js/bootstrap.js | 41 | ||||
-rw-r--r-- | web_src/js/features/common-global.js | 20 | ||||
-rw-r--r-- | web_src/js/index.js | 7 | ||||
-rw-r--r-- | web_src/js/publicpath.js | 6 |
4 files changed, 65 insertions, 9 deletions
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 = `<div class="ui container negative message center aligned js-global-error" style="white-space: pre-line;"></div>`; + 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 <script> of page head + // the handler calls `_globalHandlerErrors.push` (array method) to record all errors occur before this init + // then in this init, we can collect all error events and show them + for (const e of window._globalHandlerErrors || []) { + processWindowErrorEvent(e); + } + // then, change _globalHandlerErrors to an object with push method, to process further error events directly + window._globalHandlerErrors = {'push': (e) => processWindowErrorEvent(e)}; +} + +initGlobalErrorHandler(); diff --git a/web_src/js/features/common-global.js b/web_src/js/features/common-global.js index a9baf9be0c..60af4d0d67 100644 --- a/web_src/js/features/common-global.js +++ b/web_src/js/features/common-global.js @@ -3,8 +3,9 @@ import 'jquery.are-you-sure'; import {mqBinarySearch} from '../utils.js'; import createDropzone from './dropzone.js'; import {initCompColorPicker} from './comp/ColorPicker.js'; +import {showGlobalErrorMessage} from '../bootstrap.js'; -const {csrfToken} = window.config; +const {appUrl, csrfToken} = window.config; export function initGlobalFormDirtyLeaveConfirm() { // Warn users that try to leave a page after entering data into a form. @@ -343,3 +344,20 @@ export function initGlobalButtons() { }); }); } + +/** + * Too many users set their ROOT_URL to wrong value, and it causes a lot of problems: + * * Cross-origin API request without correct cookie + * * Incorrect href in <a> + * * ... + * So we check whether current URL starts with AppUrl(ROOT_URL). + * If they don't match, show a warning to users. + */ +export function checkAppUrl() { + const curUrl = window.location.href; + if (curUrl.startsWith(appUrl)) { + return; + } + showGlobalErrorMessage(`Your ROOT_URL in app.ini is ${appUrl} but you are visiting ${curUrl} +You should set ROOT_URL correctly, otherwise the web may not work correctly.`); +} diff --git a/web_src/js/index.js b/web_src/js/index.js index b7eba5e664..18b949e4e6 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -1,4 +1,5 @@ -import './publicpath.js'; +// bootstrap module must be the first one to be imported, it handles webpack lazy-loading and global errors +import './bootstrap.js'; import $ from 'jquery'; import {initVueEnv} from './components/VueComponentLoader.js'; @@ -39,6 +40,7 @@ import { } from './features/repo-issue.js'; import {initRepoEllipsisButton, initRepoCommitLastCommitLoader} from './features/repo-commit.js'; import { + checkAppUrl, initFootLanguageMenu, initGlobalButtonClickOnEnter, initGlobalButtons, @@ -82,7 +84,6 @@ $.fn.tab.settings.silent = true; $.fn.checkbox.settings.enableEnterKey = false; initVueEnv(); - $(document).ready(() => { initGlobalCommon(); @@ -169,4 +170,6 @@ $(document).ready(() => { initUserAuthWebAuthn(); initUserAuthWebAuthnRegister(); initUserSettings(); + + checkAppUrl(); }); diff --git a/web_src/js/publicpath.js b/web_src/js/publicpath.js deleted file mode 100644 index 44448a8447..0000000000 --- a/web_src/js/publicpath.js +++ /dev/null @@ -1,6 +0,0 @@ -// This sets up the URL prefix used in webpack's chunk loading. -// This file must be imported before any lazy-loading is being attempted. -import {joinPaths} from './utils.js'; -const {assetUrlPrefix} = window.config; - -__webpack_public_path__ = joinPaths(assetUrlPrefix, '/'); |