Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Browser xul runner

Il peut être utile de développer son propre navigateur sur base XulRunner, comme par exemple un navigateur minimaliste.

MyBrowser

Vous avez un exemple simple ici : myBrowser

Dézippez le fichier xulapp dans un repertoire. Et lancez xulrunner en indiquant le fichier application.ini livré avec.

Voir une petite déscription du contenu : http://www.ljouanneau.com/blog/2005/04/1(..)

Un navigateur simpliste utilisera donc :

  • une balise <browser>
  • des boutons pour la navigation (back, reload...)
  • une zone de saisie d'url
  • L'implémentation d'un objet de type nsIWebProgressListener, qui permettra d'"écouter" le browser, et donc de réagir en fonction de l'avancement du chargement de la page etc (pour mettre à jour une barre de progression par exemple etc..)

Techniques

Ouvrir un lien dans une nouvelle fenêtre

Par défaut, il ne se passe rien quand on clique sur un lien qui a un target="_blank" (ou plutôt, il y a une erreur). Pour configurer le navigateur pour qu'il ait un comportement classique comme dans firefox pour l'ouverture des liens, vous avez les prefs suivantes (en prenant pour exemple myBrowser que l'on voudrait améliorer) :

 // indication de l'url de la fenêtre qui sert de navigateur
 pref("browser.chromeURL", "[[chrome://mybrowser/content/mybrowser.xul")]];
 // indication du lieu où ouvrir un lien de type target blank
 // 0=window par défaut
 // 1=window/tab courante
 // 2=nouvelle window
 // 3=nouvelle tab dans la fenêtre la plus récente (si vous avez des tabs)
 pref("browser.link.open_external", 2);
 // indication du lieu où ouvrir un lien qui ont un target ?
 pref("browser.link.open_newwindow", 2);
 // restriction sur la nouvelle fenetre ouverte
 // 0: aucune
 // 1: don't divert window.open at all
 // 2: don't divert window.open with features
 pref("browser.link.open_newwindow.restriction", 0);

Vous rajouterez ces prefs dans le fichier de préférence de l'application situé dans default/preferences/

Quand gecko ouvre une nouvelle fenêtre de navigateur à partir d'un lien externe, il passe en paramètre l'url de la page à ouvrir. Il faut donc lors du onload de votre fenêtre, vérifier qu'il y a une url en argument, et si oui, la passer au browser pour qu'il l'ouvre. Cela donne quelque chose comme ceci :

 var uriToLoad = null;
 // on test si on a un argument
 if ("arguments" in window && window.arguments.length > 0 && window.arguments[0]){
     try {
        // si la fenêtre est ouverte lors du lancement de l'appli par xulrunner
        // on a un objet nsICommandLine dans arguments.
            nsCommandLine = window.arguments[0]
                            .QueryInterface(Components.interfaces.nsICommandLine);
            if(nsCommandLine.length > 0){
                uriToLoad = nsCommandLine.getArgument(0);
            }
        }catch(e){
            //  il y a eu une erreur, l'argument n'est pas un nsICommandLine
            //  on est alors dans le cas où la fenêtre est ouverte par une autre
            // fenêtre de l'application : arguments est donc un tableau de chaine
            uriToLoad = window.arguments[0];
        }
 }
 // pas d'url indiquée : on ouvre [[about:blank]]
 if(uriToLoad == null || uriToLoad == ''){
     uriToLoad = "[[about:blank"]];
 }
 // on passe ensuite le uriToLoad au browser...

Dans myBrowser, la fonction onload() devient alors :

 function onload() {
  listener = new WebProgressListener();
  var browser = document.getElementById("browser");
  browser.addProgressListener(listener,
      Components.interfaces.nsIWebProgress.NOTIFY_ALL);
  var uriToLoad = null;
  if ("arguments" in window && window.arguments.length > 0 && window.arguments[0]){
     try {
         nsCommandLine = window.arguments[0]
                        .QueryInterface(Components.interfaces.nsICommandLine);
         if(nsCommandLine.length > 0){
             uriToLoad = nsCommandLine.getArgument(0);
         }
     }catch(e){
         uriToLoad = window.arguments[0];
      }
  }
  if(uriToLoad == null || uriToLoad == ''){
      uriToLoad = "[[about:blank"]];
  }
  var urlbar = document.getElementById("urlbar");
  urlbar.value = uriToLoad;
  go();
 }

Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.