1

アドオンにあるHTMLページにアドオン(webextension)からのメッセージを送信しようとしています。 webextension APIは、Chromeブラウザと互換性のあるChromeインターフェイスを使用しています。私はFirefox 48ベータ版を使用しています。アドオンページにメッセージが表示されないのはなぜですか?

これは、バックグラウンドスクリプト(「開始ページ」のメッセージが重要である)である:アドオンモジュール「easy_options」からメッセージを受信したとき、それはそのeasy_options.htmlニーズを意味し、そう

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.js(chrome.runtime.onMessageリスナーが追加された場合、再び、第二部は重要です):

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) (B) 3. addons optionsスクリプトは、runtime.OnMessageリスナーの最初のメッセージ(A)を受信します(このメッセージを処理したくありません)。

何が起こるべきですか 1.私はメッセージを送ります(B) 3. addons optionsスクリプトは、runtime.OnMessageリスナーの最初のメッセージ(A)を受け取ります(このメッセージを処理したくありません) ) 4. addons optionsスクリプトは、runtime.OnMessageリスナーで2番目のメッセージ(B)を受け取る必要があります。処理する必要があります。

質問: 4番目の手順はなぜ行われませんか?メッセージ(Bエイリアスの "initiate-page-response")が受信されないのはなぜですか?

多分Chromeアドオンプログラマーが助けてくれるかもしれませんが、私は同じように動作するはずです。

+0

クイックの質問は、なぜあなたもやっているこのメッセージング往復? – Xan

答えて

3

コンテンツスクリプトではない拡張ページなので、chrome.tabs.sendMessageには届きません。

chrome.runtime.sendMessageでメッセージをブロードキャストして、オプションページなどのchrome-extension://ページにアクセスする必要があります。

あなたがruntime.sendMessageのブロードキャストの性質が気に入らない場合は、送信者に(おそらく望ましい)を応答を渡すためにsendResponseコールバック引数を使用、またはruntime.connectで長寿命のポートを確立すべきです。 XANの説明に

+0

ありがとうございます – user1141649

+0

はsendResponseがruntime.onMessageで受け取ったはずですか?私はそれを試して、正常に応答を送ったが、私はまだアドオンオプションのページでメッセージを受け取ることができません。 – user1141649

+0

いいえ、 'sendResponse'は第2引数として' runtime.sendMessage'に与えられたコールバックによって受け取られます。'sendResponse'への呼び出しが非同期である場合、' onMessage'ハンドラから 'true'を返す必要があることに注意してください。 – Xan

1

おかげで、私が発見した、これは魔法のように動作

背景スクリプト:

chrome.runtime.onMessage.addListener( 
    function(package, sender, sendResponse 
    ){ 
    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":    
      sendResponse(
       { message:"initiate-page-response", 
       subject:"accept-namespace", 
       recepient: {id: package.sender.id }, 
       module: package.module, 
       namespace: myNamespace, 
       info: "response to initiate-page message" 
       } 
      ) 
      break; 
      } 
      } 
     break; 
    } 
    } 
) 
アドオンのオプションページスクリプト

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} 
     }, 
     function response(message){ 
     console.log("RESPONSE:"); 
     console.log(message); 
     return true; 
     } 
    ) 
    } 
); 
+1

最後の 'return true;'は余分です。 'onMessage'と' sendMessage() 'が非同期に呼び出される場合にのみ必要です。 – Xan

関連する問題