Extensions Chrome: Script d'arrière-plan Capturez les erreurs réseau et HTTP

Je développe une petite extension Chrome pour un usage personnel sur un cas très spécifique (automatisation du site Web) mais j'ai un problème. Comment puis-je saisir une erreur réseau sur un script en arrière-plan et appeler une certaine fonction.

J'ai mis en œuvre cette méthode:

chrome.webRequest.onErrorOccurred.addListener( handleNetworkError, {urls: ["http://*/*", "https://*/*"] }); 

Il détecte certaines erreurs de réseau, de ce que je vois manly ::net errors, DNS failing, networks changed etc.

Cependant, aujourd'hui, j'ai remarqué que les erreurs HTTP comme:

 GET https://example.com 522 (Origin Connection Time-out) 

N'a pas déclenché l'auditeur, comment puis-je fonctionner sur ceux-là aussi?

Avec l'aide de l'utilisateur @Xan, j'ai réussi à proposer ceci:

 function extractStatus(line) { var match = line.match(/[^ ]* (\d{3}) (.*)/); if (match) return {code: match[1], message: match[2]}; else return undefined; } chrome.tabs.query({active: true, lastFocusedWindow: true }, function(tabsArray) { tab = tabsArray[0]; scope = {urls: ["https://example.com/*"], tabId: tab.id}; console.log("Listening for errors..."); // ::net errors chrome.webRequest.onErrorOccurred.addListener(handleNetworkError, scope); // HTTP errors chrome.webRequest.onHeadersReceived.addListener(function(details) { var status = extractStatus(details.statusLine); if (!status) return; if (status.code.charAt(0) == '5' || status.code.charAt(0) == '4') handleNetworkError(); }, scope); }); 

Je suppose que, du point de vue de la pile de réseau webRequest / Chrome, cette demande est effectivement terminée. Vous devez donc vous connecter à un autre événement, par exemple

 function extractStatus(line) { var match = line.match(/[^ ]* (\d{3}) (.*)/); if(match) { return {code: match[1], message: match[2]}; } else { return undefined; } } chrome.webRequest.onHeadersReceived.addListener( function(details) { var status = extractStatus(details.statusLine); if(status) { // Do something based on status.code } }, {urls: ["<all_urls>"]} ); 

Notez que cet événement est en option bloquant: vous pouvez rediriger la demande si nécessaire.

Évidemment, cela créera beaucoup de travail pour votre extension; Dans l'extrait ci-dessus, l'auditeur ne bloque pas, mais si vous le faites bloquer, cela ralentira considérablement votre Chrome – utilisez-le uniquement lorsqu'il est absolument nécessaire et filtrez par URL s'il y a lieu.