Mes impressions sur le web, les standards et autres…


Sélecteur de style

Je viens de finir de mettre en place le sélecteur de style (Style switcher pour les intimes). La gestion se fait entièrement du coté client à l’aide du javascript et du DOM, et sans appui coté serveur.

En effet, il est généralement d’usage de prévoir un mécanisme de secours coté serveur au cas où le javascript est désactivé ou absent dans le navigateur. Dans ce cas là, la soumission du formulaire de sélection se fait effectivement. L’information est donc reçue du coté du script serveur et la nouvelle page générée contient l’appel à la feuille de style du style choisi, suivi de ceux pour les autres feuilles de style qui sont donc indiquée comme alternatives.

Cela me pose problème de deux façons :

  • Tout d’abord, et c’est le plus important, je gère finement le cache du client en lui envoyant les en-têtes HTTP adéquats et tient à en exploiter toutes les possibilités. Le problème est que le choix effectué par l’utilisateur va modifier la structure du document puisque le style choisi doit être indiqué comme style par défaut et les autres doivent être indiqués comme alternatifs. Or, les pages déja mises en cache ne tiennent pas compte de ce changement dans la structure primaire du document.
  • Le document doit être envoyé tel quel au client. S’il y a des aménagements ultérieurs à faire dans le document en fonction de choix utilisateur, ils doivent l’être avec un script approprié coté client.

Le sélecteur de style est donc ici généré entièrement à l’aide du DOM, puis intégré dans le document. Lorsqu’un choix dans la liste est effectué et que le bouton est activé, la fonction d’activation du style est lancée grâce au gestionnaire d’évènements du DOM et le style sélectionné est activé, les autres étant désactivés. Un cookie est également envoyé afin que le style choisi soit persistant, c’est à dire automatiquement utilisé sur chaque page.

Bon, évidemment, cela nécessite que le javascript soit présent et que votre navigateur comprenne un tant soit peu le DOM, mais comme ce n’est pas une fonctionnalité indispensable pour l’accés au site et la lecture du texte, ce n’est pas génant. Pour finir, le script du sélecteur de style est libre de droit, librement réutilisable et patati et patata…

Pour ceux qui sont sous Opera, ne chercher pas le sélecteur de style, Opera est un navigateur assez bizzare qui dit gérer le type MIME application/xhtml+xml. Fatalement, mon appli envoie donc la page sous ce type MIME. Le problème est que dans ce cas précis, le DOM ne semble plus fonctionner dans Opera…

Bah, je sais pas pour vous, mais moi, je reste sous Firebird hein. À bon entendeur.

La guerre des navigateurs n’aura pas lieu

Cette année 2003 aura été riche en rebondissement dans le monde des navigateurs web. De la sortie de Safari, le navigateur maison d’Apple, à l’affaire du brevet Eolas, en passant par la mort de Netscape et l’abandon par Microsoft du développement de IE sur Windows et Mac, je me demande même si ce petit monde n’a jamais été aussi animé depuis ses débuts.

Ces temps ci, on murmure dans les recoins du web qu’un nouvel épisode de la guerre des navigateurs s’annonce à l’horizon et pourrait faire mal. L’entreprise de Redmond serait en train de préparer dans ses laboratoires secrets un monstre, un tueur de navigateurs web pour sa prochaine mouture de Windows, Longhorn. Celui ci apporterait de fantastiques nouveautés devant lesquelles les autres navigateurs feraient pâle figure. Ainsi, ce dernier sursaut dans la guerre des navigateurs s’achèverait par la mort ou l’agonie pour les navigateurs alternatifs et par le triomphe de Microsoft dans sa conception du Web.

Que nenni mes amis, de guerre point n’aura lieu et la victoire des navigateurs alternatifs, et par là même des normes du W3C, est déja acquise d’avance. Ce que Microsoft nous prépare, c’est MSN Explorer, son logiciel de navigation internet/gestion d’emails/etc. payant. C’est un grand classique : Prendre le plus de parts de marché possibles, et ceci à n’importe quel prix, fidéliser sa clientèle et/ou museler la concurrence, puis rendre tout ça payant. Avoir sous sa coupe 90% et plus de parts de marché d’un marché gratuit n’a pas grand intérêt pour Microsoft alors qu’avoir 15 à 20% d’un marché payant est beaucoup plus rentable.

