diff --git a/plugin/_locales/en/messages.json b/plugin/_locales/en/messages.json index e373032b..b8db350c 100644 --- a/plugin/_locales/en/messages.json +++ b/plugin/_locales/en/messages.json @@ -15,10 +15,18 @@ "message": "Edit Chapter URLs", "description": "Label on button to allow manually editing list of URLs to fetch" }, + "__MSG_button_error_Cancel__": { + "message": "Cancel", + "description": "Label on 'Cancel' button when show error" + }, "__MSG_button_error_OK__": { "message": "OK", "description": "Label on 'OK' button when show error" }, + "__MSG_button_error_Retry__": { + "message": "Retry", + "description": "Label on 'Retry' button when show error" + }, "__MSG_button_Fetch_Chapters__": { "message": "Fetch Chapters", "description": "Label on 'Fetch Chapters' button under 'Developer Stuff'" diff --git a/plugin/js/ErrorLog.js b/plugin/js/ErrorLog.js index 52b5a0f6..24e5396f 100644 --- a/plugin/js/ErrorLog.js +++ b/plugin/js/ErrorLog.js @@ -20,13 +20,16 @@ class ErrorLog { ErrorLog.getErrorSection().hidden = false; ErrorLog.setErrorMessageText(msg); - document.getElementById("errorButtonOk").onclick = function () { - ErrorLog.queue.shift(); - if (ErrorLog.queue.length === 0) { - ErrorLog.restoreSectionVisibility(sections); - } else { - ErrorLog.setErrorMessageText(ErrorLog.queue[0]); - }; + ErrorLog.setErrorMessageButtons(msg, sections); + } + + static onCloseError(sections) { + ErrorLog.queue.shift(); + if (ErrorLog.queue.length === 0) { + ErrorLog.restoreSectionVisibility(sections); + } else { + ErrorLog.setErrorMessageText(ErrorLog.queue[0]); + ErrorLog.setErrorMessageButtons(ErrorLog.queue[0], sections); }; } @@ -63,6 +66,32 @@ class ErrorLog { ErrorLog.history.push(textRow.textContent); } + /** private */ + static setErrorMessageButtons(msg, sections) { + let close = () => ErrorLog.onCloseError(sections); + let okButton = document.getElementById("errorButtonOk"); + let retryButton = document.getElementById("errorButtonRetry"); + let cancelButton = document.getElementById("errorButtonCancel"); + if (msg.retryAction !== undefined) { + okButton.hidden = true; + retryButton.hidden = false; + retryButton.onclick = function() { + close(); + msg.retryAction(); + }; + cancelButton.hidden = false; + cancelButton.onclick = function() { + close(); + msg.cancelAction(); + }; + } else { + okButton.hidden = false; + okButton.onclick = close; + retryButton.hidden = true; + cancelButton.hidden = true; + } + } + /** private */ static restoreSectionVisibility(sections) { for(let [key,value] of sections) { diff --git a/plugin/js/HttpClient.js b/plugin/js/HttpClient.js index 2e52c79d..f3170274 100644 --- a/plugin/js/HttpClient.js +++ b/plugin/js/HttpClient.js @@ -21,17 +21,22 @@ class HttpClient { static wrapFetchImpl(url, handler) { return fetch(url, HttpClient.makeOptions()).then(function(response) { - return HttpClient.checkResponseAndGetData(handler, response); + return HttpClient.checkResponseAndGetData(url, handler, response); }).catch(function (error) { let errorMsg = chrome.i18n.getMessage("htmlFetchFailed", [url, error.message]); return Promise.reject(new Error(errorMsg)); }); } - static checkResponseAndGetData(handler, response) { + static checkResponseAndGetData(url, handler, response) { if(!response.ok) { let errorMsg = chrome.i18n.getMessage("htmlFetchFailed", [response.url, response.status]); - return Promise.reject(new Error(errorMsg)); + let msg = new Error(errorMsg); + return new Promise(function(resolve, reject) { + msg.retryAction = () => resolve(HttpClient.wrapFetchImpl(url, handler)); + msg.cancelAction = () => reject(new Error(errorMsg)); + ErrorLog.showErrorMessage(msg); + }); } else { handler.setResponse(response); return handler.extractContentFromResponse(response); diff --git a/plugin/popup.html b/plugin/popup.html index 5273a8f6..5d0c453c 100644 --- a/plugin/popup.html +++ b/plugin/popup.html @@ -42,6 +42,8 @@