Как реализовать передачу сообщений в расширении Firefox? - PullRequest
5 голосов
/ 22 ноября 2011

У меня есть файл, который перезаписывает overlay.xul, который перезаписывает browser.xul.Я хочу реализовать передачу сообщений аналогично тому, как это реализовано в расширениях Chrome.

chrome.manifest-

content helloworld content/
overlay chrome://browser/content/browser.xul    chrome://helloworld/content/overlay.xul
overlay chrome://navigator/content/navigator.xul    chrome://helloworld/content/overlay.xul


skin    helloworld  classic/1.0 skin/
style   chrome://global/content/customizeToolbar.xul    chrome://helloworld/content/overlay.css

Как зарегистрировать content_script.js, что в моем случае overlay.js?

Overlay.xul -

 <script type="application/x-javascript" src="chrome://helloworld/content/jquery.js" />
 <script type="application/x-javascript" src="chrome://helloworld/content/overlay.js" />
 <script type="application/x-javascript" src="chrome://helloworld/content/background.js" />

Теперь внутри моего overlay.js Я использую -

document.documentElement.addEventListener('click', function(e) {

     messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});

}, true);

А background.js - это

 addMessageListener("MyMessenger.MyMessage", function(obj) {

    Firebug.Console.log(obj.name);
}, true);
  • Какой правильный синтаксис для передачи сообщений?
  • Как настроить соединение между скриптом содержимого и скриптом браузера?

1 Ответ

0 голосов
/ 25 ноября 2011

Если все, что вас интересует, - это действительно внедрение скрипта контента и связь с ним, тогда будет проще использовать Add-on SDK , в частности пакет page-mod ,Он позволяет легко внедрять сценарии содержимого и обеспечивает способ общения (см. Раздел «Связь со сценариями содержимого» в упомянутых мной документах).

Что касается messageManager, то он предназначен для многопроцессорной среды, ноэто будет работать и в текущем однопроцессном Firefox.Основная проблема с вашим кодом выше: addMessageListener не является глобальной функцией, вы должны вызвать messageManager.addMessageListener().Но использование messageManager для передачи сообщений между сценариями, которые загружаются в одно и то же пространство имен и могут вызывать друг друга напрямую, в любом случае является излишним.

Для связи со сценарием содержимого на текущей вкладке сценарий в наложенииdo:

gBrowser.selectedBrowser.messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});

И скрипт содержимого действительно будет иметь addMessageListener в качестве глобальной функции, поэтому это должно работать:

addMessageListener("MyMessenger.MyMessage", function(obj) {
  console.log(obj.name);
});
...