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.

Query interface factory

QueryInterface

Lorque l'on crée des objects xpcom en javascript, il est souvent nécessaire de leur attacher une fonction QueryInterface. Par exemple, pour un listener:

 var MyListener = {
  QueryInterface : function(aIID)
  {
    if (aIID.equals(Components.interfaces.nsIDOMEventListener) ||
        aIID.equals(Components.interfaces.nsISupports))
      return this;
    throw Components.results.NS_NOINTERFACE;
  },
   handleEvent: function (event) {
     // do something
   }
 }

La plupart du temps, cette function regarde si l'interface demandée correspond à une des interfaces que déclare l'objet. Elle renvoie l'objet si c'est le cas, et génère une exception sinon.

Il est donc laborieux de devoir écrire cette fonction à chaque fois.

QueryInterfaceFactory

En javascript, on peut générer des fonctions à partir d'autres fonctions. On va donc utiliser cette possiblité pour générer les fonctions QueryInterface:

 function QueryInterfaceFactory() {
    var interfaces = arguments;
    return function (iid) {
        for (var i = 0; i < interfaces.length; i++) {
            if (iid.equals(interfaces[i])) {
                return this;
            }
        }
        throw Components.results.NS_ERROR_NO_INTERFACE;
    }

}

Cette fonction prend en argument une liste d'interfaces que déclare un objet, et retourne la fonction QueryInterface correspondante. l'objet MyListener se définit maintenant ainsi:

 var MyListener = {
    QueryInterface: QueryInterfaceFactory(Components.interfaces.nsISupports, Components.interfaces.nsIDOMEventListener),
    handleEvent: function (event) {
     // do something
   }
 }

Note : depuis Gecko 1.9, pour la création de composants XPCOM en javascript, il y a XPCOMUtils qui fourni un service semblable.


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.