0

Ich versuche, URL-Inspektor mit nativen Nachrichten von Firefox zu erstellen. Das Problem ist, wenn native Anwendung ein Urteil sendet, onBeforeRequest listen bereits freigegeben Anforderung, so dass Umleitung nicht erfolgt. Können Sie mir bitte helfen, meine Nebenstelle bis zu 2 Sekunden auf eine Antwort warten zu lassen und die Anfrage umzuleiten, wenn die Antwort "0" ist?URL-Prüfung mit nativen Nachrichten von Firefox

var port = browser.runtime.connectNative("ping_pong"); 

function inspectURL(requestDetails) { 
    console.log("Loading: <" + requestDetails.url + ">"); 
    port.postMessage(requestDetails.url); 
    console.log("Posting complete <" + requestDetails.url + ">"); 
} 

port.onMessage.addListener((response) = > { 
    console.log("Received: <" + response + ">"); 
    if (response == "1") 
    { 
     console.log("Good url!!!"); 
    } 
    else 
    { 
     console.log("BAD url - redirecting!!!"); 
     return { 
     redirectUrl: "https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif" 
     }; 
    } 
}); 

browser.webRequest.onBeforeRequest.addListener(
    inspectURL, 
    { urls: ["<all_urls>"] }, 
    ["blocking"] 
); 

Antwort

0

Es gibt überhaupt keinen Weg.

Native Messaging ist eine asynchrone API. Nach dem Posten einer Nachricht erhalten Sie keine Antwort, bis Sie zur Ereignisschleife zurückkehren (z. B. wird der aktuelle Code beendet).

Zum Blockieren der WebRequest API ist jedoch eine synchrone Antwort erforderlich. Dies ist eine Kernbeschränkung, da die asynchrone Antwort möglicherweise niemals nach einer unsicheren Verzögerung kommt oder kommt, und der Netzwerkstapel wird nicht darauf warten, dass dies geschieht. Ich meine, es könnte, aber das Design der API verbietet es absichtlich.

Grundsätzlich: auch wenn die Antwort bereit ist, wird Ihr Code nicht empfangen, bis inspectURL endet, zu diesem Zeitpunkt WebRequest bereits mit der Anfrage weiter. There is no way in JavaScript um es synchron zu machen.

0

Firefox

Firefox unterstützen asynchrone webRequest Blockier-/Modifikation Hörer von den folgenden 52 vorwärts. Um dies zu tun (MDN: webRequest: Modifying requests (und mehrere andere Seiten)):

Ab Firefox 52 ab, statt BlockingResponse zurückzukehren, kann der Hörer ein Promise zurück, die mit einem BlockingResponse behoben ist. Dadurch kann der Listener die Anforderung asynchron verarbeiten.

Also, in Ihrem wrbRequest.onBeforeRequest Zuhörer, kehren Sie ein Versprechen, das Sie mit dem BlockingResponse lösen.

Sie müssen eine Liste von Anfragen speichern, für die Sie Informationen von Ihrem port angefordert haben. Die response von Ihrer port muss die Anfrage eindeutig identifizieren, auf die sie antwortet. Beachten Sie, dass dies alles asynchron ist, sodass Sie mehrere Anfragen gleichzeitig im Flug haben können. Sie müssen diese und nur resolve das entsprechende Versprechen verfolgen. Angenommen, Ihre Antworten von Ihrer port werden nicht schnell geändert, sollten Sie eine Liste von URLs speichern, die überprüft wurden (sowohl gut als auch schlecht), so dass Sie sofort auf URLs reagieren können, die bereits überprüft wurden.

Chrome

Was Sie wünschen, ist in Chrome nicht möglich. Sie müssen Ihr Problem auf andere Weise lösen.

Verwandte Themen