Query Interface Factory

QueryInterface

Lorque l'on crée des objects xpcom en javascript, il est souvent nécessaire de leur attacher une fonction httpQueryInterface. 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 httpgé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, httpil y a XPCOMUtils qui fourni un service semblable.

Dernière modification le juillet 16, 2008 1:17 .


Le contenu de cette page est disponible selon certaines conditions de réutilisation. Lire aussi la page des 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.