2011-06-17 18 views
2

"all_frames": trueを使用してすべてのページと内部iframeにコンテンツスクリプトファイルを挿入しましたが、ポップアップからの要求を送信するときにトップウィンドウのみがそれを受信して​​います。任意のアイデアはどのようにすべての内部フレームまたは少なくとも最後のフォーカスウィンドウ/ドキュメントに送信することができますか?Chrome拡張機能:内部iframe内のコンテンツスクリプトにsendRequestを送信しますか?

Popup.html (page action): 
=========== 
chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.sendRequest(tab.id, {...}, function(response) {...}); 
}); 

content_script.js 
================= 
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    sendResponse({...}); 
}); 

コンテンツスクリプトが内部フレームで動作していることを確認しました。

私は内部フレームにあるかもしれないテキスト選択を取得しようとしています。

(私はすべての、すべてのコンテンツのスクリプトによる接続をオープンしたくないちなみに、それは大きなオーバーヘッドです。)

+0

Firefoxでは、単に 'document.commandDispatcher.focusedWindow'または' document.commandDispatcher.focusedElement'を実行します。 –

答えて

3

問題は、一つのタブが一つだけonRequestリスナーを持つことができるということです。ですから、のみ iframeのスクリプトにメッセージを送信すると、ページ上の唯一ののiframeがある場合、その後、あなただけのiframe内でリスナーを作成する必要があります。

//listen to requests only inside iframe 
if(window!=window.top) { 
    chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
     ... 
    }); 
} 

あなたがリクエストを送信する場合親ページとiframeの両方、またはがあります。リクエストを聞く必要があるページのiframe - portsで通信する必要があります。

ポートにも同様の制限があります。ポートリスナーは1つだけ呼び出されますが、多くのポートを開くことができます。 iframeが1つのみの親ページがある場合は、2つの異なるポートに2つの接続を開くだけです。しかし、ページに多くのiframeがあり、各iframeにサブフレームがある場合は、最初にすべてのiframeを列挙して、それぞれに固有のポートを作成する必要があります。

PS。私はあなたが私はすべてのことで接続し、すべてのコンテンツのスクリプト

をオープンしたくないが、あなたはオンデマンドコンテンツのスクリプトを挿入したい場合は、chrome.tabs.executeScript()あり

によって何を意味するのかわかりません。

+0

ありがとう、私は 'sendRequest()'の代わりにあなたの提案された 'executeScript()'を使ってすべての内部フレームと通信し、 'sendRequest()'を使って応答を返します。 –

関連する問題