Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# XBL et SVG

Envoyé par : Paul Rouget

Date : 05/01/2007 11:09

Salut forum.

Désolé d'avance pour le cross post avec la ml.

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 gras, le contenu non anonyme:

  • xul:audio
    • svg:svg
      • ...
      • svg:zoomArea inherits svg:generic
        • svg:svg
          • svg:Area inherits svg:generic
            • svg:g
              • svg:Section inherits svg:generic
                • svg:rect
                • svg:g
                  • svg:Section inherits svg:generic
                    • svg:rect
                  • svg:Section inherits svg:generic
                    • 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 ^^

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.