Firefox 3 and protocol handlers - Part 1 - WebApp
J'initie ici un nouveau couple (ou plus on verra) d'articles concernant la gestion des 'protocol-handlers' avec firefox 3. La première partie présentera cette fonctionnalité ainsi que son application au sein d'une application web. La seconde, conduira à la création d'un petit logiciel externe en python qui utilisera les mêmes astuces pour par exemple proposer à l'utilisateur d'appeler avec son softphone depuis une interface web.
Présentation des protocol handlers
Deux exemples valent mieux qu'une longue explication...
Les liens mail
Il est assez courant sur le web de croiser des sites qui proposent des liens pour envoyer un email au webmaster ou à n'importe quelle autre personne. Ces liens si vous regardez le code source de la page sont de type :
mailto:mabelle.adresse@mail.com
Si vous cliquez sur un de ces liens, normalement, votre logiciel de mail favori va s'ouvrir et vous proposer de rédiger un mail pour la personne indiquée (dont le nom est automatiquement placé dans le champ "à :". Vous avez ici une application des protocol handlers.
Les liens apt:// d'Ubuntu
La documentation d'Ubuntu propose de nombreux liens de la forme suivante :
apt://un-logiciel
Les utilisateurs de cette distribution (comme moi) savent que ce type de lien permet d'installer des paquets (librairies ou logiciels) via un simple clic. Une fois le lien cliqué, une application de votre ordinateur recherche l'application dans les dépôts disponible et l'installe si il est disponible. Vous l'aurez compris par vous même, c'est une autre application de l'utilisation des protocol handlers.
Utiliser une application web
L'exemple suivant vise à proposer au sein d'une page web A un lien de type :
test:CeciEstUnTest
Ce lien redirigera l'utilisateur sur une page B qui utilisera la valeur donnée.
Cet exemple ne vous parle peut être pas trop, mais vous pouvez très bien imaginer qu'il s'agit de liens mail qui pointent vers une application web de lecture/écriture de mail.
Firefox propose depuis sa version 3 une fonction de l'objet "navigator" qui permet à une application web d'enregistrer son propre gestionnaire de protocole :
window.navigator.registerProtocolHandler(protocole, uri, titre);
- protocole : chaine de caractère pour le protocole à gérer (ex: test)
- uri : chaine de caractère représentant l'URL à appeler au clic. %s peut être utiliser pour passer la valeur en paramètre de cette url. (ex: http://monexemple.com/application?value=%s)
- titre : Titre du gestionnaire (indication utilisateur). (ex: Mon gestionnaire de Test)
Limitations
- Un gestionnaire de protocole ne peut être enregistré que pour le même domaine que l'application qui l'enregistre. Ceci afin d'éviter les problème de sécurité ou de cross scripting.
- La valeur transmise à l'aide de '%s' est l'ensemble du contenu de l'attribut 'href' de la balise 'a'. Il faut donc que le gestionnaire de protocole fasse le tri dans cette valeur afin d'utiliser la valeur qui suis le protocole.
Enregistrer un nouveau gestionnaire de protocole
Voici un exemple concert que vous pouvez essayer chez vous :
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="fr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Protocol Handler - test:</title> <script type="text/javascript"> navigator.registerProtocolHandler("test", "http://monexemple.com/application.php?value=%s", "Mon gestionnaire de Test"); </script> </head> <body> <h3>Protocol Handler - test:</h3> <p>Dans la partie 'script', cette page va enregistrer un nouveau gestionnaire de code pour les liens en <code>test:</code>.</p> <p>Il sera ensuite possible d'utiliser ce lien : <a href="test:Pouf pastèque">Lien exemple</a>.</p> </body> </html>
Un gestionnaire très simplifié
Il ne reste plus qu'à créer un handler associé (ici en php pour simplifier) qui utilisera la valeur passée en paramètre :
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="fr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Protocol Handler - test: - Handler</title> </head> <body> <h3>Protocol Handler - test: - Handler</h3> <h3>Cette page est affichée lorsque vous utilisez un lien de type : <pre>test:</pre></h3> <blockquote> <pre><?php if ( isset ( $_GET["value"] ) ) { echo(urldecode($_GET["value"])); } else { echo("nothing"); } ?></pre> </blockquote> </body> </html>