Mes impressions sur le web, les standards et autres…


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.

Vos réactions, opinions, insultes…

Rétroliens

Faire un rétrolien sur ce billet : [trackback]

Commentaires

1. De Bobe

Bon, j’ai corrigé le bug des drapeaux car c’est vrai que c’était assez génant en terme de lisibilité (j’avoue, j’avais déja repéré ce problème depuis un petit moment).

2. De Thomas

Je voulais retrouver sur ce billet :) Heureusement je savais que le titre était "Sacré Opera" alors j'ai tapé ces mot-clés dans google et hop, 1er résultat :)

3. De Thomas

D'ailleurs la version 8.0 doit être beaucoup mieux, ne faudrait-il pas mettre à jour ta classe ?

4. De Bobe

Tu veux parler de la classe "output" ? La partie concernant le choix du type de média selon l’en-tête accept suit la norme HTTP donc normalement, tout est ok.

D’ailleurs, Opera 8.01 envoie l’en-tête accept suivant:
text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1

text/html et application/xml+xhtml sont à égalité. Je n’ai rien trouvé dans la norme concernant ce cas précis, donc j’ai pris le parti d’utiliser le premier type capturé, ici, text/html (le code donné dans le billet a évolué entre autre pour être plus générique afin de fonctionner sur les autres champs accept-*).

L’ajout de commentaires sur ce billet n’est pas/plus autorisé.