Commit df5631bc authored by Romain Courteaud's avatar Romain Courteaud

Release version 0.10.0

Improve error verbosity
parent 58c3f176
This diff is collapsed.
This diff is collapsed.
...@@ -673,7 +673,7 @@ if (typeof document.contains !== 'function') { ...@@ -673,7 +673,7 @@ if (typeof document.contains !== 'function') {
* http://www.renderjs.org/documentation * http://www.renderjs.org/documentation
*/ */
(function (document, window, RSVP, DOMParser, Channel, MutationObserver, (function (document, window, RSVP, DOMParser, Channel, MutationObserver,
Node, FileReader, Blob) { Node, FileReader, Blob, navigator, Event) {
"use strict"; "use strict";
function readBlobAsDataURL(blob) { function readBlobAsDataURL(blob) {
...@@ -737,7 +737,19 @@ if (typeof document.contains !== 'function') { ...@@ -737,7 +737,19 @@ if (typeof document.contains !== 'function') {
renderJS, renderJS,
Monitor, Monitor,
scope_increment = 0, scope_increment = 0,
isAbsoluteOrDataURL = new RegExp('^(?:[a-z]+:)?//|data:', 'i'); isAbsoluteOrDataURL = new RegExp('^(?:[a-z]+:)?//|data:', 'i'),
is_page_unloaded = false,
error_list = [];
window.addEventListener('error', function (error) {
error_list.push(error);
});
window.addEventListener('beforeunload', function () {
// XXX If another listener cancel the page unload,
// it will not restore renderJS crash report
is_page_unloaded = true;
});
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Helper functions // Helper functions
...@@ -751,23 +763,107 @@ if (typeof document.contains !== 'function') { ...@@ -751,23 +763,107 @@ if (typeof document.contains !== 'function') {
} }
function letsCrash(e) { function letsCrash(e) {
if (e.constructor === XMLHttpRequest) { var i,
e = { body,
readyState: e.readyState, container,
status: e.status, paragraph,
statusText: e.statusText, link,
response_headers: e.getAllResponseHeaders() error;
if (is_page_unloaded) {
/*global console*/
console.info('-- Error dropped, as page is unloaded');
console.info(e);
return;
}
error_list.push(e);
// Add error handling stack
error_list.push(new Error('stopping renderJS'));
body = document.getElementsByTagName('body')[0];
while (body.firstChild) {
body.removeChild(body.firstChild);
}
container = document.createElement("section");
paragraph = document.createElement("h1");
paragraph.textContent = 'Unhandled Error';
container.appendChild(paragraph);
paragraph = document.createElement("p");
paragraph.textContent = 'Please report this error to the support team';
container.appendChild(paragraph);
paragraph = document.createElement("p");
paragraph.textContent = 'Location: ';
link = document.createElement("a");
link.href = link.textContent = window.location.toString();
paragraph.appendChild(link);
container.appendChild(paragraph);
paragraph = document.createElement("p");
paragraph.textContent = 'User-agent: ' + navigator.userAgent;
container.appendChild(paragraph);
body.appendChild(container);
for (i = 0; i < error_list.length; i += 1) {
error = error_list[i];
if (error instanceof Event) {
error = {
string: error.toString(),
message: error.message,
type: error.type,
target: error.target
};
if (error.target !== undefined) {
error_list.splice(i + 1, 0, error.target);
}
}
if (error instanceof XMLHttpRequest) {
error = {
message: error.toString(),
readyState: error.readyState,
status: error.status,
statusText: error.statusText,
response: error.response,
responseUrl: error.responseUrl,
response_headers: error.getAllResponseHeaders()
}; };
} }
if (e.constructor === Array || if (error.constructor === Array ||
e.constructor === String || error.constructor === String ||
e.constructor === Object) { error.constructor === Object) {
try { try {
e = JSON.stringify(e); error = JSON.stringify(error);
} catch (ignore) { } catch (ignore) {
} }
} }
document.getElementsByTagName('body')[0].textContent = e;
container = document.createElement("section");
paragraph = document.createElement("h2");
paragraph.textContent = error.message || error;
container.appendChild(paragraph);
if (error.fileName !== undefined) {
paragraph = document.createElement("p");
paragraph.textContent = 'File: ' +
error.fileName +
': ' + error.lineNumber;
container.appendChild(paragraph);
}
if (error.stack !== undefined) {
paragraph = document.createElement("pre");
paragraph.textContent = 'Stack: ' + error.stack;
container.appendChild(paragraph);
}
body.appendChild(container);
}
// XXX Do not crash the application if it fails // XXX Do not crash the application if it fails
// Where to write the error? // Where to write the error?
/*global console*/ /*global console*/
...@@ -1273,7 +1369,13 @@ if (typeof document.contains !== 'function') { ...@@ -1273,7 +1369,13 @@ if (typeof document.contains !== 'function') {
iframe_loading_deferred.promise, iframe_loading_deferred.promise,
// Timeout to prevent non renderJS embeddable gadget // Timeout to prevent non renderJS embeddable gadget
// XXX Maybe using iframe.onload/onerror would be safer? // XXX Maybe using iframe.onload/onerror would be safer?
RSVP.timeout(5000) new RSVP.Queue()
.push(function () {
return RSVP.timeout(5000);
})
.push(undefined, function () {
throw new Error('Timeout while loading: ' + url);
})
]); ]);
} }
...@@ -2033,4 +2135,4 @@ if (typeof document.contains !== 'function') { ...@@ -2033,4 +2135,4 @@ if (typeof document.contains !== 'function') {
bootstrap(); bootstrap();
}(document, window, RSVP, DOMParser, Channel, MutationObserver, Node, }(document, window, RSVP, DOMParser, Channel, MutationObserver, Node,
FileReader, Blob)); FileReader, Blob, navigator, Event));
This diff is collapsed.
{ {
"name": "renderjs", "name": "renderjs",
"version": "0.9.0", "version": "0.10.0",
"description": "RenderJs provides HTML5 gadgets", "description": "RenderJs provides HTML5 gadgets",
"main": "dist/renderjs-latest.js", "main": "dist/renderjs-latest.js",
"dependencies": { "dependencies": {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment