Thomas Meinike: Mozilla-Preferences abfragen

Hallo,

der Hintergrund meiner Frage ist die native Vefuegbarkeit von SVG im kuenftigen Firefox 1.5. Bereits seit Deer Park Alpha 1 ueber Alpha 2 bis zur aktuellen Version Firefox 1.5 Beta 1 ist SVG aktiviert (laenger schon in den Mozilla-Nightly-Builds).

Ein Blick ueber "about:config" zeigt die Voreinstellung "svg.enabled" mit zugehoerigem Wert true.

Da ich gerade allerlei Techniken des Mozilla-XML-DOM im SVG-Kontext ausprobiere -- was durchaus passabel funktioniert -- waere auch eine vorherige Abfrage des nativen SVG-Renderers hilfreich (die DOM-Methoden funktionieren zwar auf Mozilla-Level und werden auch separat auf Existenz geprueft, aber die Ergebnisse sollen letztlich in den SVG-DOM-Baum wandern).

Firefox bringt eine JS-Bibliothek prefcalls.js mit, die Funktionen fuer Zugriffe auf Voreinstellungen enthaelt. Darueber und mit weiteren Mozilla-Dev-Tutorials bin ich zu diesem Abfragecode gelangt:

  
var prefs,svgen;  
  
// 1. Variante:  
  
prefs=Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(null);  
svgen=prefs.getBoolPref("svg.enabled");  
  
alert(svgen); // undefined  
  
// 2. Variante:  
  
prefs=Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("svg");  
svgen=prefs.getBoolPref("enabled");  
  
alert(svgen); // undefined

Beide bringen nur undefined, aber immerhin keine Fehler in der JS-Konsole.

Frage: Hat jemand solche Abfragen bereits erfolgreich praktiziert?

Eine (vermutlich brauchbarere) Alternative habe ich mir ausgehend von der erfolgreichen Abfrage des MIME-Types image/svg+xml bei gleichzeitiger Abwesenheit eines zugehoerigen Plug-ins ueberlegt:

  
if(window.ChromeWindow && navigator.mimeTypes &&  
   navigator.mimeTypes["image/svg+xml"] &&  
   !navigator.mimeTypes["image/svg+xml"].enabledPlugin)  
{  
  // Code fuer SVG-enabled Mozilla ...  
}  
else ...

Damit wird unter Firefox 1.0x (mit/ohne Plug-in) und Nicht-Mozilla-Browsern der else-Zweig erreicht und FF 1.5b und Co. werden bedient. Dennoch wuerde mich mal die Sache mit den Preferences interessieren, weil "svg.enabled" --> true genau die gesuchte Information darstellt.