Je vous le dis, observez bien les statistiques de parts de marché des navigateurs durant l’année qui vient et admirez béatement la (trop ?) lente agonie de IE et l’ascension des navigateurs alternatifs et particulièrement de la famille Gecko :)

Détecter le javascript et les fichiers PDF

Personnellement, je n’aime pas trop les documents PDF. Ne me demandez pas pourquoi, je n’en sais trop rien. Je les trouve pas très pratique et j’ai du mal à naviguer dans les pages. Cependant, je ne doute pas que ce format ait ses avantages. D’autre part, je déteste tomber sur des liens javascript, c’est à dire qui commencent par javascript: ou sur lequel se trouve par exemple un attribut onclick. Alors j’ai placé les règles CSS suivantes dans le fichier userContent.css qui se trouve dans le dossier chrome/ de mon profil Firebird :

a[href^="javascript:"]:hover, a[onclick]:hover {
	background-color: red !important;
	color: blue !important;
}
a[href$=".pdf"]:hover, a[type$="pdf"]:hover {
	background-color: blue !important;
	color: red !important;
}

Je sais pas pour vous mais perso, je trouve ça diablement pratique. Vous n’utilisez pas Mozilla ou Firebird comme navigateurs web et vous souhaitez en savoir plus ? C’est par là.

Négociation de contenu avec les documents XHTML

Comme l’indique la note du W3C sur les types de média XHTML, les documents XHTML devraient être envoyés par le serveur avec l’en-tête application/xhtml+xml. Pour les documents dynamiquement générés par un script PHP par exemple, c’est facile la solution a déjà été rappellée sur plusieurs blogs :

