JS XPCOM

Cette page vient d'être traduite, mais elle a besoin d'un relecteur différent du traducteur. Pensez également à toujours vérifier le contenu avec sa toute dernière version en anglais.

Voici quelques exemples utiles de code traitant des composants XPCOM en JavaScript.

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.

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.

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.

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.

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.

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.

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;
}


Étiquettes et contributeurs liés au document

Étiquettes :
Contributeurs ayant participé à cette page : Chbok, Mgjbot
Dernière mise à jour par : Mgjbot,