2010-09-26 17 views
10

Mi chiedo se sia possibile ottenere valori di determinate preferenze impostate in about: config using javascript?sulle preferenze di configurazione e js

L'incentivo è ottenere il valore delle preferenze impostate nell'addon di firefox che ho creato quando l'utente atterra sul front-end di addon. Fondamentalmente, sto cercando di identificare gli utenti che atterrano su FE senza chiedere loro di accedere esplicitamente.

risposta

8

Sì, è possibile.

Innanzitutto, è necessario sapere che Mozilla utilizza le interfacce XPCOM per il sistema delle preferenze.

Tre interfacce utilizzate sono nsIPrefService, nsIPrefBranch e nsIPrefBranch2.

Il servizio di preferenze viene istanziato nello stesso modo in cui si crea uno XPCOM service.

Due esempi per mettere in chiaro:

// Get the root branch 
var prefs = Components.classes["@mozilla.org/preferences-service;1"] 
        .getService(Components.interfaces.nsIPrefBranch); 

.

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

E ci sono 3 tipi di preferenze, sono stringa, intero e booleano. Ci sono sei metodi in nsIPrefBranch che leggono e scrivono le preferenze: getBoolPref(), setBoolPref(), getCharPref(), setCharPref(), getIntPref() e setIntPref().

Altri esempi su quella:

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

// prefs is an nsIPrefBranch. 
// Look in the above section for examples of getting one. 
var value = prefs.getBoolPref("typeaheadfind"); // get a pref (accessibility.typeaheadfind) 
prefs.setBoolPref("typeaheadfind", !value); // set a pref (accessibility.typeaheadfind) 

È anche possibile utilizzare tipi complessi. Usando nsISupportsString, viene usato per gestire le stringhe nelle preferenze, quindi usalo quando il valore di preferenza può contenere caratteri non ASCII.

Esempio:

// prefs is an nsIPrefBranch 

// Example 1: getting Unicode value 
var value = prefs.getComplexValue("preference.with.non.ascii.value", 
     Components.interfaces.nsISupportsString).data; 

// Example 2: setting Unicode value 
var str = Components.classes["@mozilla.org/supports-string;1"] 
     .createInstance(Components.interfaces.nsISupportsString); 
str.data = "some non-ascii text"; 
prefs.setComplexValue("preference.with.non.ascii.value", 
     Components.interfaces.nsISupportsString, str); 

Spero che a risolvere il dubbio con questo.

Ulteriori informazioni su this page.

+0

Firefox ha aggiunto il modulo Service.jsm che facilita l'accesso a tutte le interfacce: https://developer.mozilla.org/en/JavaScript/Code_modules/Services.jsm –

+0

Hmmm, legale, Grazie per il suggerimento. ;) – Guilherme

+0

Grazie per la risposta. Questa tecnica che ho usato su addon per memorizzare le preferenze. Ma questo non funziona per me dal momento che questo codice viene eseguito sullo spazio dei nomi addon e ciò di cui avevo bisogno era js che verrà caricato su FE e recupererà le preferenze da addon. Non è consentito dallo spazio dei nomi js senza che l'utente sia avvisato dell'azione. Cercherò di evitare di alterare html con script da addon, ma se non trovo altra soluzione alterando html sarebbe accettabile. –

Problemi correlati