Improve debug logging

This commit is contained in:
toasted-nutbread 2020-01-21 19:08:56 -05:00
parent 1fd568ab8e
commit 26ea278c29
4 changed files with 53 additions and 7 deletions

View File

@ -187,6 +187,23 @@ input[type=checkbox].storage-button-checkbox {
margin: 0; margin: 0;
} }
.error-data-show-button {
display: inline-block;
margin-left: 0.5em;
cursor: pointer;
}
.error-data-show-button:after {
content: "\2026";
font-weight: bold;
}
.error-data-container {
margin-top: 0.25em;
font-family: 'Courier New', Courier, monospace;
white-space: pre;
overflow-x: auto;
}
[data-show-for-browser], [data-show-for-browser],
[data-show-for-operating-system] { [data-show-for-operating-system] {
display: none; display: none;

View File

@ -36,8 +36,9 @@ async function requestJson(url, action, params) {
const responseText = await requestText(url, action, params); const responseText = await requestText(url, action, params);
try { try {
return JSON.parse(responseText); return JSON.parse(responseText);
} } catch (e) {
catch (e) { const error = new Error(`Invalid response (${e.message || e})`);
throw new Error('Invalid response'); error.data = {url, action, params, responseText};
throw error;
} }
} }

View File

@ -37,13 +37,35 @@ function _ankiSetError(error) {
if (error) { if (error) {
node.hidden = false; node.hidden = false;
node.textContent = `${error}`; node.textContent = `${error}`;
} _ankiSetErrorData(node, error);
else { } else {
node.hidden = true; node.hidden = true;
node.textContent = ''; node.textContent = '';
} }
} }
function _ankiSetErrorData(node, error) {
const data = error.data;
let message = '';
if (typeof data !== 'undefined') {
message += `${JSON.stringify(data, null, 4)}\n\n`;
}
message += `${error.stack}`.trimRight();
const button = document.createElement('a');
button.className = 'error-data-show-button';
const content = document.createElement('div');
content.className = 'error-data-container';
content.textContent = message;
content.hidden = true;
button.addEventListener('click', () => content.hidden = !content.hidden, false);
node.appendChild(button);
node.appendChild(content);
}
function _ankiSetDropdownOptions(dropdown, optionValues) { function _ankiSetDropdownOptions(dropdown, optionValues) {
const fragment = document.createDocumentFragment(); const fragment = document.createDocumentFragment();
for (const optionValue of optionValues) { for (const optionValue of optionValues) {

View File

@ -56,7 +56,8 @@ function errorToJson(error) {
return { return {
name: error.name, name: error.name,
message: error.message, message: error.message,
stack: error.stack stack: error.stack,
data: error.data
}; };
} }
@ -64,6 +65,7 @@ function jsonToError(jsonError) {
const error = new Error(jsonError.message); const error = new Error(jsonError.message);
error.name = jsonError.name; error.name = jsonError.name;
error.stack = jsonError.stack; error.stack = jsonError.stack;
error.data = jsonError.data;
return error; return error;
} }
@ -74,7 +76,11 @@ function logError(error, alert) {
const errorString = `${error.toString ? error.toString() : error}`; const errorString = `${error.toString ? error.toString() : error}`;
const stack = `${error.stack}`.trimRight(); const stack = `${error.stack}`.trimRight();
errorMessage += (!stack.startsWith(errorString) ? `${errorString}\n${stack}` : `${stack}`); if (!stack.startsWith(errorString)) { errorMessage += `${errorString}\n`; }
errorMessage += stack;
const data = error.data;
if (typeof data !== 'undefined') { errorMessage += `\nData: ${JSON.stringify(data, null, 4)}`; }
errorMessage += '\n\nIssues can be reported at https://github.com/FooSoft/yomichan/issues'; errorMessage += '\n\nIssues can be reported at https://github.com/FooSoft/yomichan/issues';