Firefox va donc lever une des principales limitations des technologies basées sur XHR. Celles-ci sont derrière certaines des évolutions les plus visibles du web de ces dernières années. Grosso-modo, il s'agit de mettre à jour une page de façon transparente, en faisant des appels au serveur mais sans recharger à chaque fois la page entière. Une des premières applications qui a popularisé ces technologies est Google maps : les cartes sont chargées dynamiquement au fur et à mesure de la navigation, sans que l'utilisateur ne perçoive de rechargement de la page. La plupart des applications dites "web 2.0" intègrent aujourd'hui des fonctionnalités basées sur XHR.

Mais, pour des raisons de sécurité, XHR ne peut récupérer des informations que sur le serveur sur lequel se trouve la page. Une page du domaine www.toto.org ne pourra pas utiliser XHR pour charger des données sur le domaine www.tutu.org. Des solutions de contournement existent (cf par exemple cette présentation de Joseph Smarr à l'OSCON 2006) et cette imitation n'est pas rédhibitoire, mais si Firefox la fait sauter, ça n'en rendra le développement d'applications web que plus confortable.

Si j'en crois les quelques documents que j'ai parcourus, l'implémentation dans Firefox repose sur 2 spécifications:

  • un document de travail du W3C sur la gestion des droits d'accès inter sites. Ce document définit une méthode pour permettre à un site de préciser la politique d'accès à ses contenus depuis d'autres sites.

Gestion des droit d'accès au niveau du site

La mise en place de politiques d'accès aux documents peut se faire soit via un entête HTTP, soit au moyen d'un tag XML dans le document.

Les entêtes HTTP sont de la forme Content-Access-Control: allow <site> exclude <site>. Par exemple

  • Content-Access-Control: allow <*.example.org> exclude <*.public.example.org> signifie que la ressource est accessible à toutes les pages des sous-domaines de example.org, à l'exception de celles de public.example.org
  • Content-Access-Control: allow <toto.org> <*.titi.org>, deny <*.tata.org> siginie que le document est accessible aux pages de toto.org, de tous les sous-domaines de titi.org, mais explicitement interdite aux sous-domaines de tata.org.

Les documents XML peuvent inclure une instruction de la forme <?access-control allow="allow.example.org" ?>. Pour les détails de la syntaxe, reportez-vous au brouillon de la spec.

Avant d'autoriser l'accès à une ressource sur un autre site, le navigateur doit donc effectuer les vérifications suivantes:

  1. parser les entêtes HTTP et traiter les règles "content-access-control"
  2. si ces règles permettent l'accès et que le type MIME du document indique qu'il s'agit de XML, parser le document et traiter l'éventuelle instruction <?access-control ?> qui s'y trouve.
Nouveauté dans XMLHttpRequest

De nouveaux entêtes de requête ont été définis. Ces entêtes seront insérés automatiquement par la méthode send() si l'URI de destination n'appartient pas au site d'origine. On ne peut pas modifier ces entêtes avec setRequestHeader(). Les nouveaux entêtes sont:

  • Referer-Root avec le protocole, le nom de domaine et le port du site d'origine
  • XMLHttpRequest-Security-Check utilisé uniquement si la méthode de la requête n'est ni GET ni POST

send effectuera les contrôles d'accès et n'accédera au document distant que s'ils sont positifs.

Plus d'infos dès que j'aurai eu le temps de tester, en attendant je vous conseille de jeter un oeil au wiki Mozilla qui donne plus de précisions, et notamment sur les nombreuses implications de cette évolution en matière de sécurité.

En tout cas, une raison de plus d'attendre avec impatience la sortie de Firefox 3, le navigateur qui fait évoluer le web :-)