用于Firefox扩展的nsIPrefBranch返回NS_ERROR_UNEXPECTED

时间:2013-09-11 00:57:11

标签: android firefox-addon firefox-addon-sdk xpcom

我想在我的扩展程序的首选项中存储一个值(一个firefox for android ext)。所以,在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)"

This post解释了错误的起源,但我的偏好如下所示,所以我不明白这个问题。

1 个答案:

答案 0 :(得分:1)

Bootstrapped(无重启)加载项不支持通过defaults/preferences自动预设。您的引导代码负责相应地设置默认首选项。

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

您需要get the default branch and seed your preferences。一个简单的方法是:

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();
  ...
}

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