if( !empty($_SERVER['HTTP_ACCEPT']) && stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') )
{
    header('Content-Type: application/xhtml+xml; charset=iso-8859-15');
}
else
{
    header('Content-Type: text/html; charset=iso-8859-15');
}

Je n’ai rien vu en revanche en ce qui concerne les documents statiques, sauf une courte note à la fin de l’article The Road to XHTML 2.0: MIME Types de Mark Pilgrim. La solution donnée consiste à utiliser le module mod_rewrite d’Apache. Cependant, tout le monde ne dispose pas de ce module.

J’ajoute une autre possibilité : L’utilisation de la négociation de contenu avec l’option MultiViews d’Apache. Certes, cette option n’est pas non plus présente sur tous les serveurs, mais elle est, je pense, plus répandue que le module mod_rewrite. Cette option doit être activée dans le fichier httpd.conf pour votre domaine, ou ajoutée à l’aide d’un fichier .htaccess si cela est autorisé :

Options +MultiViews

Vous devez ensuite avoir un jeu de deux fichiers de même nom pour chacun de vos documents, le premier fichier ayant l’extension .xhtml et le second, l’extension .html. Apache se chargera d’effectuer l’envoi du bon fichier selon l’en-tête accept envoyé par le client. Le fichier devra être appellé dans le navigateur sans son extension. Exemple : http://domaine.tld/foo avec à la racine du domaine domaine.tld les fichiers foo.xhtml et foo.html (Si un seul fichier est présent, Apache l’enverra par défaut).

C’est la technique utilisée par le W3C pour certains de ses documents si j’en juge par le contenu de l’en-tête Content-Location renvoyé.

Sacré Opera

Continuant mes tests sur les types MIME, j’ai décidé aujourd’hui d’affiner ma détection des types de média supportés en tenant compte du coefficient de préférence. C’est cette valeur à virgule précédée de q= qui accompagne certains types dans l’en-tête accept. Voici l’en-tête accept renvoyé par Opera 7.22 :

text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1

Cela m’a permis de constater que ce navigateur avait une préférence pour le type text/html plutôt que pour application/xhtml+xml. Or, c’est ce dernier que j’envoyais, me basant simplement sur sa présence ou non dans l’en-tête accept.

La solution généralement donnée pour envoyer le bon en-tête (et que j’ai rappellée moi même dans le billet précédent) est donc erronée, ou du moins incomplète. Cela est d’autant plus évident que dans le cas présent, Opera a un gros trou de mémoire en ce qui concerne le DOM si la page est servie avec le type application/xhtml+xml (*ricanements*).

J’ai donc concocté une fonction plus précise et tenant compte des coefficients de préférence, ce qui a pour conséquence que les pages sont envoyées avec le type text/html sous Opera (fonction basée sur ce que j’ai mis en place dans ma classe output):

function sendType()
{
    $mime_types = array('application/xhtml+xml', 'text/html');
    $mime_type_selected = 'text/html';
    $q_prefs = 0.0;
    
    foreach( $mime_types AS $mime_type )
    {
        if( !preg_match('/' . preg_quote($mime_type, '/') . '(?:;q=([0-9]\.[0-9]))?/', $_SERVER['HTTP_ACCEPT'], $match) )
        {
            continue;
        }
        
        $q = ( !empty($match[1]) ) ? $match[1] : 1.0;
        
        if( $q > $q_prefs )
        {
            $mime_type_selected = $mime_type;
            $q_prefs = $q;
        }
    }
    
    header('Content-Type: ' . $mime_type_selected . '; charset=iso-8859-15');
}

J’ai donc mis tout cela en place et cela fonctionne bien, Opera reçoit désormais mes pages avec le type text/html. Le petit script pour afficher l’adresse source d’un bloc de citation fonctionne… ok, le sélecteur de style fonc… ne fonctionne pas, quoi ?! Bon, ok, on va débogguer tout ça tranquillement. Je fais quelques tests par ci par là pour finir par me rendre que Opera ne connait pas le tableau document.styleSheets !

Non mais c’est quoi ce navigateur de merde ? (Et je pèse mes mots) Même IE 5.01 connait ce tableau ! Bon, récapitulons :

  • DOM inconnu au bataillon si la page est envoyée avec application/xhtml+xml
  • Tableau document.styleSheets non reconnu (reconnu par IE 5.01 qui date de 1999)
  • Bug avec la règle CSS a[hreflang|="en"]:after { content: "\00A0" url("/Icones/en"); } (le texte du lien est remplacé par deux drapeaux)
  • Sélecteur universel non reconnu
  • J’en oublie sùrement d’autres…

Rassurez moi, la version payante dispose d’un moteur moins buggué ? C’est quand même pas cet Opera qui est payant ? => Mozilla ou Firebird en français.

Faille critique dans Internet Explorer

S’il y a bien une faille de sécurité qui devrait convaincre les utilisateurs de IE d’abandonner ce navigateur obsolète, c’est bien celle-là (Ça ne fait pas planter le navigateur et c’est juste une page de tests donc pas de danger en l’occurence). Plus d’infos sur cette faille critique (qui ne sera pas corrigée avant la nouvelle année aux dires de Microsoft).

Indexation intelligente

Les méthodes d’indexation de documents des robots des moteurs de recherche est à l’heure actuelle assez basique à mon goùt. On pourrait imaginer plusieurs méthodes relativement simples pour mieux cibler les parties d’une page qui devraient être indexées et celles qui ne devraient pas l’être.

ID du conteneur

Souvent quand on effectue une recherche dans les moteurs, nombreux sont les résultats qui nous amènent sur des documents assez long. On pourrait imaginer par exemple que les robots soient capable de récupérer la valeur de l’attribut id du ne bloc parent (premier bloc parent affublé d’un tel attribut quoi). Les valeurs des attributs id étant utilisés comme identifiant de fragment (ou ancre interne au document) dans les URI, cela faciliterait beaucoup les choses pour l’internaute.

Fiche d’indexation

À l’instar du système P3P, on pourrait imaginer une déclaration de politique d’indexation. C’est à dire les parties de document qui peuvent être indexées et celles qui doivent être ignorées. Pratique pour éviter l’indexation de parties de document qui ne changent pas (typiquement le menu du site). Ce fichier au format XML pourrait être fourni à l’aide d’une balise meta par exemple :

<meta name="Robots-policies" content="http://mydomain.tld/robots.xml" />

Enfin… Ça reste pour l’instant du domaine du rève.

Terrorisme et Irak

Les média (télévision, presse…) me font bien rigoler. À les entendre, ce ne sont pas des résistants qu’il y a en Irak, mais des terroristes assoiffés de sang et ayant pour seul et unique but de mettre le monde à feu et à sang.

Est-ce à dire que les français résistant à l’occupation nazie pendant la seconde guerre mondiale étaient également des terroristes ? Du point de vue de la puissance occupante peut-être mais c’est tout…

Bref, il y a actuellement dans la presse en général et dans la presse française en particulier un mélange des termes tout à fait malsain. Matraquage médiatique, quand tu nous tiens… Tiens, en parlant de matraquage médiatique, une chronique du journal le monde sur la capture de Saddam.

IRC Drawer aux normes

Après être tombé sur cette page du blog d’Anubis, je me suis dit que bien que l’utilisation de l’attribut non normalisé oncontextmenu ne soit pas génante en soi, il y avait sùrement une possibilité de rendre cette page valide en regard des normes actuellement en vigueur (on allait quand même pas s’avouer impuissant à faire un équivalent standard ;¬)).

