1

我正在使用在线 Firefox Addon Builder ( https://builder.addons.mozilla.org ) 来开发我的插件,但我在简单存储方面遇到了一些问题。对于下面的代码,我在控制台上得到相同的信息,每次我运行它(使用插件生成器上的“测试”选项),即,该值似乎没有被存储:

var ss = require("sdk/simple-storage");

console.log("BEFORE INIT");
console.log(JSON.stringify(ss.storage));

if (!ss.storage.pages)
    ss.storage.pages = [];

console.log("AFTER INIT");
console.log(JSON.stringify(ss.storage));

安慰:

[14:32:38.892] info: xxx: BEFORE INIT
[14:32:38.893] info: xxx: {}
[14:32:38.893] info: xxx: AFTER INIT
[14:32:38.893] info: xxx: {"pages":[]}

我假设发生这种情况是因为插件构建器在每次我运行测试时都会创建一个新的测试包,并且存储是插件私有的(显然是同一个插件中的每个测试包):

[14:31:36.165] "installing from /xpi/test/2d6e6appf76kg/"
...
[14:32:36.378] "installing from /xpi/test/2d6e6appf7r40/"

我尝试重新启动 Firefox,然后它似乎可以工作(在控制台上显示正确的东西)。如何调试我的代码而无需不断地重新启动 firefox?

4

1 回答 1

3

其根源是 SDK 的预期行为和 builder-addon 操作方式的混合。

  • SDK 实际上会在卸载时清除存储。此行为是有意的,但在使用常规 UI 卸载加载项时会被破坏。
  • 构建器(实际上是辅助插件)将始终卸载旧版本并重新安装新版本并通过这样做清除简单存储。

有几种解决方法可以让您保留简单存储数据

  • 不要使用构建器,而是使用带有--profiledir=PROFILEDIR
  • 在更新之前始终禁用插件((ab)使用上面提到的损坏行为)。
  • 根本不要使用该simple-storage模块。与 LocalStorage 一样,它本质上是同步的,在主线程上执行同步 I/O,这确实会损害性能。如果您只有几个短值,请使用首选项,例如通过simple-prefs模块。如果您有很多数据,最好使用类似OS.File. 如果你需要一些相关的东西,那么考虑使用indexed-dbor SQLite.jsm。对于OS.File和/或SQLite.jsm,您将需要chrome 访问权限
于 2013-10-27T18:34:28.640 回答