Firefox Addons SDK - Как получить доступ к простому хранилищу из скрипта контента? - PullRequest
8 голосов
/ 04 января 2012

Я использую новый FireFox Addons SDK для разработки расширения. У меня есть виджет с прикрепленной панелью. Панель используется для управления настройками, поэтому мне нужно получить доступ к API простого хранилища из скрипта содержимого панели. Я знаю, что вы не можете получить доступ к API напрямую, поэтому я попытался использовать передачу сообщений. Вот что у меня есть:

exports.main = function() {
    var panel = require('panel');
    var ss = require('simple-storage');

    var prefPanel = panel.Panel({
        contentURL: self.data.url('prefPanel.html'),
        contentScriptFile: self.data.url('prefPanel.js'),
        contentScriptWhen: 'ready',
        onMessage: function(message) {
            switch(message.method) {
                case 'setValue':
                    ss.storage[message.key] = message.value;
            }
        },
    });

    prefPanel.postMessage(ss.storage);


    require('widget').Widget({
        id: 'ml-pref-button',
        content: 'ML',
        width: 30,
        panel: prefPanel,
    })
}

и в prefPanel.js я получил:

self.on('message', function(storage) {

    storage.setValue = function(key, value) {
        this[key] = value;
        self.postMessage({
            method: 'setValue',
            'key': key,
            'value': value,
        });
    }

    // Do some stuff, using storage object

});

Проблема в том, что я получаю эту ошибку:

Error: An exception occurred.
Traceback (most recent call last):
  File "resource://jid0-wdemwzahwzh3bsw0kkxlcjg9e7k-at-jetpack-api-utils-lib/content/worker.js", line 405, in postMessage
    throw new Error(ERR_DESTROYED);
Error: The page has been destroyed and can no longer be used.

Полагаю, это потому, что prefPanel DOM и скрипты контента еще не загружены. Перезагружаются ли DOM и сценарии содержимого каждый раз, когда отображается панель, или они всегда работают в фоновом режиме?

1 Ответ

3 голосов
/ 05 января 2012

Да, я думаю, что DOM и скрипты контента перезагружаются при каждом показе панели (вы можете легко проверить, правильно ли это, просто вставьте вызов console.log("loaded") в ваш скрипт контента).Таким образом, вы должны просто отправить свое сообщение, когда панель отображается:

var prefPanel = panel.Panel({
    contentURL: self.data.url('prefPanel.html'),
    contentScriptFile: self.data.url('prefPanel.js'),
    contentScriptWhen: 'ready',
    onMessage: function(message) {
        switch(message.method) {
            case 'setValue':
                ss.storage[message.key] = message.value;
        }
    },
    onShow: function() {
        prefPanel.sendMessage(ss.storage);
    }
});
...