2013-09-11 45 views
0

我想在我的擴展的首選項(一個用於android ext的firefox)中存儲一個值。所以,在的prefs.js文件(下默認/首選項/)我寫:nsIPrefBranch for Firefox for android擴展返回NS_ERROR_UNEXPECTED

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

然後,在boostrap.js我得到的偏好分支:

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

但是,當我嘗試獲取ID用戶價值是這樣的:

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

我得到這個錯誤:`

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

This post解釋錯誤的起源,但我的偏好,因爲我表明波紋管設置,所以我不明白這個問題。

+0

對不起,該帖子的鏈接是:http://stackoverflow.com/questions/9120176/trying-to-use-nsiprefbranch-to-store-data-on-firefox-extension-gives-ns-error-un – user2102196

回答

1

引導式(無重啓)加載項不支持通過defaults/preferences的自動首選項。引導程序代碼的責任是相應地設置默認首選項。

由於您的auto-prefs從未加載,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,但我真的沒有什麼可以輕易複製爲單機代碼。

+0

感謝您的回覆nmaier,在這種情況下,基於Mark的文章,一旦會話結束,首選項將消失。但是,我希望它是永久的。此外,還有一個使用auto-prefs的擴展[「Lock」](https://addons.mozilla.org/fr/android/addon/lock/),它工作的很好,所以我覺得這很奇怪。 – user2102196

+0

只有默認的首選項消失。如果用戶或代碼將其設置爲非默認值,則首選項確實會保留。 (注意'getBranch()'和'getDefaultBranch()之間的區別'我發佈的代碼實際上足以使其工作。實際上,非引導擴展的加載器將會使用'defaults/preferences/*。js'。「Lock」加載項在這方面被打破了。我在問題中添加了一個鏈接到我的答案。 – nmaier

+0

感謝Nils的解釋,我嘗試了你的代碼,它完美的工作。 再次感謝你的幫助。 – user2102196