2

現在、Chrome 拡張機能をいじっていますが、バックグラウンド コンテキスト ( BGと呼びましょう) から挿入されたスクリプトのコンテキスト ( INJと呼びましょう)にメッセージを送信するための便利なソリューションが見つかりません。INJからBGへのメッセージの送信は魅力的です。しかし、時間がかかるかもしれない をBGにやってもらいたいので、この依頼の評価をINJに送りたいと思います。XMLHttpRequest

残念ながら、 INJのコンテキストでリスナーを登録することはできません。したがって、私が考えることができる最良の解決策は次のとおりです。

  • INJからBGにメッセージを送信し、XMLHttpRequest
  • リクエストが返されるとすぐにBGはリクエストの結果をローカルに保存します
  • BGが結果で応答しない限り、 INJは結果を求めるメッセージを繰り返しBGに送信します。

多分このようなもの:

注射:

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;
  }
});

これでうまくいくはずですが、私の意見では、かなり面倒です。私の質問:挿入されたスクリプトにメッセージを送信する便利な方法はありますか?

私の拡張機能の概念がくだらない場合は、代替案を提案してください。しかし、これを行うには、XMLHttpRequestからいくつかの変数が必要です。このデータは非常に機密であるため、これらの変数をINJlocalStorageのコンテキストに渡したくありません。したがって、INJ で行うことはオプションではありません。XMLHttpRequest

4

1 に答える 1

4

先に進む前に、(私の定義によると) 「注入されたスクリプト」ではなく、通常のコンテンツ スクリプトを扱っていることを指摘しておきます。

最初の要求で応答を送信しないでください ( 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;
    }
});

この回答の冒頭で述べたように、扱っているのは挿入されたスクリプトではなく、コンテンツ スクリプトです。コンテンツ スクリプトのスクリプト実行環境とページは厳密に分離されているため、ページは変数を読み取ることができません。言い換えれば、あなたの前提には欠陥があります。バックグラウンド ページからコンテンツ スクリプトに資格情報を渡しても問題ありません。

localStorage ではなくchrome.storageAPI を使用することをお勧めします。この非同期 API により、コンテンツ スクリプトは、拡張機能によって保存された永続変数を直接読み取ることができます。したがって、背景やイベント ページはもう必要ありません。より詳細な比較と例については、この回答を参照してください。

注: バックグラウンド ページに XHR を処理させることが理にかなっているケースが 2 つあります。

  • ページのコンテンツ セキュリティ ポリシーがターゲット URL をブロックしている (これは Chrome 拡張機能に影響します)
  • 現在のページは https 経由で提供されますが、要求されたリソースは http 経由で提供されます。http と https を混在させると南京錠の外観が変わるため、可能であれば避ける必要があります。

chrome.storageそれ以外の場合は、 API を使用して、コンテンツ スクリプトでクロスオリジン http リクエストを実行することをお勧めします。

于 2013-06-29T12:57:43.773 に答える