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.

Observers

Observateurs

Un observateur est un objet A qui "observe" un autre objet B. En fait, B va notifier A de certaines informations à différents moments de son execution. On peut utiliser son propre système d'observation (imaginons par exemple que B a une propriété contenant cet objet A), mais on peut aussi utiliser le système plus universel fourni par Mozilla.

Ce système se compose d'un objet, " @mozilla.org/observer-service;1", qui est un Service d'observation. On enregistre auprés de ce service des objets observateurs, en indiquant qu'ils sont concerné par tel ou tel évènement (évènements qui n'ont rien à voir avec les évènement DOM comme click etc..). Ces évènements sont déterminés par les objets "observés" (des objets "B"). Ces derniers feront appels au service d'observation pour notifier de tel ou tel évènement.

Les composants / interfaces à mettre en oeuvre sont donc:

  • @mozilla.org/observer-service;1 pour notifier un observateur ou en ajouter un. ce service implemente l'interface nsIObserverService
  • nsIObserver : interface que doit respecter l'observateur

Pour ce faire, il faut d'abord réaliser l'observateur.

Un observateur

  var myObserver = {
    observe : function ( subject , topic , data ){
       // traitements en fonction du topic...
       if(topic == "foo"){
       }else if (topic== "bar"){
       }
       // etc..
    }
  }
  • topic est une chaine indiquant un nom d'evenement. cela peut être un nom que vous avez inventé si l'observateur est utilisé par vos propres objets, ou un nom utilisé par les objets notificateurs.
  • subject est le plus souvent l'objet qui est observé, l'objet notificateur, mais ça peut être tout autre objet.
  • data sont des données additionnelles liées à l'évènement.

Déclaration d'un observateur

Ensuite, il faut enregistrer l'observateur, pour chacun des topics qu'il prend en charge, auprés du service d'observation

  // récupération du service d'observation
 var ObserverServ = Components.classes["@mozilla.org/observer-service;1"].
            getService(Components.interfaces.nsIObserverService);
 // enregistrement
     ObserverServ.addObserver ( myObserver , "un-topic" , false );
     ObserverServ.addObserver ( myObserver , "un-autre-topic" , false );
     ...

addObserver prend donc en paramètre votre observateur, un topic, et un boolean qui sera la plupart du temps à false (true, si votre observateur implémente l'interface nsIWeakReference, mais ceci est un autre sujet..).

Vous pouvez retirer un observateur pour un topic donné en appelant removeObserver :

     ObserverServ.removeObserver ( myObserver , "un-topic");

Notifier les observateurs.

Vous pouvez ensuite notifier les observateurs d'évènements dans vos objets. Il suffit de récupèrer le service d'observation, et d'appeler ensuite sa méthode notifyObservers

  var ObserverServ = Components.classes["@mozilla.org/observer-service;1"].
            getService(Components.interfaces.nsIObserverService);
  ObserverServ.notifyObservers(this, "un-topic", null);

Ici tous les observateurs qui se seront déclarés pour le topic "un-topic", seront appelés par leur methode observe. Ils recevront en paramètre l'objet qui notifie (à cause du this) comme sujet, le nom du topic ("un_topic"), et une valeur null pour les données.

Notification native dans Gecko

Il existe des topics natifs dans gecko, ce qui vous permet d'observer certains évènements courant. Voir la liste sur MDC. Pour les topics app-startup et xpcom-startup, vous devrez déclarer un composant XPCOM auprés du category manager comme indiquer sur cette page

Categorie : RessourcesLibs


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.