Visit Mozilla.org

Extraits de code:Interaction entre des pages à privilèges et sans privilèges

Un article de MDC.

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.


[modifier] Transmettre des données entre du chrome sans privilèges vers du chrome avec privilèges

Une manière simple de transmettre des données depuis une page Web vers une extension consiste à utiliser des événements DOM personnalisés. Dans l'overlay browser.xul de votre extension, écrivez du code qui scrute un événement personnalisé. Ici, nous appelons l'événement MyExtensionEvent.

var myExtension = {
  myListener: function(evt) {
    alert("Reçu depuis la page Web :" +
          evt.target.getAttribute("attribute1") + "/" + 
          evt.target.getAttribute("attribute2"));
  }
}
document.addEventListener("MyExtensionEvent", myExtensionmyListener, false, true);

Les données de la page Web (code sans privilèges) seront les valeurs de attribute1 et attribute2. Pour déclencher alert() dans le scrutateur et passer les données depuis la page Web, écrivez le code tel quel dans la page Web :

if ("createEvent" in document) {
  var element = document.createElement("MyExtensionDataElement");
  element.setAttribute("attribute1", "foobar");
  element.setAttribute("attribute2", "Bonjour le monde");
  document.documentElement.appendChild(element);

  var evt = document.createEvent("Events");
  evt.initEvent("MyExtensionEvent", true, false);
  element.dispatchEvent(evt);
}

Ce code crée un élément arbitraire -- <MyExtensionDataElement/> -- et l'insère dans l'arbre DOM de la page Web. Des valeurs sont définies pour deux attributs arbitraires sur l'élément. Ils peuvent être nommés comme bon vous semble, mais nous avons choisi attribute1 et attribute2. Finalement, le code crée et diffuse un événement personnalisé appelé MyExtensionEvent -- similaire à l'événement click standard du DOM que vous capturez avec un gestionnaire onclick. L'événement est diffusé depuis la page Web et atteint l'extension (code avec privilèges) dans laquelle votre scrutateur va le capturer, et lire les valeurs des attributs depuis l'élément DOM d'où est parti l'événement.

Si vous devez transmettre beaucoup de données, utilisez des sections CDATA au lieu de simples attributs sur l'élément personnalisé.

[modifier] Transmettre des données depuis du chrome à privilèges vers du chrome sans privilèges

Pour "répondre" à une page Web (par ex., en retournant du code), votre extension peut définir ou attacher des éléments enfants sur l'élément cible event (<MyExtensionDataElement/> dans cet exemple).

Vous pouvez aussi nettoyer l'élément créé ou le créé dès la page Web est chargée puis le réutiliser à chaque fois.

[modifier] Note de sécurité

  • N'invoquez jamais des fonctions JavaScript d'une page Web depuis votre extension. En faisant cela, vous augmentez les chances de créer un trou de sécurité par une page Web malicieuse qui piègerait le navigateur en lançant son code avec des privilèges accrus (comme pour votre extension), par exemple, la capacité d'effacer des fichiers locaux.
  • Il est fortement recommandé de vérifier la source de l'événement (via event.target.ownerDocument.location) et faire que votre extension ignore tous les événements des pages qui ne sont pas sur votre serveur.