0

我正嘗試使用Firefox本機訊息創建網址檢查器。問題是,當本地應用程序發送判決時,onBeforeRequest偵聽器已經釋放請求,因此重定向不會發生。 如果回答爲「0」,您可以請求幫助使我的擴展等待最多2秒的回覆並重定向請求嗎?使用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"] 
); 

回答

0

根本沒有辦法。

本地消息傳遞是一個異步API。發佈消息後,直到返回到事件循環(例如當前代碼終止)纔會收到回覆。

但是,阻止WebRequest API需要同步回覆。這是一個核心限制,因爲在不確定的延遲之後,異步回覆可能永遠不會到來,並且網絡堆棧不會等待發生。我的意思是,它可以,但API的設計故意禁止它。

基本上:即使回覆已準備就緒,您的代碼將不會收到它,直到inspectURL終止,此時WebRequest已經繼續執行請求。 There is no way in JavaScript使其同步。

0

火狐

Firefox支持從Firefox 52向前異步webRequest阻擋/修改聽衆。要做到這一點(MDN:webRequest: Modifying requests(和多個其他網頁)):

從Firefox 52開始,而不是返回BlockingResponse,聽者可以返回一個Promise其與BlockingResponse解決。這使偵聽器能夠異步處理請求。

因此,在您的wrbRequest.onBeforeRequest聽衆中,您返回了您用BlockingResponse解決的承諾。

您需要存儲您要求從您的port獲取信息的請求列表。您的port中的response需要唯一標識其響應的請求。請記住,這是全部異步的,因此您可以同時在飛行中有多個請求。你必須適當地跟蹤這些,只有適當的承諾resolve。假設你的port的響應不會迅速改變,你應該存儲已經檢查過的URL列表(無論是好還是壞),以便你可以立即迴應已經檢查過的URL。

Chrome

你想要的東西在Chrome中是不可能的。您需要以其他方式解決您的問題。