Extraits de code:JS XPCOM
Un article de MDC.
Voici quelques exemples utiles de code traitant des composants XPCOM en JavaScript.
Sommaire |
[modifier] Contract IDs
Un contractID permet un nom unique pour un objet XPCOM. Ils sont utilisés pour créer ou accéder à un objet connu en XPCOM.
[modifier] Interfaces
Chaque objet XPCOM implémente une ou plusieurs interfaces. Une interface est simplement une liste de constantes et méthodes pouvant être appelées par l'objet. Un exemple est nsIFile. Chaque objet XPCOM doit implémenter l'interface nsISupports.
[modifier] Accès aux composants XPCOM depuis JavaScript
Les objets XPCOM sont soit créés comme de nouvelles instances (chaque création vous donne un objet complètement différent) ou soit comme des services (chaque accès vous donne le même objet, souvent appelé un singleton). La façon dont vous créez une nouvelle instance ou accédez à un service dépend de l'objet. Pour pouvoir obtenir un objet XPCOM, vous devez connaître le contactID de l'objet et l'interface que vous souhaitez utiliser.
[modifier] Création d'une instance d'un composant
var component = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsIFile);
Ce code crée une nouvelle instance de l'objet avec le contactID @mozilla.org/file/local;1 et permet d'appeler ses méthodes depuis l'interface nsIFile.
[modifier] Obtenir un service XPCOM
var preferences = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
Vous pouvez alors appeler n'importe quelles méthodes de l'interface nsIPrefService de l'objet préférences.
[modifier] Obtenir une interface différente pour un composant
Quelques composants implémentent plus d'une interface. Parfois, JavaScript est suffisamment intelligent pour connaître toutes les interfaces disponibles d'un composant, mais dans la plupart des cas, vous devrez vérifier explicitement l'interface. Avec le service préférences de l'exemple précédent, nous pouvont faire :
preferences = preferences.QueryInterface(Components.interfaces.nsIPrefBranch2);
Ce code vous permet d'utiliser les méthodes de l'interface nsIPrefBranch2.
[modifier] Implémentation de composants XPCOM en JavaScript
Voici un canevas de composant XPCOM en JavaScript. Pour pouvoir l'utiliser, vous devrez faire les choses suivantes :
- Remplacez les 3 chaînes de caractères au début de initModule par les vôtres.
- Modifiez le test dans la méthode QueryInterface pour qu'il fonctionne avec toutes les interfaces que vous implémenterez.
- Ajoutez des méthodes au prototype qui apparait dans l'interface que vous implémentez.
- Ajoutez du code d'initialisation dans le constructeur ExampleComponent.
function ExampleComponent()
{
// Ajoutez ici du code d'initialisation de votre composant.
}
ExampleComponent.prototype = {
QueryInterface: function(iid)
{
if (iid.equals(Components.interfaces.myInterface)
|| iid.equals(Ci.nsISupports))
{
return this;
}
else
{
throw Components.results.NS_ERROR_NO_INTERFACE;
}
}
};
var initModule =
{
ServiceCID: Components.ID("{examplee-xamp-leex-ampl-eexampleexam}"), // Insérez un guid entre les guillemets
ServiceContractID: "@example.com/example;1", // Insérez un contractID entre les guillemets
ServiceName: "", // Insérez votre nom entre les guillemets
registerSelf: function (compMgr, fileSpec, location, type)
{
compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
compMgr.registerFactoryLocation(this.ServiceCID,this.ServiceName,this.ServiceContractID,
fileSpec,location,type);
},
unregisterSelf: function (compMgr, fileSpec, location)
{
compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
compMgr.unregisterFactoryLocation(this.ServiceCID,fileSpec);
},
getClassObject: function (compMgr, cid, iid)
{
if (!cid.equals(this.ServiceCID))
throw Components.results.NS_ERROR_NO_INTERFACE
if (!iid.equals(Components.interfaces.nsIFactory))
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
return this.instanceFactory;
},
canUnload: function(compMgr)
{
return true;
},
instanceFactory:
{
createInstance: function (outer, iid)
{
if (outer != null)
throw Components.results.NS_ERROR_NO_AGGREGATION;
return new ExampleComponent().QueryInterface(iid);
}
}
}; //Module
function NSGetModule(compMgr, fileSpec)
{
return initModule;
}