Des problèmes XML dans webkit
Par Laurentj le mardi, juin 2 2009, 12:11 - Technologies Web - Lien permanent
Ici à Zoomorama, on hallucine sur les implémentations de XML dans les navigateurs. En effet, dans un de nos projets, on doit manipuler en javascript un document XML, créé à partir d'un DOMParser, et on a besoin de pouvoir propager un événement DOM sur des éléments XML. Et c'est loin d'être facile...
Avec Gecko, absolument aucun problème. Le DOMParser renvoi bien un XMLDocument, avec des beaux nœuds DOMElement, et on peut attacher des event listeners sur les éléments, créer des événements, les propager etc.. Bref, ça fait ce que ça doit faire. Le bonheur.
Avec Opera, on arrive à s'en sortir, il a une implémentation native correcte comme dans Gecko. Il y a juste des bizarreries, comme sur getElementByTagName. Par contre, il est le seul à implémenter xml:id, ce dont on a besoin.
Avec IE, il n'y a pas d'objet DOMParser. On se dit, c'est un peu normal, dans la mesure où on sait que IE et XML, ça fait deux. Mais il y a quand même un activeX similaire. Qui fonctionne... En fait, non, je n'appelle pas ça fonctionner. Le problème est que ce parser est complètement à la ramasse. Déjà il ne tient pas compte des DTD, ne connait même pas le namespace "xml", et j'en passe. Le pire est qu'il retourne des objets ActiveX, et non des objets Javascript. Ainsi il est impossible de toucher au prototype, de redéfinir des méthodes, ce qui serait utile pour compléter ou corriger l'implémentation. Parce que bien sûr, l'implémentation du DOM dans ce truc est complètement "fucké" comme dirait mon collègue. Par exemple, il n'y a même pas de localName sur les éléments, getElementsByTagName est buggé, et d'une manière général, le support des namespaces sur cette implémentation est archi buggé et incomplète. Un comble pour un parser XML. (Pu***, mais faites disparaître ce navigateur de merde !!! Et que ses développeurs soient maudis sur 15 générations ! )
Conclusion : le parser XML de IE est juste inutilisable. Mon collègue Olivier (Maître es-javascript) a donc réimplémenté un DOMParser XML et un pseudo DOM pour IE, avec juste ce dont on a besoin. Super lourd. Mais on n'a pas trop le choix.
Avec webkit, c'est un peu mieux. Ou pas. Il a un DOMParser, qui nous ressort bien un arbre DOM à peu prés correct. Mais là où ça coince : pas de stack d'événements sur l'implémentation. On ne peut pas propager des événements. Et là on se dit, sur webkit, ils ont fumé la moquette. Parce que Webkit est censé supporter XHTML, et donc les événements dans XHTML. Or, XHTML, c'est du XML. Mais si en XML, il n'y a pas de support d'événements, ça veut dire que l'implémentation de XHTML ne repose pas sur celle de XML, ou que l'implémentation des événements n'est pas faite sur les classes de base XML, mais sur les classes XHTML qui en hérite. Enfin bref, une raison dans le genre. Je ne suis pas allé voir le code de webkit. Mais c'est en tout cas pas logique du tout.
Toujours est-il qu'on ne peut pas propager d'événement. On s'est dit, on va modifier le prototype des objets DOM retournés par le DOMParser de webkit, et on va implémenter une stack d'events. Las, les constructeurs XMLDocument et Node ne sont apparemment pas appelés lorsque le document est construit , et du coup, on ne peut pas appliquer la stack sur les prototypes parce qu'on ne peut pas avoir de variables privées "instance".
Conclusion : avec webkit, c'est aussi le cauchemar. L'unique solution que l'on voit, c'est de refaire là aussi un parser XML et implémentation DOM (celle qu'on a fait pour IE n'est pas totalement réutilisable, n'est pas complète, et repose en partie sur l'active X parser de IE). Mais ce serait d'une connerie sans nom. Du très grand n'importe quoi. C'est totalement désespérant.
Si il y a un spécialiste webkit dans le coin qui aurait un tuyau à nous filer pour nous éviter de réinventer la roue...
Commentaires
C'est pas plus simple de reconsidérer l'utilisation du xml ?
Ma question est probablement très con mais, mais pourquoi ne pas présenter au navigateur du xml comme étant du html ? Ou plutôt, qu'est-ce qu'il y a dans xml qui n'est pas disponible dans html ?
Les namespaces il y a certainement moyen de s'en passer, je suis curieux pour le reste...
@irbabe : nous avons notre propre format xml, qui n'a pas grand chose à voir avec du HTML. Et le contenu de ce fichier XML n'est pas utilisé pour être injecté dans le HTML de la page web. Plus exactement, ce contenu XML provient de notre appli flash. Nous le transformons en DOM au niveau de la page web pour que le développeur web puisse avoir accès au document que l'appli gère, et qu'il puisse manipuler ce document en JS comme il le fait avec une page web. Et nous avons besoin d'une stack d'events pour être informé des mutations et les répercuter dans l'appli flash.
Bref, nous voulons autant que possible utiliser les standards.
Avec "Webkit" ou avec Safari ? Nuance.
Avez-vous essayé avec une nightly build de webkit ? (avec midori par exemple).
Bien que les devs Webkit ne sont "pas logiques du tout", leur moteur de rendu HTML reste le plus respectueux des standards actuellement. (Après presto ?)
Webkit pire qu'IE c'est un peu insultant quand même.
Etrange votre PB sur Webkit, moi j'arrive très bien à propager des événements sur du XHTML, évidement servi comme tel, cad "application/xhtml+xml" ??? ou alors je n'ai pas très bien saisi votre souci ;)
@jfg: on s'en fout un peu des nightlies. Ce qui nous intéresse, ce sont les navigateurs qu'utilisent actuellement les internautes. Parce que c'est aujourd'hui que notre truc doit marcher, pas dans 6 mois ou 1 an.
Et peut être que leur moteur de rendu est très bon (quoique, il y a des beaux bugs sur le support de CSS, genre des styles qui ne se changent pas sur des pseudo-states, même si ça a été corrigé il y a peu de temps il me semble), mais moi je parle du support du DOM tout court. Pour tout type de documents XML. Et sur ce registre là, désolé, mais ce n'est pas le plus respectueux, et c'est ce que j'explique sur mon billet.
Et je dis qu'il est pire que IE, parce que finalement, pour avoir un truc qui tient la route, il faut faire un truc encore plus compliqué et horrible que pour IE.
Désolé que vous preniez ça pour une insulte. Nous en sommes les premiers déçu. Mais en ce qui nous concerne, c'est webkit qui nous cause le plus de problème aujourd'hui dans notre cas.
Comme quoi, les tests acid, ça ne veut rien dire du tout...
@vincivince: je ne parle pas de XHTML, ni de rendu, mais de XML. Utilisation de l'objet DOMParser, et propagation d'événement sur le document généré par le DOMParser. Et ce n'est pas un problème de type mime, puisqu'on a bien un DOM au final. mais à moitié implémenté.
"Comme quoi, les tests acid, ça ne veut rien dire du tout..."
C'est vrai, les devs aiment bien faire des tests qui ne veulent rien dire du tout, juste pour le plaisir de coder et de perdre du temps.
"on s'en fout un peu des nightlies"
Alors ne venez pas vous plaindre de Webkit mais plutôt des navigateurs qui l'utilisent et probablement mal.
Pourriez-vous au moins poster un code pour qu'on puisse tester ce qui vous pose problème ?
@jfg
>C'est vrai, les devs aiment bien faire des tests qui ne veulent rien dire du tout, juste pour le plaisir de coder et de perdre du temps.
Je m'étais déjà exprimé sur le sujet : http://ljouanneau.com/blog/post/200...
Et donc non, un test acid, ça ne veut rien dire, parce que c'est loin, très très loin d'être exhaustif. Pour moi, c'est juste un instrument marketing.
>Alors ne venez pas vous plaindre de Webkit mais plutôt des navigateurs qui l'utilisent et probablement mal.
mmm... Safari l'utiliserai mal par exemple ? Ou même Chrome ? Ah ben ce serait vraiment dommage.. Connaissant le CV de quelques un des devs derrières ces browsers, permettez moi de douter ce que vous me dites conçernant ces browsers..
>Pourriez-vous au moins poster un code pour qu'on puisse tester ce qui vous pose problème ?
Pour le test : http://ljouanneau.com/lab/dom/testd...
Fonctionne dans Firefox, Opera, mais pas Safari 3.2.3 ni la 4beta, ni chrome 2 (et IE, on n'en parlons pas...)
Je ne peux pas trop aider sur ce point là, je n'ai jamais joué avec cette partie de WebKit.
Cela dit, je vous suggère fortement de soumettre des bugs sur http://bugs.webkit.org. Deux raisons à cela. Premièrement, si c'est corrigé, vous aurez un meilleur support dans les prochaines versions (mais ça n'aide pas pour quelque chose qui doit marcher aujourd'hui). Deuxièmement, en examinant le bug, des développeurs pourront peut-être vous filez des astuces pour contourner vos soucis (ça m'est arrivé plus d'une fois en soumettant des bugs).
Enfin dernier point, qui vaut ce qu'il vaut, ce n'est pas la partie des navigateurs la plus utilisée et donc par extension, pas la plus activement développée. Même si de tels bugs semblent inadmissible, il est compréhensible qu'une communauté se focalise sur les codes les plus utilisés. Et sans retour de la part des développeurs, y a peu de chances qu'ils améliorent le support.
A une époque, j'ai travaillé sur une implémentation de REX (http://www.w3.org/TR/rex/). J'ai donc un peu joué avec la gestion des évènements des implémentations XML.
Safari n'a l'air d'accepter les évènements sur un document XML que s'il est rendu dans le navigateur. Par exemple, un document XML inclut dans une iframe HTML répondra aux évènements.
Vous pouvez peut-être vous en sortir en utilisant une iframe cachée et le protocole data: (proposer cela me fait mal au cœur...).
Passe partout en utilisant n'importe quel framework js
(mootools, jquery, ...)
http://pastebin.com/m10c0d6fd
À moins que vous aimiez réinventer la roue, quel intérêt de se passer d'un framework ? Gagner 10 millisecondes et pourrir les devs webkit ? ("pas logiques du tout !")
Et pour revenir sur mon post précédent, erreur d'inatention :
"et des DEVELOPPEURS qui l'utilisent et probablement mal" et non pas "des navigateurs".
Bref, bonne chance pour votre projet.
@Laurentj merci pour l'exemple, le probleme ne vient pas d'un pb de Webkit sur DOMParser, mais bien de la formulation de ton XML., Safari attend de l'application/xml au minimum pour jouer avec, et que bien sur les xmlns du W3 soient présents.
Alors oui, on peut dire qu'il s'agit d'un pb de Webkit, qui s'emmêle les pinceaux quand on lui envoi pas du XML xtra solide..., pb d'encodage...
J'arrive à jouer avec XML EVENT sur Webkit, à condition de lui fournir mon .html, .xml, .xht, .xhtml ce que tu veux, MAIS sous la forme application/xml ou application/xhtml + xml.
Tout marchera normalement sous IE si on reste en application/xml d'ailleurs...
J'ai l'habitude à titre perso, de n'offrir QUE de l'application/xml ou de l'application/xhtml+xml au navigateur, puisque je m'en réclame dans le doctype..., le seul type mime capable de définir pleinement ce qu'est "XHTML" au sens strict du terme, idem pour xml.
Bref, en cherchant sur ce pb de DOMparser, j'ai trouvé 2 articles un peu vieux.., mais qui semblent vérifier mes propos, quand il s'agit de corriger ce truc sur Webkit, rapport à l'application/xhtml, et le pb de parsing.
http://erik.eae.net/archives/2005/0...
et
http://web-graphics.com/mtarchive/0...
je suis peut-être à côté de la plaque là, mais le "format" du xml pourrait bien être dedans..
bon courage
En guise de conclusion, je pense que ton post s'auto-résume :
"Mais [c'est] d'une connerie sans nom. Du très grand n'importe quoi. C'est totalement désespérant."
[rires]
@rik: oui tu as raison. hop https://bugs.webkit.org/show_bug.cg...
@lez : merci de l'astuce. Je viens d'essayer, mais ça ne fonctionne pas sous Safari 3. Toujours pas d'event. Et sous chrome 2 (et apparemment safari 4beta mais je n'arrive pas à accéder à la console), il y a apparemment des restrictions de sécurité. Je ne peux accéder au document car les domaines et protocoles ne correspondent pas.
@vincivince
>le problème ne vient pas d'un pb de Webkit sur DOMParser, mais bien de la formulation de ton XML
mon XML est tout à fait normal et valide. J'ai fait des tests avec du contenu XML encore plus basique. même souci. Utiliser le type mime application/xml au niveau du DOMParser ne change rien.
>à condition de lui fournir mon .html, .xml, .xht, .xhtml ce que tu veux
le contenu XML ne vient *pas* d'un fichier.
> Tout marchera normalement sous IE si on reste en application/xml d'ailleurs
pas du tout, IE est à la ramasse. Encore une fois, ce n'est pas un fichier que l'on charge directement dans le browser, mais du contenu XML fourni par un autre moyen.
>en cherchant sur ce pb de DOMparser, j'ai trouvé 2 articles un peu vieux
aucune des deux solutions ne fonctionnent. Je n'ai toujours pas d'event.
@jfg: ok ça fonctionne, merci pour l'astuce.
Seul problème : nous n'avons aucun contrôle sur le document (rappel, c'est notre appli flash qui injecte le code JS que nous utilisons, et cette appli est utilisé dans des pages qui ne sont pas les nôtres). Charger un framework peut amener alors à des collisions, des incompatibilités. Risqué donc. Mais nous allons voir comme mootools se débrouille...
>Gagner 10 millisecondes et pourrir les devs webkit ? ("pas logiques du tout !")
Charger un framework n'est absolument pas anodin. Et en ce qui concerne de pourrir les devs webkit, ce n'est pas mon but. Mais quand il y a un bug, c'est bien de le reconnaître, plutôt que de répondre par de la mauvaise foi, n'est ce pas ?
No comment sur ton dernier commentaire...
Ah oui, et au fait, notre appli flash est un browser XML/CSS (le XML étant une grammaire spécifique à nous, pour décrire des documents/présentations zoomable). Et nous implémentons CSS2 et 3.. (y compris les transformations et transitions). Mais j'en parlerai dans un autre billet...
Pour implémenter la spécification XForms, le projet XSLTForms, dont je suis en charge, dispose de ses propres classes Javascript DOM pour parser et manipuler des documents XML avec namespaces.
Tout cela permet un bon fonctionnement sur tous les navigateurs récents. Un contributeur illustre sur le projet a, tout de même, tenté d'écrire un sérialisateur XML basé sur le support XPath natif : il a vite abandonné l'idée à cause du mauvais comportement d'IE !
Merci Laurent pour le post, et merci pour les quelques commentaires constructifs.
Aucune des suggestions proposées ne fonctionne ou n'est adaptée à notre situation - Laurent a largement expliqué pourquoi.
L'approche Mootools est également inutilisable, et simplement à côté de la plaque (eg: pour nos besoins, and IMHO <- anti-troll): comme tous les autres frameworks de ce type, ils réimplémentent une *demi*-stack d'event (voir addEvent addListener & co - pour ceux qui lisent: http://ajax.googleapis.com/ajax/lib...), appliquée sur tous les éléments DOM (html y compris).
Pourquoi "demi-stack"? Pas de phase, notamment. C'est un simulacre d'implémentation et on est très loin de http://www.w3.org/TR/DOM-Level-2-Ev...
D'autre part, c'est appliqué sans discernement (parce que c'est fait pour faire du html ouaib2, dot). Hors, je ne veux pas patcher le support HTML dans les navigateurs, je ne suis intéressé que *par le support XML des documents XML* créés à partir d'un DOMParser, et je ne veux *surtout* pas interférer avec les choix déjà effectués par les implémenteurs html concernant leurs frameworks et/ou les contournements nécessaires propres au html.
Pour finir, je n'aime pas du tout la manière dont les questions de scope sont gérées par Mootools.
Patcher à la truelle au prix de propriétés publiques excedentaires dans tous les sens n'est pas ce que je veux.
Les clôtures, c'est pas pour les moutons hein :-).
Pour ceux que ça intéresse, j'ai fini par "apply" la stack d'event à la main sur chaque élément du DOM créé, puis, via des mutation handlers, sur tout élément nouvellement créé. C'est totalement overkill et perf consuming (sur les mutations), mais ce n'est pas mon problème.
Mon problème est de faire en sorte que les implémentations *déficientes* fonctionnent selon les standards qu'elles prétendent implémenter - quel que soit le prix. Donc IE et Webkit nécessitent des pachs *conséquents* -> perf dégradée. On mettra des beaux stickers get Opera et get Firefox.
Troll mis à part, j'aime beaucoup le code source de Webkit, que je trouve très élégant et qui est souvent une grande source d'inspiration.
Mais il faut appeler un chat un chat: je veux bien que le web, c'est 99% de html de jacky et pas grand chose d'autre, et que certains besoins (logiquement) soient moins bien "couverts" que d'autres, mais en attendant, sur quatre navigateurs, *deux* sont *outrageusement* buggés (et Webkit 3/4 est l'un de ces deux là).
Merci à vous tous pour vos réponses.