Voyons pour les plus curieux comment cela est possible. Tout d'abord, il faut
assimiler la conception de Composants et d'Interfaces.
Une interface est la partie publique du composant : elle présente ce que le composant contient et peut faire. Il
s'agit ni plus ni moins de sa description. Cela s'intègre complètement dans la logique objet. Par exemple, je suis
une voiture, j'ai une couleur, une taille, un moteur (attributs) et je sais rouler, freiner, tourner (méthodes). Cette
description est écrite dans le langage de description IDL (Interface Description Language4), utilisé entre autres
avec le langage CORBA. Son unique but est de décrire une interface.
Concernant maintenant l'implémentation, on peut la faire dans plusieurs langages
(C, C++, Javascript, Python). Le compilateur "xpidl" nous facilite cette
tâche en nous fournissant tous les fichiers nécessaires depuis un fichier IDL
: il n'y a plus qu'à écrire le code qui implémente les fonctionnalités décrites.
Pour que tous ces composants puissent fonctionner sur toutes les plate-formes, Mozilla a défini des types de
variables au niveau IDL, et a implémenté un moteur comprenant l'implémentation de ces types pour chaque
architecture et chaque langage. L'avantage est qu'une variable de type entier en C++ pourra être passée dans
la couche XPCOM et sera comprise comme un type entier Python.
Exemple : voici la description de l'interface « nsIToolbar » qui permet de créer une barre
d'outils. On découvre que les composants qui l'implémentent peuvent ajouter et récupérer
des éléments dans cette barre :
interface nsIToolbar : nsISupports {
readonly attribute boolean visible;
attribute int margin;
attribute boolean horizontalLayout;
attribute boolean lastItemIsRightJustified;
attribute boolean wrapping;
void AddItem(in nsIToolbarItem anItem,
in int aLeftGap,in boolean stretchable);
void InsertItemAt(in nsIToolbarItem anItem,
in int aLeftGap, in boolean aStretchable,in int
anIndex);
void GetItemAt(out nsIToolbarItem anItem,in int
anIndex);
}
Une seule interface peut ainsi disposer de plusieurs composants, réalisés sous différents langages ou
architectures. L'architecte logiciel peut donc librement décrire ce dont il a besoin, et les développeurs peuvent
ensuite écrire les composants dans leur langage de prédilection.
Désormais, nous savons que nous pouvons afficher des pages XUL ou HTML avec des CSS (Gecko), et que
l'on dispose des briques fonctionnelles (XPCOM). Reste à savoir comment faire le lien entre ces deux mondes.
Comment puis-je appeler ces composants XPCOM dans mon application ?