アドオン (webextension) からアドオン内の html ページにメッセージを送信しようとしています。webextension API は、Chrome ブラウザーと互換性のある chrome インターフェイスを使用しています。Firefox 48 ベータ版を使用しています。
これはバックグラウンド スクリプトです (「ページの開始」メッセージが重要です)。
chrome.runtime.onMessage.addListener(
function(package, sender
){
switch (package.message){
case "open":
if (package.subject == "tab")
{
win = myNamespace.tabs[package.module];
result = win ? false : true;
if (result)
chrome.tabs.create(
{"url": package.url },
function(tab) {
if (chrome.extension.lastError )
console.log(chrome.extension.lastError);
else
myNamespace.tabs[package.module] = tab.id;
chrome.tabs.onRemoved.addListener(
function( tabId, removeInfo )
{
for (var k in myNamespace.tabs )
{
if (tabId === myNamespace.tabs[k])
{
myNamespace.tabs[k] = null;
break;
}
}
}
);
}
);
}
break;
case "initiate-page":
if (package.subject == "html-add-listeners")
{
switch(package.module){
case "easy_options":
case "advanced_options":
case "images_options":
chrome.tabs.sendMessage(
package.sender.id,
{ message:"initiate-page-response",
subject:"accept-namespace",
recepient: {id: package.sender.id },
module: package.module,
namespace: myNamespace,
info: "response to tab exists message"
}
)
break;
}
}
break;
}
}
)
そのため、アドオンがモジュール「easy_options」からメッセージを受信すると、easy_options.html がそのドキュメントにロードするデータが必要であることを意味します。したがって、データを含む名前空間でメッセージを送信します。
次に、アドオン ページ easy_options.js (ここでも、chrome.runtime.onMessage リスナーが追加される 2 番目の部分が重要です):
chrome.tabs.query(
{ active: true, currentWindow: true},
function(tabs) {
browser.runtime.sendMessage(
{ message:"initiate-page",
subject: "html-add-listeners",
module: "easy_options",
sender:{id:tabs[0].id}
}
)
}
);
chrome.runtime.onMessage.addListener(
function(package, sender
){
switch (package.message){
case "initiate-page-response":
if (package.subject == "accept-namespace")
{
switch(package.module){
case "easy_options":
document.addEventListener('DOMContentLoaded', myNamespace.easy.restore);
document.getElementById("easy_form_save").addEventListener("submit", myNamespace.easy.save);
document.getElementById("easy_form_restore").addEventListener("submit", myNamespace.easy.restore);
document.getElementById("easy_form_remove_item").addEventListener("submit", myNamespace.easy.remove_profiles);
document.getElementById("easy_form_remove_profiles").addEventListener("submit", myNamespace.easy.remove_profiles);
document.getElementById("list").addEventListener("change", myNamespace.easy.restoreDefault);
break;
}
}
break;
}
}
)
何が起こるか: 1. メッセージ (A) をバックグラウンド リスナーに送信し、メッセージを受け入れる 2. バックグラウンド リスナーがメッセージ (B) を送信 3. アドオン オプション スクリプトがランタイムで最初のメッセージ (A) を受信します。このメッセージを処理したくない)
1. メッセージ (A) をバックグラウンド リスナーに送信し、メッセージを受け入れる 2. バックグラウンド リスナーがメッセージ (B) を送信する 3. アドオン オプション スクリプトがランタイムで最初のメッセージ (A) を受信する。このメッセージを処理したい) 4. アドオン オプション スクリプトは、runtime.OnMessage リスナーで 2 番目のメッセージ (B) を受信し、それを処理する必要があります。
質問: 4 番目のステップが発生しないのはなぜですか? なぜメッセージ (B エイリアス "initiate-page-response") が受信されないのですか?
たぶん Chrome アドオン プログラマーも助けてくれるでしょう。同様に機能するはずです。