Move error handler into separate file

This commit moves the global error handler into a separate file,
so that it can catch module loading errors.

This also adds support for properly displaying error messages with
newlines in them (since the module loader may throw those)
This commit is contained in:
Solly Ross
2017-02-28 20:47:02 -05:00
parent e6a8eb15ca
commit adfc9d3f54
7 changed files with 157 additions and 49 deletions

View File

@@ -1180,7 +1180,22 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
if (script.type == 'module' && !script.loaded) {
script.loaded = true;
if (script.src) {
loader.import(script.src);
loader.import(script.src).catch(function(err) {
// 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
else {
@@ -1191,7 +1206,22 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
var anonName = resolveIfNotPlain(uri, baseURI);
anonSources[anonName] = script.innerHTML;
loader.import(anonName);
loader.import(anonName).catch(function(err) {
// 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;
});
}
}
}

View File

@@ -20,7 +20,22 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
if (script.type == 'module' && !script.loaded) {
script.loaded = true;
if (script.src) {
loader.import(script.src);
loader.import(script.src).catch(function(err) {
// 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
else {
@@ -31,7 +46,22 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
var anonName = resolveIfNotPlain(uri, baseURI);
anonSources[anonName] = script.innerHTML;
loader.import(anonName);
loader.import(anonName).catch(function(err) {
// 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;
});
}
}
}