2

我目前正在使用Chrome擴展程序,無法找到方便的解決方案來發送背景上下文(讓我們稱之爲BG)的上下文一個注入的腳本(可以叫它INJ)。發送郵件從INJBG工作就像一個魅力。但我想BG做一個XMLHttpRequest這可能需要一些時間,所以我想發送此請求的評估INJChrome擴展程序:從後臺發送消息到注入的腳本

不幸的是,我不允許在INJ的背景下注冊聽衆。所以,我能想到的最好的解決方案包括:

  • 發送消息INJBG,一旦觸發XMLHttpRequest
  • 作爲請求返回BG存儲請求的結果當地
  • INJ重複發送進一步消息BG要求的結果,除非BG答案w ^結果。

也許是這樣的:

INJ

function whaitForResult() 
{ 
    chrome.runtime.sendMessage ({method: "getResult"}, function (response) 
    { 
    if (response.finished === "true") 
     // request finished, lets go on 
    else 
     setTimeout(whaitForResult, 100); 
    } 
} 
chrome.runtime.sendMessage({method : "triggerRequest"}, function(response) {}); 
whaitForResult(); 

BG

chrome.runtime.onMessage.addListener (function(request, sender, sendResponse) 
{ 
    if (request.method == "triggerRequest") 
    { 
    // startXMLHttpRequest(); 
    sendResponse ({}); 
    return true; 
    } 
    else if (request.method == "getResult") 
    { 
    if (finishedXMLHttpRequest()) 
     sendResponse ({finished:"true", result: resultFromXMLHttpRequest()}); 
    else 
     sendResponse ({finished:"false"}); 
    return true; 
    } 
}); 

我想這應該工作,但在我看來這是相當我SSY。所以我的問題:有沒有一種方便的方式發送消息到注入腳本?

如果我的擴展的概念是垃圾,請提出替代方案。但要做XMLHttpRequest我需要一些來自localStorage的變量,並且由於此數據非常敏感,所以我不想將這些變量傳遞給INJ的上下文。因此,做XMLHttpRequest in INJ不是一個選項。

回答

4

在我繼續之前,我想指出你只是在處理一個普通的內容腳本,而不是「注入腳本」(根據my definition)。

請勿在第一個請求(sendResponse({}))上發送回覆。相反,調用sendResponse當響應已經完成:

// Content script 
chrome.runtime.sendMessage({method: "getResultForRequest"}, function(response) { 

}); 
// Background page 
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    if (request.method == "getResultForRequest") { 
     $.ajax({success: sendResponse}); // Example 
     return true; 
    } 
}); 

截至本答案的上方說,你要對付的是不是一個注入腳本,但內容腳本。 script execution environment of the content script和頁面嚴格分開,所以頁面無法讀取變量。換句話說,你的前提是有缺陷的;將憑據從後臺頁面傳遞到內容腳本可以。

我建議不要使用localStorage,而是使用chrome.storage API。這個異步API允許內容腳本直接讀取擴展存儲的持久變量。因此,您不再需要背景或活動頁面。有關更詳細的比較和示例,請參閱this answer

注:有兩種情況,當它有意義,讓後臺網頁過程中的XHR:

  • 網頁塊的內容安全策略的目標URL(此affects Chrome extensions
  • 當前頁通過https提供,而請求的資源通過http提供。混合http和https將改變掛鎖的外觀,如果可能的話應該避免這種情況。

但是,否則,我建議使用chrome.storage API並在您的內容腳本中執行跨源http請求。

+0

謝謝,它的工作原理!並且也非常感謝您的補充:) – binfalse

相關問題