2010-09-26 10 views
10

Zastanawiam się, czy możliwe jest uzyskanie wartości określonych preferencji ustawionych w about: config using javascript?o preferencjach konfiguracji i js

Zachętą jest uzyskanie wartości preferencji określonych w addexie firefox, który utworzyłem, gdy użytkownik znajdzie się na frontowym interfejsie użytkownika. Zasadniczo próbuję zidentyfikować użytkowników lądujących na FE bez pytania o jawne logowanie.

Odpowiedz

8

Tak, możesz.

Najpierw musisz wiedzieć, że Mozilla używa interfejsów XPCOM dla systemu preferencji.

Trzy używane interfejsy są nsIPrefService, nsIPrefBranch i nsIPrefBranch2.

Usługa preferencji jest tworzona w taki sam sposób, jak tworzenie instancji dowolnej XPCOM service.

Dwa przykłady, aby było jasne:

// 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."); 

I są 3 rodzaje preferencji, oni ciąg, całkowitą i logiczna. Istnieje sześć metod w nsIPrefBranch odczytujących i zapisujących preferencje: getBoolPref(), setBoolPref(), getCharPref(), setCharPref(), getIntPref() i setIntPref().

Więcej przykładów na to:

// 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) 

Można również użyć złożonych typów. Używając nsISupportsString, który jest używany do obsługi ciągów w preferencjach, użyj tego, gdy wartość preferencji może zawierać znaki spoza ASCII.

Przykład:

// 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); 

Mam nadzieję, że rozwiąże wątpliwości z tym.

Więcej o this page.

+0

Firefox dodał moduł Service.jsm, który ułatwia dostęp do wszystkich interfejsów: https://developer.mozilla.org/en/JavaScript/Code_modules/Services.jsm –

+0

Hmmm, legal, Dzięki za cynk. ;) – Guilherme

+0

Dzięki za odpowiedź. Ta technika używam na addonie w celu przechowywania preferencji. Ale to nie działa, ponieważ ten kod jest wykonywany w przestrzeni nazw addon i potrzebowałem js, który zostanie załadowany na FE i pobrać preferencje z Addon. Nie jest dozwolone z przestrzeni nazw js bez ostrzeżenia użytkownika o działaniu. Próbowałbym uniknąć zmiany html ze skryptem z Addon, ale jeśli nie znajdę żadnego innego rozwiązania zmieniającego html byłoby do zaakceptowania. –

Powiązane problemy