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 là qui est payant ? => Mozilla ou Firebird en français.