2012-01-04 42 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

是的,我認爲每次顯示面板時都會重新加載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); 
    } 
}); 
相關問題