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