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.
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.