Mes impressions sur le web, les standards et autres…


Mercredi 10 décembre 2003

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.

Publié à 11h26

Vos réactions, opinions, insultes…

Rétroliens

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

Commentaires

Auteur : Bobe#1

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).

10 décembre 2003 à 11h31
Auteur : Thomas • #2

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 :)

10 juillet 2005 à 13h53
Auteur : Thomas • #3

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

10 juillet 2005 à 14h00
Auteur : Bobe • #4

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-*).

10 juillet 2005 à 17h22
Un ch’tit biscuit ?
  • Les champs email et site sont facultatifs
  • Les URLs commençant par [protocole]://[protocole] correspond à http, https, news, irc, ftp, … sont rendues activables automatiquement. Votre adresse email ainsi que d’éventuelles adresses email présentes dans le corps du commentaire sont également rendues activables et encodées pour tromper les aspirateurs d’adresse email.
  • Pour spécifier une URL locale au site, vous pouvez utiliser local comme protocole à mettre à la place de http et omettre le nom de domaine dans l’URL.
    Exemple : local://2005/08/22/Nom-de-billet/.
  • Usez et abusez de la possibilité de prévisualiser votre commentaire pour vérifier qu’il est correctement rédigé et contient le moins possible de fautes d’orthographe. Évitez en outre le style SMS, merci d’avance. Prévisualiser votre commentaire peut également vous permettre de voir si de nouveaux commentaires sont apparus entre temps.
  • Si vous spécifiez l’adresse de votre site dans le champs texte prévu à cet effet, le script se chargera automatiquement d’aller récupérer sur votre site la langue utilisée dans vos pages, soit via l’en-tête HTTP Content-Language, soit en récupérant le contenu de l’attribut xml:lang ou lang sur l’élément html. Vous n’avez indiqué d’aucune façon la langue utilisée dans vos pages ? Corrigez ça nom di diou !
  • Des options de mise en forme des commentaires feront peut-être un jour leur apparition.


Site créé et maintenu par Aurélien Maille aka Bobe. Toutes les heures sont au format CEST.
Revenir à l’accueil – Zone de développement – Informations et accessibilité – CC licensed CC Licensed