Począwszy od Mozilla/XULRunner 1.8 istnieje sposób na dowiedzenie się na jakiej aplikacji, wersji aplikacji i wersji Gecko pracuje Twój kod.
Jest to bardzo przydatne np. dla rozszerzeń, które obsługują kilka aplikacji opartych o Mozillę lub kilka wersji pojedynczej aplikacji. Nie jest to przydatne dla skryptów na stronach internetowych, które powinny nadal używać obiektu navigator, gdy nie jest możliwa detekcja na podstawie cech przeglądarki.
Interfejs nsIXULAppInfo
Aby rozdróżnić różne aplikacje oparte o Mozillę, użyj zamrożonego interfejsu nsIXULAppInfo. Poniższe fragmenty zawierają kilka przykładów użycia nsIXULAppInfo
z poziomu JavaScriptu.
Zauważ że, mimo iż Firefox 1.5, Thunderbird 1.5 i inne aplikacje oparte o XULRunnera 1.8 obsługują nsIXULAppInfo
, starsze aplikacje, takie jak Firefox i Thunderbird 1.0, nie obsługują go. Będziesz musiał napisać dodatkowy kod dla starszych wersji.
Uzyskiwanie nsIXULAppInfo
Aby uzyskać komponent implementujący nsIXULAppInfo
użyj tego kodu:
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo);
(Po więcej wyjaśnień zajrzyj na ten artykuł z XUL Planet.)
Uzyskiwanie informacji o aplikacji
Po otrzymaniu komponentu możesz odczytać jego własności, aby uzyskać identyfikator aplikacji, nazwę rozumianą przez człowieka, wersję, platformę itd. Aby zobaczyć pełną listę własności nsIXULAppInfo
, zobacz opis interfejsu nsIXULAppInfo.
Identyfikator
Możesz dowiedzieć się na jakiej aplikacji pracujesz poprzez użycie własności nsIXULAppInfo.ID
.
const FIREFOX_ID = "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"; const THUNDERBIRD_ID = "{3550f703-e582-4d05-9a08-453d09bdfdc6}"; var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo); if(appInfo.ID == FIREFOX_ID) { // pracujemy pod Firefoksem } else if(appInfo.ID == THUNDERBIRD_ID) { // pracujemy pod Thunderbirdem } else { // inna aplikacja }
Uwaga: możesz również użyć własności nsIXULAppInfo.name
, która zwraca nazwę bardziej przyjazną dla człowieka, taką jak "Firefox" - ale kto wie, może znowu zmienią jej nazwę!
Wersja
Czasami musisz znać wersję aplikacji, na której działa Twój kod. Przykładowo, jedna z odmrożonych funkcji, na której polegałeś, została zmieniona.
Uwaga: nsIXULAppInfo
dostarcza informacji o aplikacji i platformie, bądź więc ostrożny i wybierz właściwą, zwłaszcza przy obsłudze aplikacji opartych o XULRunnera.
W takim przypadku chciałbyś prawdopodobnie sprawdzić nsIXULAppInfo.version
i/lub nsIXULAppInfo.appBuildID
. Druga własność jest użyteczna, jeśli zamierzasz obsługiwać rozwojowe wersje nightly aplikacji, natomiast pierwsza, gdy zamierzasz wspierać tylko oficjalne wydania wprowadzając rozróżnienie między kompilacjami gałęzi a kompilacjami pnia.
Przykład 1: sprawdzenie wersji Firefoksa
// przyjmując, że pracujemy pod Firefoksem var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo); var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"] .getService(Components.interfaces.nsIVersionComparator); if(versionChecker.compare(appInfo.version, "1.5") >= 0) { // używamy Firefoksa 1.5 lub późniejszego }
Przykład 2: radzimy sobie z wersjami nightly
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo); if(appInfo.appBuildID >= "2005093006") { // używamy kompilacji 2005093006 lub nowszej }
Nie powinieneś polegać na identyfikatorach kompilacji w przypadku wydań, ponieważ mogą one być różne dla konkretnych kompilacji lub zlokalizowanych wersji aplikacji.
Wersja platformy
nsIXULAppInfo
dostarcza informacji zarówno o aplikacji (jak na przykład Firefoksie) i platformie (tzn. Gecko lub XULRunner). Na przykład, w Firefoksie 1.5 beta 2 wersja aplikacji to 1.4.1, a wersja platformy to 1.8b5. Bądź ostrożny przy korzystaniu z tych informacji, zwłaszcza przy obsłudze aplikacji opartych o XULRunnera.
Uzyskiwanie informacji o wersji platformy wygląda następująco:
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo); var platformVer = appInfo.platformVersion; var platformBuildID = appInfo.platformBuildID;
<s id="old"> </s>
<s id="old">Starsze wersje
Jak wspomniano wyżej, starsze wersji aplikacji oparte o Mozillę 1.7 nie obsługują nsIXULAppInfo
. Musisz napisać dodatkowy kod, jeśli zdecydujesz się na ich obsługę.
Na przykład, Firefox i Thunderbird 1.0 przechowywały swoje identyfikatory w opcji app.id
(a wersje w app.version
), więc mógłbyś użyć kodu takiego jak ten, by dowiedzieć się na jakiej aplikacji pracujesz:
function getAppID() { var id; if("@mozilla.org/xre/app-info;1" in Components.classes) { // running under Mozilla 1.8 or later id = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo).ID; } else { try { id = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch) .getCharPref("app.id"); } catch(e) { // bardzo stara wersja dump(e); } } return id; } alert(getAppID());
Zobacz także
- MXR: nsIXULAppInfo.idl