[Xulfr] XBL et SVG.

Paul Rouget paul.rouget at no-log.org
Ven 5 Jan 10:05:04 CET 2007


Salut la liste.

Désolé pour le contenu HTML, mais ça me permet de simplifier la mise en 
page.

Je ne cherche pas obligatoirement les solutions à mes problèmes, mais 
des pistes,
des conseils pour continuer à debuger tout ça. Si vous pouviez me dire 
ce que vous
inspire tout ça, ça m'aiderait grandement:

Bon... j'ai un soucis pour binder un élément créé dynamiquement.
Voilà le contexte:

Je suis dans le chrome.
XulRunner 1.8.0.4
J'ai une fenêtre XUL bourrée de XBL.
Du SVG dans tous les sens.

Voici mon DOM énormément simplifié, en rouge, le contenu anonyme:

    * *   xul:audio*
          o svg:svg
                + ...
                + svg:zoomArea inherits svg:generic
                      # svg:svg
                            * *svg:Area* inherits svg:generic
                                  o svg:g
                                        + *svg:Section* inherits svg:generic
                                              # svg:rect
                                              # svg:g
                                                    * *svg:Section*
                                                      inherits svg:generic
                                                          o svg:rect
                                                    * *svg:Section*
                                                      inherits svg:generic
                                                          o svg:rect


Et j'ai une jolie feuille de style qui me permet de styler tout ça, et 
aussi qui bind tout ces
éléments (-moz-binding).

J'ai un truc qui ressemble à ça dans mon css:

section rect {
 fill: red;
}
section[checked="true"] rect {
 fill: green;
}


Ok, jusque là, tout va bien.

Si, dynamiquement, dans mon code JS je modifie l'attribut checked
d'une section pour qu'il passe à true, mon rect anonyme de devient pas
vert. Par contre, si  juste après je passe le ownerSVGElt (élément 
svg:svg pere du section) en visbility
"hidden" puis "visible", mon rect devient bien vert. Je peux en conclure,
peut être à tord que Gecko n'applique pas dans mon cas (parce qu'en 
général, ça fonctionne)
le css après une modification dynamique du DOM svg.

C'est mon premier soucis, mais à la limitte, ce workaround ne me dérange
pas trop.

Soucis suivant, là aussi ça va. Je crée dynamquement un élément svg:line.
Il ne s'affiche pas mais est présent dans le DOM. Basculé le visibility 
ne change rien. Par contre, basculer
le display (none/block) du ownerSvgElt me fait apparaitre mon line.

Par contre, troisème problème, bien plus embètant:
Accrochez vous:
Je crée dynamiquement un élément section (createElementNS(svg ns)).
je suis dans une fonction hors de mon XBL (une méthode d'un window XUL
classic appelé quand j'appuie sur un bouton).
Je fais donc mon createElementNS.
Le résultat de mon createElementNS est affecté à une variable:
var aSection = document.createElementNS("http://www.w3.org/2000/svg", 
"section");
Le binding est effectué de manière asynchrone, mais, en gros, 6 secondes 
après !!!
Pourtant, ma machine est vraiment très puissante, cet élément section ne 
fait rien
de vraiment extraordinaire, et, de plus, à la base, au chargement de 
l'appli, il existe
17 section, et ça ne lui pause aucun soucis (chargement de l'appli en 3 
secondes, chargement
de xulrunner inclu).
Petit truc étrange:
Si aSection est une variable globale (window.aSection) , le binding 
n'est *jamais* appliqué. Quel rapport me direz vous ?
Je ne sais pas non plus! (je vous avais dit de vous accrocher).
Mais continuons.
Alors... quand je dis que le binding est appliqué, je veux dire que les 
fonctions apportées par ce binding
sont présentes (après mon timeout de 6s, j'appelle une de celles ci, et 
elle fonctionne, c'est comme ça que
je teste). Par contre, graphiquement, l'élément n'est pas présent. Pfiou...
Donc, je teste mon super workaround. Idem, ne fonctionne pas en 
visibility, mais fonctionne avec display.
Par contre, si je fais imédiatement un display none/block après le 
append, alors mon binding est appliqué
de manière asynchrone, mais immédiatement (timeout de zero).

Bon... comme vous l'avez vu, c'est le bordel, et tout cela vient d'un 
soucis de prise en compte du css
par gecko dans le cas de modif du DOM dans un context SVG et XBL. J'ai 
déjà fait des applis bien complexes
en SVG & XBL, sans avoir ce genre de soucis. Est-ce que celà vous cause 
? Avez vous une piste ? N'importe
quoi qui pourra m'aider à comprendre ce qu'il se passe.

J'espère avoir été clair.

Toute piste m'intéresse.

Merci de m'avoir lu ^^

-- 
Paul Rouget

http://www.xulfr.org - Technologies Mozilla
http://blog.sexylizard.org

-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: http://lists.xulfr.org/pipermail/xulfr/attachments/20070105/10fc988b/attachment.htm 
-------------- section suivante --------------
Une pièce jointe non texte a été nettoyée...
Nom: paul.rouget.vcf
Type: text/x-vcard
Taille: 147 octets
Desc: non disponible
Url: http://lists.xulfr.org/pipermail/xulfr/attachments/20070105/10fc988b/attachment.vcf 


Plus d'informations sur la liste de diffusion Xulfr