Voici le résultat rendu standard par l’utilisation du gestionnaire d’évènements du DOM de préférence aux attributs d’évènements HTML amenés à disparaître à l’avenir du XHTML (Voir ce précédent billet sur ce sujet) et publié ici avec l’accord d’Anubis.

LOTR : Le retour du roi

Bon, je suis allé voir hier soir le troisième et dernier épisode du seigneur des anneaux. Et bien j’ai de nombreuses critiques à faire sur ce film… Avant d’aller plus loin, je précise que je suis un fan de Tolkien et que j’ai lu quasiment tous ses livres (et j’ai lu chacun d’eux une demi-douzaine de fois au moins), à savoir : Le seigneur des anneaux, Bilbo le hobbit, le silmarillion, les contes et légendes inachevées (1er, 2e et 3e âges). Malgré cela, et pour ceux qui en douteraient, je précise que je tente ici d’être le plus objectif possible.

Peter Jackson (le réalisateur) a certes fait un excellent travail. Les décors sont proprement magnifiques, de nombreuses scènes sont très bien réalisées et le scénario, en étant conscient que le réalisateur ne pouvait tout simplement pas coller parfaitement à la trilogie, reste cohérent. Les acteurs aussi ont été bien choisis et ont bien joué leur rôle, bien que je n’ai que moyennement apprécié la prestation de Elijah Wood (qui, je le précise pour ceux qui étaient en hibernation ces dernières années, joue le rôle de Frodon). Cependant, le réalisateur a fait, de mon point de vue, deux erreurs majeures.

Écarts incompréhensibles

Je le redis, je suis conscient que Peter Jackson ait dù faire des choix et supprimer certaines parties de la trilogie afin que les trois films ne soient pas démesurément long. La suppression notamment de toute la partie concernant la vieille forêt et Tom Bombadil dans le premier épisode me semble normale. Ce passage n’apportait pas de réel plus pour la compréhension du reste de l’histoire, c’était donc le passage à supprimer sans conséquence pour le scénario.

De même pour la suppression de toute la partie sur le retour des hobbits au pays, la découverte d’une comté saccagée et d’un saroumane encore suffisamment puissants et vicieux (Je vous avoue cependant que j’ai eu une sorte de crispation en constatant cette suppression). Ce passage bien qu’interessant a été supprimé, je le regrette pour ma part mais comprend encore une fois sa suppression.

Non, ce qui m’énerve, ce ne sont pas ces suppressions nécessaires, mais les modifications apportées dans les parties de l’histoire qui ont été gardées. Je pense par exemple à l’arrivée d’une troupe d’elfes au gouffre de Helm. Ça n’apporte rien de plus au scénario, je vois vraiment pas l’intérêt. De même sur la partie où Faramir enmène Frodon et Sam à Osgiliath. Encore une fois, pourquoi ? Je pourrais citer des dizaines d’autres écarts par rapport à l’histoire originale.

L’histoire a été trop respectée

Bon, je sais. Là, vous vous dites : Bon, faudrait savoir. L’histoire a été trop modifiée ou pas assez ?!.

En fait, ce que j’ai dit plus haut reste vrai. Mais d’un autre coté, le réalisateur a trop collé à l’histoire originale en ce sens que l’on trouve nombre de scènes où les dialogues sont exactement les mêmes que dans le bouquin, ce qui n’est pas forcément un mal, mais dans le film, on a l’impression que le scénario ne parvient pas à prendre son propre rythme.

Plus précisément, Peter Jackson a tenté de donner à son scénario son propre rythme mais s’est enfermé dans le même temps dans le rythme donné par le bouquin.

Je sais pas si j’ai été très clair sur la deuxième partie du billet :/. Bref, je suis quelque peu déçu par cette adaptation, même si je ne nie pas que ces films ont été bien réalisés d’une certaine manière. S’il y a des fans de Tolkien qui passent par ici, n’hésitez pas à donner votre point de vue, j’ai vraiment envie de savoir ce que vous en pensez, surtout en ce qui concerne la deuxième partie du billet.

PS : Un très beau site (et surtout pleins d’infos) sur l’œuvre de Tolkien.