7.6 Exemples XPCOM

Écrit par Neil Deakin , mise à jour par les contributeurs à MDC .
Traduit par Maximilien (24/07/2004), mise à jour par Alain B. (04/04/2007) .
Page originale : http://developer.mozilla.org/en/docs/XUL_Tutorial/XPCOM_Examples

Attention : Ce tutoriel est ancien et n'est pas mis à jour. Bien que beaucoup d'informations soient encore valables pour les dernières versions de gecko, beaucoup sont aussi obsolètes. Il est préférable d'aller consulter cette page sur la version française de ce tutoriel sur developer.mozilla.org.

Cette section donne quelques exemples d'utilisation de la technologie XPCOM avec de nouvelles interfaces.

Gestion de Fenêtres

Cet exemple contient une source de données RDF qui sera décrite dans une prochaine section. Vous devriez passer cet exemple pour l'instant, à moins d'en savoir suffisamment sur le sujet.

Création d'un menu de fenêtre

La liste des fenêtres Mozilla ouvertes peut être utilisée comme une source de données RDF. Elle vous permer de créer dans votre application un menu donnant la liste des fenêtres courantes ouvertes. La source de données correspondante est rdf:window-mediator dont voici un exemple d'utilisation :

Exemple 7.6.1 : Source

<menubar id="windowlist-menubar">
  <menu label="Fenêtres">
   <menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
    <template>
     <rule>
      <menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
     </rule>
    </template>
   </menupopup>
  </menu>
 </menubar>
</toolbox>

Un menu contenant la liste de toutes les fenêtres ouvertes sera créé. Essayez cet exemple en ouvrant plusieurs fenêtres, et vous les verrez toutes dans le menu.

Composant mediator

Cet exemple peut être amélioré de telle façon que lorsque l'on clique sur un élément du menu, la fenêtre correspondante soit affichée. Cette tâche sera rendue possible grâce au composant "window mediator" qui implémente l'interface nsIWindowDataSource. Le code suivant montre comment il fonctionne :

var wmdata = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
wmdata.QueryInterface(Components.interfaces.nsIWindowDataSource);

Ce code récupère le composant "window mediator". Le composant utilisé ici est le même que celui qui gère la source de données RDF "Window-mediator". Vous pouvez également récupérer ce composant au travers du service RDF qui est un autre service de gestion des sources de données RDF.

L'interface nsIWindowDataSource possède une fonction getWindowForResource qui nous donne une fenêtre à partir d'une ressource. Dans un exemple précédent, nous avons généré une liste de fenêtres que nous avons ajoutée à un menu via une balise template. Celle-ci génère un attribut id pour chaque élément menuitem. La valeur de cet attribut peut être utilisée comme ressource. Ainsi pour donner le focus à la fenêtre sélectionnée, nous pouvons procéder de la manière suivante :

L'exemple ci-dessous nous montre comment procéder :

<toolbox>
 <menubar id="windowlist-menubar">
  <menu label="Fenêtre" oncommand="switchFocus(event.target);">
   <menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
    <template>
     <rule>
      <menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
     </rule>
    </template>
   </menupopup>
  </menu>
 </menubar>
</toolbox>

<script>
function switchFocus(elem)
{
  var mediator = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
  mediator.QueryInterface(Components.interfaces.nsIWindowDataSource);

  var resource = elem.getAttribute('id');
  switchwindow = mediator.getWindowForResource(resource);

  if (switchwindow){
    switchwindow.focus();
  }
}
</script>

Un gestionnaire de commande a été ajouté à l'élément menu. Ce gestionnaire appelle la fonction switchFocus() avec comme paramètre l'élément du menu que nous avons sélectionné. La fonction switchFocus() :

Cookies

Maintenant, nous allons récupérer la liste des cookies sauvegardés par le navigateur. Nous allons utiliser le service "Cookie" qui implémente l'interface nsICookieManager utilisée pour énumérer tous les cookies. Voici un exemple qui alimente la liste d'un menu avec le nom de tous les cookies provenant du site MozillaZine.

<script>

function getCookies()
{
  var menu = document.getElementById("cookieMenu");
  menu.removeAllItems();

  var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
                        .getService(Components.interfaces.nsICookieManager);

  var iter = cookieManager.enumerator;
  while (iter.hasMoreElements()){
    var cookie = iter.getNext();
    if (cookie instanceof Components.interfaces.nsICookie){
      if (cookie.host == "www.mozillazine.org")
        menu.appendItem(cookie.name,cookie.value);
    }
  }
}
</script>

<hbox>
  <menulist id="cookieMenu" onpopupshowing="getCookies();"/>
</hbox>

La fonction getCookies() sera appelée à chaque ouverture du menu, comme indiqué par l'attribut onpopupshowing de l'élément menulist. Les deux premières lignes de getCookies() récupèrent l'élément menulist et suppriment tous les items existants. En effet comme cette fonction est appelée à chaque fois que nous l'ouvrons, nous ne voulons pas garder les anciens éléments.

Ensuite, le gestionnaire de cookie est récupéré. Celui-ci a une méthode qui renvoie un objet énumérateur implémentant nsISimpleEnumerator. Il nous permet de parcourir tous les cookies. Un énumérateur dispose d'une méthode hasMoreElements() retournant true jusqu'à ce que le dernier cookie soit récupéré. La méthode getNext() renvoie un cookie et incrémente l'index de l'énumérateur. Comme l'énumérateur ne renvoie qu'un objet générique, nous devons lui indiquer que nous voulons utiliser l'interface nsICookie. Dans ce cas, l'opérateur instanceof permet d'accomplir cette vérification.

Finalement, un élément est ajouté au menu pour chaque cookie ( NdT : dont le site hôte est "www.mozillazine.org"). Les propriétés hôte, nom et valeur du cookie sont alors utilisées. Les menus ont une fonction appendItem() qui ajoute un élément avec un libellé et une valeur.

Voir aussi

D'autres exemples sont disponibles ici :


Dans la section suivante, nous allons voir comment utiliser le presse papier.


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.