0

我想在我的扩展(android ext 的 firefox)的首选项中存储一个值。所以,在 prefs.js 文件(在 defaults/preferences/ 下)我写:

pref("extensions.trackdetect.idUser","nothing");

然后,在 boostrap.js 中,我得到了偏好分支:

var prefs = Components.classes["@mozilla.org/preferences-service;1"]
                .getService(Components.interfaces.nsIPrefService).getBranch("extensions.trackdetect.");

但是,当我尝试像这样获取 idUser 值时:

var idPref = prefs.getCharPref("idUser");

我收到此错误:`

Exception... "Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPrefBranch.getCharPref]"  nsresult: "0x8000ffff (NS_ERROR_UNEXPECTED)"

这篇文章解释了错误的起源,但我的偏好设置如下,所以我不明白这个问题。

4

1 回答 1

1

自举(无重启)附加组件不支持通过defaults/preferences. 您的引导代码有责任相应地设置默认首选项。

由于您的自动首选项从未加载,因此getCharPref()调用必须失败。

您将需要获取默认分支并播种您的偏好。一个简单的方法是:

const PREF_BRANCH = "extensions.myaddon.";
const PREFS = {
  someIntPref: 1,
  someStringPref: "some text value"
};

function setDefaultPrefs() {
  let branch = Services.prefs.getDefaultBranch(PREF_BRANCH);
  for (let [key, val] in Iterator(PREFS)) {
    switch (typeof val) {
      case "boolean":
        branch.setBoolPref(key, val);
        break;
      case "number":
        branch.setIntPref(key, val);
        break;
      case "string":
        branch.setCharPref(key, val);
        break;
    }
  }
}

function startup(aData, aReason) {
  // Always set the default prefs as they disappear on restart
  setDefaultPrefs();
  ...
}

还有其他选择,例如 usingmozISubscriptLoaderSandboxes,但我并没有可以轻松复制的独立代码。

于 2013-09-11T12:00:45.653 回答