MfG, Thomas

  1. Hallo,

    Damit wird unter Firefox 1.0x (mit/ohne Plug-in) und Nicht-Mozilla-Browsern der else-Zweig erreicht und FF 1.5b und Co. werden bedient. Dennoch wuerde mich mal die Sache mit den Preferences interessieren, weil "svg.enabled" --> true genau die gesuchte Information darstellt.

    Kann hier nicht statt "if(window.ChromeWindow && " erstmal nach "window.XML", vgl. auch Browsererkennung durch JavaScript, gefragt werden?

    Grüsse

    Cyx23

    1. Hallo,

      Kann hier nicht statt "if(window.ChromeWindow && " erstmal nach "window.XML", vgl. auch Browsererkennung durch JavaScript, gefragt werden?

      Danke fuer den Hinweis. Waere fuer eine Pruefung ab FF 1.5 sinnvoll.

      Kennen die bisherigen SVG-enabled "Nightly-Builds" dieses Objekt auch (habe gerade keinen solchen Mozilla installiert)? Immerhin gab es solche Builds bereits lange vor FF 1.0. Insofern ist window.ChromeWindow vielleicht besser geeignet.

      BTW: Deine Tabelle ist sehr hilfreich. Noch praktikabler waere es, wenn die Browser-Legende nochmals am unteren Ende auftaucht.

      MfG, Thomas

      1. Hallo,

        BTW: Deine Tabelle ist sehr hilfreich. Noch praktikabler waere es, wenn die Browser-Legende nochmals am unteren Ende auftaucht.

        Schon erledigt:-) Der Bedarf ist klar, ich hatte deswegen auch schon öfters position:fixed
        versucht, aber je nach Browser und Fenstergrösse wäre das beim derzeitigen Aufbau noch etwas
        gewagt.
        Mit einem (noch undokumentierten) Doppelklick auf die obere Browser-Legende gibt es aber
        jetzt auch erstmal eine einfache Variante mit fixed, vielleicht kann ich das später nochmal
        etwas eleganter umsetzen.

        Grüsse

        Cyx23

  2. Hallo,

    Also

      
    const prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");  
    svgen = prefService.getBoolPref("svg.enabled");  
    alert(svgen);  
    
    

    gibt bei mir (FF 1.5 beta1 WinXP) 'true' aus (auf der JS-Konsole ausgeführt).

    Gruß, Jan

  3. Hi,

    // 1. Variante:
    prefs=Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(null);
    svgen=prefs.getBoolPref("svg.enabled");
    alert(svgen); // undefined

    // 2. Variante:
    prefs=Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("svg");
    svgen=prefs.getBoolPref("enabled");
    alert(svgen); // undefined[/code]

    Beide bringen nur undefined, aber immerhin keine Fehler in der JS-Konsole.

    In welchem Kontext ausgeführt?

    Ich vermute, daß die nur im Chrome-Kontext (also in browserinternem Code - Extensions, Plugins, ...) funktionieren, im Kontext einer HTML-Seite aber nicht funktionieren.
    Wäre ja auch schlimm, wenn in jeder HTML-Seite die Abfrage sämtlicher Browser-Einstellungen möglich wäre, denn die könnten dann ja auch an einen Server übermittelt werden.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo,

      Ich vermute, daß die nur im Chrome-Kontext (also in browserinternem Code - Extensions, Plugins, ...) funktionieren, im Kontext einer HTML-Seite aber nicht funktionieren.

      So ist es. Ich bin davon ausgegangen, daß das klar ist.

      Gruß, Jan

    2. Hallo,

      In welchem Kontext ausgeführt?

      Im Browser-Kontext (http bzw. file).

      Ich vermute, daß die nur im Chrome-Kontext (also in browserinternem Code - Extensions, Plugins, ...) funktionieren, im Kontext einer HTML-Seite aber nicht funktionieren.

      Das wird es sein. In der JS-Konsole funktioniert meine erste Variante mit getBranch(null) und getBranch("").

      Ansonsten erhalte ich jetzt die erklaerende Meldung "Error: uncaught exception: Permission denied to get property UnnamedClass.classes".

      Wäre ja auch schlimm, wenn in jeder HTML-Seite die Abfrage sämtlicher Browser-Einstellungen möglich wäre, denn die könnten dann ja auch an einen Server übermittelt werden.

      Ja, so ganz wohl war mir bei der Idee auch nicht ;-).

      Mir bleibt ja noch die genannte Alternative. Danke nochmal, auch an Jan und Kristof.

      MfG, Thomas

  4. Hallo,

    Vieleicht hilft Dir dies weiter:
    http://www.faqts.com/knowledge_base/view.phtml/aid/1608/fid/125
    Gruß
    Avalon

    1. Hallo,

      Vieleicht hilft Dir dies weiter:
      http://www.faqts.com/knowledge_base/view.phtml/aid/1608/fid/125

      Danke -- das funktioniert mit navigator.preference("svg.enabled"); durchaus via file nach Sicherheitsabfrage, aber bereits via http://localhost/... wird der Zugriff (sinnvollerweise) mit Exception verwehrt.

      MfG, Thomas