From 8a6b89c671f864cb3033287211e4438b16ea5eb7 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 28 May 2019 18:57:43 +0200 Subject: [PATCH] luci-base: luci.js: rework L.error() Factor out an L.raise() function out of L.error() which constructs and throws an exception object. Rework the remaining L.error() function to internally use L.raise() to construct exceptionts to render. Signed-off-by: Jo-Philipp Wich --- .../htdocs/luci-static/resources/luci.js | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/modules/luci-base/htdocs/luci-static/resources/luci.js b/modules/luci-base/htdocs/luci-static/resources/luci.js index 24af80f69..6332790c7 100644 --- a/modules/luci-base/htdocs/luci-static/resources/luci.js +++ b/modules/luci-base/htdocs/luci-static/resources/luci.js @@ -591,7 +591,7 @@ window.cbi_init = function() {}; }, - error: function(type, fmt /*, ...*/) { + raise: function(type, fmt /*, ...*/) { var e = null, msg = fmt ? String.prototype.format.apply(fmt, this.varargs(arguments, 2)) : null, stack = null; @@ -606,36 +606,44 @@ else { e = new (window[type || 'Error'] || Error)(msg || 'Unspecified error'); e.name = type || 'Error'; + } - try { throw new Error('stacktrace') } - catch (e2) { stack = (e2.stack || '').split(/\n/) } + if (window.console && console.debug) + console.debug(e); - /* IE puts the exception message into the first line */ - if (stack[0] == 'Error: stacktrace') - stack.shift(); + throw e; + }, - /* Pop L.error() invocation from stack */ - stack.shift(); + error: function(type, fmt /*, ...*/) { + try { + L.raise.apply(L, Array.prototype.slice.call(arguments)); } + catch (e) { + var stack = (e.stack || '').split(/\n/).map(function(frame) { + frame = frame.replace(/(.*?)@(.+):(\d+):(\d+)/g, 'at $1 ($2:$3:$4)').trim(); + return frame ? ' ' + frame : ''; + }); - /* Append shortened & beautified stacktrace to message */ - var trace = stack.join('\n') - .replace(/(.*?)@(.+):(\d+):(\d+)/g, ' at $1 ($2:$3:$4)'); + if (!/^ at /.test(stack[0])) + stack.shift(); - if (e.message.indexOf(trace) == -1) - e.message += '\n' + trace; + if (/\braise /.test(stack[0])) + stack.shift(); - if (window.console && console.debug) - console.debug(e); + if (/\berror /.test(stack[0])) + stack.shift(); - if (this.ui) - this.ui.showModal(_('Runtime error'), - E('pre', { 'class': 'alert-message error' }, e)); - else - L.dom.content(document.querySelector('#maincontent'), - E('pre', { 'class': 'alert-message error' }, e)); + stack = stack.length ? '\n' + stack.join('\n') : ''; - throw e; + if (L.ui) + L.ui.showModal(e.name || _('Runtime error'), + E('pre', { 'class': 'alert-message error' }, e.message + stack)); + else + L.dom.content(document.querySelector('#maincontent'), + E('pre', { 'class': 'alert-message error' }, e + stack)); + + throw e; + } }, bind: function(fn, self /*, ... */) { -- 2.25.1