FF Addon (JPM) Передача сообщения из скрипта Panel в основной индексный скрипт

Я разрабатываю расширение FireFox с использованием JPM Addon. Я загружаю панель из основного файла index.js примерно так...

var panel = require('sdk/panel');
var panel = panel.Panel({
    contentURL: url('pages/popup.html'),
    onHide: doHide
});

//and in another place...
panel.show({
            position: button
        });

Файл pages/popup.html ссылается на файл javascript, и я использую относительный путь для его загрузки. Мне нужно выяснить, как передать сообщение из этого файла javascript, загруженного веб-страницей панели, в основной файл сценария index.js дополнения.

Я пробовал postMessage так же, как port.emit...

Так что либо

//index.js
panel = require("sdk/panel").Panel({
  onMessage: function(message) {
    console.log(message);
  }
});

//popup.js - panel file
panel.postMessage('something');

...или же...

//index.js
panel.on("message", function(text) {
  console.log(text);
});

//popup.js
self.port.emit('message', 'hello world');

Тем не менее, оба из них, похоже, не работают. Помогите!

1 ответ

Решение

Вам следует прочитать раздел " Сценарии содержания доверенной панели " на странице MDN SDK / Panel. Наиболее актуальный текст:

Как и сценарий содержимого, эти сценарии могут взаимодействовать с кодом дополнения с помощью postMessage() API или port API. Принципиальное отличие состоит в том, что эти сценарии получают доступ к postMessage а также port объекты через addon объект, а контентные скрипты обращаются к ним через self объект.

Итак, ваш код popup.js должен быть:

addon.port.emit('message', 'hello world');

И ваш index.js:

panel.port.on("message", function(text) {
  console.log(text);
});

В разделе " Сценарии содержимого доверенной панели " есть пример надстройки, показывающий взаимодействие в обоих направлениях между доверенной панелью (содержимое панели происходит из надстройки) и основным фоновым сценарием надстройки.

Другие вопросы по тегам