From c845d985e0d6014f2c2474564c59f33cdc552de6 Mon Sep 17 00:00:00 2001 From: Richard Hansen Date: Tue, 17 Nov 2020 00:46:52 -0500 Subject: [PATCH] pad: Pop up an error message on unhandled Promise rejection --- src/static/js/pad_utils.js | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/static/js/pad_utils.js b/src/static/js/pad_utils.js index 130c7dc8a..006f0b8d5 100644 --- a/src/static/js/pad_utils.js +++ b/src/static/js/pad_utils.js @@ -474,11 +474,22 @@ var padutils = { } }; -var globalExceptionHandler = undefined; -function setupGlobalExceptionHandler() { - if (!globalExceptionHandler) { - globalExceptionHandler = function test (msg, url, linenumber) - { +let globalExceptionHandler = null; +padutils.setupGlobalExceptionHandler = () => { + if (globalExceptionHandler == null) { + globalExceptionHandler = (e) => { + let type; + let msg, url, lineno; + if (e instanceof ErrorEvent) { + type = 'Uncaught exception'; + ({message: msg, filename: url, lineno: linenumber} = e); + } else if (e instanceof PromiseRejectionEvent) { + type = 'Unhandled Promise rejection'; + const err = e.reason || {}; + ({message: msg = 'unknown', fileName: url = 'unknown', lineNumber: linenumber = -1} = err); + } else { + throw new Error(`unknown event: ${e.toString()}`); + } var errorId = randomString(20); var msgAlreadyVisible = false; @@ -497,6 +508,7 @@ function setupGlobalExceptionHandler() { .text('If the problem persists, please send this error message to your webmaster:'), $('
').css('text-align', 'left').css('font-size', '.8em').css('margin-top', '1em') .append(txt(`ErrorId: ${errorId}`)).append($('
')) + .append(txt(type)).append($('
')) .append(txt(`URL: ${window.location.href}`)).append($('
')) .append(txt(`UserAgent: ${navigator.userAgent}`)).append($('
')) .append($('').addClass('error-msg').text(msg)).append($('
')) @@ -516,6 +528,7 @@ function setupGlobalExceptionHandler() { $.post('../jserror', { errorInfo: JSON.stringify({ errorId, + type, msg, url: window.location.href, source: url, @@ -523,15 +536,13 @@ function setupGlobalExceptionHandler() { userAgent: navigator.userAgent, }), }); - - return false; }; - window.onerror = globalExceptionHandler; + window.onerror = null; // Clear any pre-existing global error handler. + window.addEventListener('error', globalExceptionHandler); + window.addEventListener('unhandledrejection', globalExceptionHandler); } } -padutils.setupGlobalExceptionHandler = setupGlobalExceptionHandler; - padutils.binarySearch = require('./ace2_common').binarySearch; // https://stackoverflow.com/a/42660748