我想在我的扩展程序的首选项中存储一个值(一个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解释了错误的起源,但我的偏好如下所示,所以我不明白这个问题。
答案 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();
...
}
还有其他选择,例如使用mozISubscriptLoader
或Sandboxes,但我并没有真正可以轻松复制的独立代码。