diff --git a/README.md b/README.md index 09bc078..af48247 100644 --- a/README.md +++ b/README.md @@ -296,7 +296,7 @@ An `EventEmitter` instance that emits the following events: | `browser_connect` | `ws` | Browser connected | | `browser_disconnect` | `{}` | Browser disconnected | | `dom_ready` | `{ id, index, status, active, title, url, container }` | A tab finished loading | -| `dom_load_fail` | `{ id }` | A tab failed to load | +| `dom_load_fail` | `{ id, url, error }` | A tab failed to load (Network error, `<=400` code) | | `web_request` | `{ id, url, status, origin, type, method, container, headers }` | A request was sent | | `web_response` | `{ id, url, status, origin, type, method, container, body }` | A response was received | diff --git a/ext/bg.js b/ext/bg.js index dccd608..e6fb26c 100644 --- a/ext/bg.js +++ b/ext/bg.js @@ -15,7 +15,7 @@ var proxy_map = {}; var web_response_whitelist = ["main_frame", "xmlhttprequest"]; -const log_debug = true; +const log_debug = false; browser.browserAction.setBadgeBackgroundColor({ color: [0, 0, 0, 0] @@ -638,16 +638,56 @@ browser.tabs.onUpdated.addListener(function(tabid, event, tab){ } }); +browser.webRequest.onHeadersReceived.addListener(function(page){ + + if(page.type != "main_frame"){ + + return + }; + + // send error on 4xx code + if(page.statusCode >= 400){ + + send_event( + global_ws, + { + "action": "dom_load_fail", + "data": { + id: page.tabId, + url: page.url, + error: page.statusLine.trim() + } + } + ); + } + }, + { urls: [""] } +); + browser.webNavigation.onErrorOccurred.addListener(function(page){ - if(connected === false){ return; } + if( + connected === false || + // must be an error in parent frame + page.frameId !== 0 || + // ignore HSTS error. See: + // https://bugzilla.mozilla.org/show_bug.cgi?id=1801326 + page.error == "Error code 2152398850" || + // page-load abort + page.error == "NS_BINDING_ABORTED" + ){ + + return; + } send_event( global_ws, { "action": "dom_load_fail", "data": { - id: page.tabId + id: page.tabId, + url: page.url, + error: page.error } } );