xulfr.org

8.2 Exemples XPCOM

Écrit par Neil Deakin. Traduit par Maximilien (24/07/2004).
Page originale : http://www.xulplanet.com/tutorials/xultu/xpcomex.html xulplanet.com

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

Gestion de Fenêtres

La liste des fenêtres Mozilla ouvertes peut être utilisée comme une source de données RDF. Ceci permet de créer un menu de fenêtre qui donne la liste des fenêtres courantes ouvertes par l'application. La source de données correspondante est rdf:window-mediator dont voici un exemple d'utilisation :

Exemple 8.2.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 sera crée contenant la liste de toutes les fenêtres ouvertes. Essayez cet exemple en ouvrant plusieurs fenêtres , et vous les verrez toutes dans le menu. Nous voudrions maintenant améliorer cela de sorte que lorsqu'on sélectionne un élément du menu, on aille sur la fenêtre correspondante. Ceci sera 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" qui est un service.

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 avoir le focus sur 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>


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

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é. Cette fonction récupère d'abord une référence du composant qui implémente l'interface du "window mediator" (NdT : plus exactement nsIWindowDataSource ). Puis nous récupérons l'attribut id de l'élément. Nous utilisons cette valeur comme ressource qui va être passée en paramètre à la fonction getWindowForResource pour renvoyer la fenêtre correspondante. Cette fenêtre est stockée dans la variable switchwindow comme objet javascript window. Par conséquent on peut utiliser toutes les fonctions disponibles de cet objet, comme la fonction focus().

Cookies

Ensuite, nous allons récupérer la liste des cookies sauvegardés par le navigateur. Pour cela on va utiliser le service "Cookie" qui implémente l'interface nsICookieManager utilisé 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 vident 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.

Puis, 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 a une méthode hasMoreElements retournant true jusqu'à ce qu'on récupère le dernier cookie. La méthode getNext renvoie un cookie et incrémente l'index de l'énumérateur. Comme l'ité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 rajouté 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.


Dans la section suivante , nous allons voir les interfaces XPCOM qui manipulent des données RDF.