0

Firefoxのネイティブメッセージを使用してURLインスペクタを作成しようとしています。問題は、ネイティブアプリケーションが判定を送信するときに、onBeforeRequestリスナーがすでに要求をリリースしているため、リダイレクトが発生しないことです。 返信が2秒間待つようにして、回答が「0」の場合はリクエストをリダイレクトできますか?Firefoxのネイティブメッセージを使用したURL検査

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"] 
); 

答えて

0

まったくありません。

ネイティブメッセージングは​​非同期APIです。メッセージを送信した後は、イベントループに戻るまでは返信を受け取りません(現在のコードが終了するなど)。

ただし、WebRequest APIをブロックするには、の同期が必要です。非同期応答が不明確な遅延の後に来ることは決してないかもしれないし、ネットワークスタックがそれが起こるのを待つこともないので、これは核心の制限です。つまり、APIの設計はそれを意図的に禁止しています。

基本的に:返信が準備されていても、inspectURLが終了するまで、コードはそれを受け取ることはありません。この時点で、WebRequestはすでにリクエストを処理しています。 There is no way in JavaScriptを同期させる必要があります。

0

Firefoxの

Firefoxは以降のFirefox 52からの非同期webRequestのブロッキング/変更リスナーをサポートしています。そう(:webRequest: Modifying requests(および複数の他のページ)MDN):行うには

をFirefoxの52年以降、代わりにBlockingResponseを返すので、リスナーはBlockingResponseで解決されPromiseを返すことができます。これにより、リスナーは要求を非同期に処理できます。

したがって、お客様のwrbRequest.onBeforeRequestリスナーでは、BlockingResponseで解決する約束を返します。

portから情報を要求したリクエストのリストを保存する必要があります。 portresponseは、応答しているリクエストを一意に識別する必要があります。これはすべて非同期であるため、複数のリクエストを同時に飛行することができます。これらを適切に追跡し、適切な約束であるresolveのみを追跡する必要があります。 portからの返信が急激に変化しないとすれば、チェック済みのURLのリストを保存しておく必要があります。これにより、すでにチェックされているURLにすぐに応答することができます。

クロム

あなたが望むのはクロームではできません。他の方法で問題を解決する必要があります。

関連する問題