2012-01-04 9 views
8

新しいFireFox Addons SDKを使用して拡張機能を開発しています。私はパネルが付いたウィジェットを持っています。パネルは設定を制御するために使用されるので、パネルのコンテンツスクリプトからシンプルストレージAPIにアクセスする必要があります。 APIに直接アクセスすることはできないので、私はメッセージの受け渡しを使用しようとしています。Firefox Addons SDK - コンテンツスクリプトから簡単なストレージにアクセスするには?

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に私が持っている::相続人は私が持っているもの

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. 

私は推測する:問題がある

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 

}); 

が、私はこのエラーを取得しますprefPanel DOMとコンテンツスクリプトはまだロードされていないからです。パネルが表示されるたびにDOMスクリプトとコンテンツスクリプトが再読み込みされるのですか、または常にバックグラウンドで実行されていますか?

答えて

3

はい、私は、パネルが表示されるたびにリロードされると思います(それが正しいかどうかを簡単にテストできます)。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); 
    } 
}); 
関連する問題