Merge pull request #801 from CendioOssman/errors
Improve fallback error handler
This commit is contained in:
commit
f4ae0a1402
|
@ -6,16 +6,6 @@
|
||||||
(function(){
|
(function(){
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function convertNewlines(msg, parentElem) {
|
|
||||||
const lines = msg.split("\n");
|
|
||||||
lines.forEach(function (line) {
|
|
||||||
parentElem.appendChild(document.createElement("br"));
|
|
||||||
parentElem.appendChild(document.createTextNode(line));
|
|
||||||
});
|
|
||||||
parentElem.removeChild(parentElem.firstChild);
|
|
||||||
return parentElem;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback for all uncought errors
|
// Fallback for all uncought errors
|
||||||
function handleError (event, err) {
|
function handleError (event, err) {
|
||||||
try {
|
try {
|
||||||
|
@ -28,18 +18,24 @@
|
||||||
|
|
||||||
var div = document.createElement("div");
|
var div = document.createElement("div");
|
||||||
div.classList.add('noVNC_message');
|
div.classList.add('noVNC_message');
|
||||||
convertNewlines(event.message, div);
|
div.appendChild(document.createTextNode(event.message));
|
||||||
msg.appendChild(div);
|
msg.appendChild(div);
|
||||||
|
|
||||||
if (event.filename !== undefined && event.lineno !== undefined && event.colno !== undefined) {
|
if (event.filename) {
|
||||||
div = document.createElement("div");
|
div = document.createElement("div");
|
||||||
div.className = 'noVNC_location';
|
div.className = 'noVNC_location';
|
||||||
const text = event.filename + ":" + event.lineno + ":" + event.colno;
|
var text = event.filename;
|
||||||
div.appendChild(document.createTextNode(text));
|
if (event.lineno !== undefined) {
|
||||||
|
text += ":" + event.lineno;
|
||||||
|
if (event.colno !== undefined) {
|
||||||
|
text += ":" + event.colno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
div.appendChild(document.createTextNode(text));
|
||||||
msg.appendChild(div);
|
msg.appendChild(div);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err !== undefined) &&
|
if (err &&
|
||||||
(err.stack !== undefined)) {
|
(err.stack !== undefined)) {
|
||||||
div = document.createElement("div");
|
div = document.createElement("div");
|
||||||
div.className = 'noVNC_stack';
|
div.className = 'noVNC_stack';
|
||||||
|
|
|
@ -216,31 +216,32 @@ select:active {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#noVNC_fallback_error {
|
#noVNC_fallback_error {
|
||||||
position: fixed;
|
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
left: 50%;
|
visibility: hidden;
|
||||||
transform: translate(-50%, -50px);
|
}
|
||||||
|
#noVNC_fallback_error.noVNC_open {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_fallback_error > div {
|
||||||
|
max-width: 90%;
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
transition: 0.5s ease-in-out;
|
transition: 0.5s ease-in-out;
|
||||||
|
|
||||||
visibility: hidden;
|
transform: translateY(-50px);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
||||||
top: 60px;
|
|
||||||
padding: 15px;
|
|
||||||
width: auto;
|
|
||||||
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
word-wrap: break-word;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
|
box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
|
||||||
background: rgba(200,55,55,0.8);
|
background: rgba(200,55,55,0.8);
|
||||||
}
|
}
|
||||||
#noVNC_fallback_error.noVNC_open {
|
#noVNC_fallback_error.noVNC_open > div {
|
||||||
transform: translate(-50%, 0);
|
transform: translateY(0);
|
||||||
visibility: visible;
|
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,6 +252,8 @@ select:active {
|
||||||
#noVNC_fallback_errormsg .noVNC_message {
|
#noVNC_fallback_errormsg .noVNC_message {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
font-family: monospace;
|
||||||
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
#noVNC_fallback_error .noVNC_location {
|
#noVNC_fallback_error .noVNC_location {
|
||||||
|
@ -264,7 +267,8 @@ select:active {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
white-space: pre;
|
font-family: monospace;
|
||||||
|
white-space: pre-wrap;
|
||||||
border: 1px solid rgba(0, 0, 0, 0.5);
|
border: 1px solid rgba(0, 0, 0, 0.5);
|
||||||
background: rgba(0, 0, 0, 0.2);
|
background: rgba(0, 0, 0, 0.2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1169,6 +1169,34 @@ var loader;
|
||||||
// <script type="module"> support
|
// <script type="module"> support
|
||||||
var anonSources = {};
|
var anonSources = {};
|
||||||
if (typeof document != 'undefined' && document.getElementsByTagName) {
|
if (typeof document != 'undefined' && document.getElementsByTagName) {
|
||||||
|
function handleError(err) {
|
||||||
|
// dispatch an error event so that we can display in errors in browsers
|
||||||
|
// that don't yet support unhandledrejection
|
||||||
|
if (window.onunhandledrejection === undefined) {
|
||||||
|
try {
|
||||||
|
var evt = new Event('error');
|
||||||
|
} catch (_eventError) {
|
||||||
|
var evt = document.createEvent('Event');
|
||||||
|
evt.initEvent('error', true, true);
|
||||||
|
}
|
||||||
|
evt.message = err.message;
|
||||||
|
if (err.fileName) {
|
||||||
|
evt.filename = err.fileName;
|
||||||
|
evt.lineno = err.lineNumber;
|
||||||
|
evt.colno = err.columnNumber;
|
||||||
|
} else if (err.sourceURL) {
|
||||||
|
evt.filename = err.sourceURL;
|
||||||
|
evt.lineno = err.line;
|
||||||
|
evt.colno = err.column;
|
||||||
|
}
|
||||||
|
evt.error = err;
|
||||||
|
window.dispatchEvent(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// throw so it still shows up in the console
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
function ready() {
|
function ready() {
|
||||||
document.removeEventListener('DOMContentLoaded', ready, false );
|
document.removeEventListener('DOMContentLoaded', ready, false );
|
||||||
|
|
||||||
|
@ -1180,22 +1208,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
|
||||||
if (script.type == 'module' && !script.loaded) {
|
if (script.type == 'module' && !script.loaded) {
|
||||||
script.loaded = true;
|
script.loaded = true;
|
||||||
if (script.src) {
|
if (script.src) {
|
||||||
loader.import(script.src).catch(function(err) {
|
loader.import(script.src).catch(handleError);
|
||||||
// dispatch an error event so that we can display in errors in browsers
|
|
||||||
// that don't yet support unhandledrejection
|
|
||||||
try {
|
|
||||||
var evt = new Event('error');
|
|
||||||
} catch (_eventError) {
|
|
||||||
var evt = document.createEvent('Event');
|
|
||||||
evt.initEvent('error', true, true);
|
|
||||||
}
|
|
||||||
evt.message = err.message;
|
|
||||||
evt.error = err;
|
|
||||||
window.dispatchEvent(evt);
|
|
||||||
|
|
||||||
// throw so it still shows up in the console
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
// anonymous modules supported via a custom naming scheme and registry
|
// anonymous modules supported via a custom naming scheme and registry
|
||||||
else {
|
else {
|
||||||
|
@ -1206,22 +1219,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
|
||||||
|
|
||||||
var anonName = resolveIfNotPlain(uri, baseURI);
|
var anonName = resolveIfNotPlain(uri, baseURI);
|
||||||
anonSources[anonName] = script.innerHTML;
|
anonSources[anonName] = script.innerHTML;
|
||||||
loader.import(anonName).catch(function(err) {
|
loader.import(anonName).catch(handleError);
|
||||||
// dispatch an error event so that we can display in errors in browsers
|
|
||||||
// that don't yet support unhandledrejection
|
|
||||||
try {
|
|
||||||
var evt = new Event('error');
|
|
||||||
} catch (_eventError) {
|
|
||||||
var evt = document.createEvent('Event');
|
|
||||||
evt.initEvent('error', true, true);
|
|
||||||
}
|
|
||||||
evt.message = err.message;
|
|
||||||
evt.error = err;
|
|
||||||
window.dispatchEvent(evt);
|
|
||||||
|
|
||||||
// throw so it still shows up in the console
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1310,6 +1308,7 @@ var WorkerPool = function (script, size) {
|
||||||
wrkr._count = 0;
|
wrkr._count = 0;
|
||||||
wrkr._ind = i;
|
wrkr._ind = i;
|
||||||
wrkr.onmessage = this._onmessage.bind(this, wrkr);
|
wrkr.onmessage = this._onmessage.bind(this, wrkr);
|
||||||
|
wrkr.onerror = this._onerror.bind(this);
|
||||||
this._workers[i] = wrkr;
|
this._workers[i] = wrkr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1335,6 +1334,21 @@ WorkerPool.prototype = {
|
||||||
this._checkJobs();
|
this._checkJobs();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onerror: function(err) {
|
||||||
|
try {
|
||||||
|
var evt = new Event('error');
|
||||||
|
} catch (_eventError) {
|
||||||
|
var evt = document.createEvent('Event');
|
||||||
|
evt.initEvent('error', true, true);
|
||||||
|
}
|
||||||
|
evt.message = err.message;
|
||||||
|
evt.filename = err.filename;
|
||||||
|
evt.lineno = err.lineno;
|
||||||
|
evt.colno = err.colno;
|
||||||
|
evt.error = err.error;
|
||||||
|
window.dispatchEvent(evt);
|
||||||
|
},
|
||||||
|
|
||||||
_checkJobs: function () {
|
_checkJobs: function () {
|
||||||
if (this._jobs === 0 && this._stopTimeout === undefined) {
|
if (this._jobs === 0 && this._stopTimeout === undefined) {
|
||||||
// wait for 2s of inactivity before stopping (that should be enough for local loading)
|
// wait for 2s of inactivity before stopping (that should be enough for local loading)
|
||||||
|
@ -1407,3 +1421,4 @@ if (isBrowser)
|
||||||
return BrowserESModuleLoader;
|
return BrowserESModuleLoader;
|
||||||
|
|
||||||
})));
|
})));
|
||||||
|
//# sourceMappingURL=browser-es-module-loader.js.map
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -5,6 +5,7 @@ export default {
|
||||||
dest: 'dist/browser-es-module-loader.js',
|
dest: 'dist/browser-es-module-loader.js',
|
||||||
format: 'umd',
|
format: 'umd',
|
||||||
moduleName: 'BrowserESModuleLoader',
|
moduleName: 'BrowserESModuleLoader',
|
||||||
|
sourceMap: true,
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
nodeResolve(),
|
nodeResolve(),
|
||||||
|
|
|
@ -9,6 +9,34 @@ var loader;
|
||||||
// <script type="module"> support
|
// <script type="module"> support
|
||||||
var anonSources = {};
|
var anonSources = {};
|
||||||
if (typeof document != 'undefined' && document.getElementsByTagName) {
|
if (typeof document != 'undefined' && document.getElementsByTagName) {
|
||||||
|
function handleError(err) {
|
||||||
|
// dispatch an error event so that we can display in errors in browsers
|
||||||
|
// that don't yet support unhandledrejection
|
||||||
|
if (window.onunhandledrejection === undefined) {
|
||||||
|
try {
|
||||||
|
var evt = new Event('error');
|
||||||
|
} catch (_eventError) {
|
||||||
|
var evt = document.createEvent('Event');
|
||||||
|
evt.initEvent('error', true, true);
|
||||||
|
}
|
||||||
|
evt.message = err.message;
|
||||||
|
if (err.fileName) {
|
||||||
|
evt.filename = err.fileName;
|
||||||
|
evt.lineno = err.lineNumber;
|
||||||
|
evt.colno = err.columnNumber;
|
||||||
|
} else if (err.sourceURL) {
|
||||||
|
evt.filename = err.sourceURL;
|
||||||
|
evt.lineno = err.line;
|
||||||
|
evt.colno = err.column;
|
||||||
|
}
|
||||||
|
evt.error = err;
|
||||||
|
window.dispatchEvent(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// throw so it still shows up in the console
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
function ready() {
|
function ready() {
|
||||||
document.removeEventListener('DOMContentLoaded', ready, false );
|
document.removeEventListener('DOMContentLoaded', ready, false );
|
||||||
|
|
||||||
|
@ -20,22 +48,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
|
||||||
if (script.type == 'module' && !script.loaded) {
|
if (script.type == 'module' && !script.loaded) {
|
||||||
script.loaded = true;
|
script.loaded = true;
|
||||||
if (script.src) {
|
if (script.src) {
|
||||||
loader.import(script.src).catch(function(err) {
|
loader.import(script.src).catch(handleError);
|
||||||
// dispatch an error event so that we can display in errors in browsers
|
|
||||||
// that don't yet support unhandledrejection
|
|
||||||
try {
|
|
||||||
var evt = new Event('error');
|
|
||||||
} catch (_eventError) {
|
|
||||||
var evt = document.createEvent('Event');
|
|
||||||
evt.initEvent('error', true, true);
|
|
||||||
}
|
|
||||||
evt.message = err.message;
|
|
||||||
evt.error = err;
|
|
||||||
window.dispatchEvent(evt);
|
|
||||||
|
|
||||||
// throw so it still shows up in the console
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
// anonymous modules supported via a custom naming scheme and registry
|
// anonymous modules supported via a custom naming scheme and registry
|
||||||
else {
|
else {
|
||||||
|
@ -46,22 +59,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
|
||||||
|
|
||||||
var anonName = resolveIfNotPlain(uri, baseURI);
|
var anonName = resolveIfNotPlain(uri, baseURI);
|
||||||
anonSources[anonName] = script.innerHTML;
|
anonSources[anonName] = script.innerHTML;
|
||||||
loader.import(anonName).catch(function(err) {
|
loader.import(anonName).catch(handleError);
|
||||||
// dispatch an error event so that we can display in errors in browsers
|
|
||||||
// that don't yet support unhandledrejection
|
|
||||||
try {
|
|
||||||
var evt = new Event('error');
|
|
||||||
} catch (_eventError) {
|
|
||||||
var evt = document.createEvent('Event');
|
|
||||||
evt.initEvent('error', true, true);
|
|
||||||
}
|
|
||||||
evt.message = err.message;
|
|
||||||
evt.error = err;
|
|
||||||
window.dispatchEvent(evt);
|
|
||||||
|
|
||||||
// throw so it still shows up in the console
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,6 +148,7 @@ var WorkerPool = function (script, size) {
|
||||||
wrkr._count = 0;
|
wrkr._count = 0;
|
||||||
wrkr._ind = i;
|
wrkr._ind = i;
|
||||||
wrkr.onmessage = this._onmessage.bind(this, wrkr);
|
wrkr.onmessage = this._onmessage.bind(this, wrkr);
|
||||||
|
wrkr.onerror = this._onerror.bind(this);
|
||||||
this._workers[i] = wrkr;
|
this._workers[i] = wrkr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,6 +174,21 @@ WorkerPool.prototype = {
|
||||||
this._checkJobs();
|
this._checkJobs();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onerror: function(err) {
|
||||||
|
try {
|
||||||
|
var evt = new Event('error');
|
||||||
|
} catch (_eventError) {
|
||||||
|
var evt = document.createEvent('Event');
|
||||||
|
evt.initEvent('error', true, true);
|
||||||
|
}
|
||||||
|
evt.message = err.message;
|
||||||
|
evt.filename = err.filename;
|
||||||
|
evt.lineno = err.lineno;
|
||||||
|
evt.colno = err.colno;
|
||||||
|
evt.error = err.error;
|
||||||
|
window.dispatchEvent(evt);
|
||||||
|
},
|
||||||
|
|
||||||
_checkJobs: function () {
|
_checkJobs: function () {
|
||||||
if (this._jobs === 0 && this._stopTimeout === undefined) {
|
if (this._jobs === 0 && this._stopTimeout === undefined) {
|
||||||
// wait for 2s of inactivity before stopping (that should be enough for local loading)
|
// wait for 2s of inactivity before stopping (that should be enough for local loading)
|
||||||
|
|
10
vnc.html
10
vnc.html
|
@ -72,10 +72,12 @@
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div id="noVNC_fallback_error">
|
<div id="noVNC_fallback_error" class="noVNC_center">
|
||||||
<div>noVNC encountered an error:</div>
|
<div>
|
||||||
<br>
|
<div>noVNC encountered an error:</div>
|
||||||
<div id="noVNC_fallback_errormsg"></div>
|
<br>
|
||||||
|
<div id="noVNC_fallback_errormsg"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- noVNC Control Bar -->
|
<!-- noVNC Control Bar -->
|
||||||
|
|
Loading…
Reference in New Issue