Par liguorien,
mercredi 17 juin 2009 à 18:27 ::Divers
Aujourd'hui j'ai découvert l'existance de bing.com, le nouvel engin de recherche de Microsoft. Je crois que je vais rester ancré à mon habitude d'utiliser google, mais je dois avouer que le nouveau venu est assez intéressant.
J'ai été surpris par la réalisation technique de la section vidéo. Ayant les bon outils pour accomplir la tâche, j'ai essayé de faire un peu de reverse engineering de cette section.
Par liguorien,
mercredi 17 juin 2009 à 12:39 ::Flex
J'ai beaucoup joué avec le DragManager de Flex dans les dernier mois. J'ai eu besoin à un certain point de fournir une implémentation custom du DragManager afin de régler quelques bugs assez gênant.
Tout les singletons de Flex implémentent une certaine interface (DragManager -> IDragManager -> DragManagerImpl) sont enregistrés globalement dans la classe non-documenté mx.core.Singleton.
Le problème avec la fameuse classe Singleton, c'est qu'elle ne permet pas de redéfinir une classe.
public static function registerClass(interfaceName:String, clazz:Class):void
{.
var c:Class = classMap[interfaceName];.
if (!c).
classMap[interfaceName] = clazz;.
}.
Donc le seul moyen de spécifier ma propre classe, c'est de redéfinir le SystemManager. La majorité des managers sont défini dans la méthode SystemManager.docFrameHandler() (à la ligne 2261 pour être exact).
Heureusement, la méthode utilise le namespace mx_internal donc il est tout à fait possible de polymorpher la méthode. (à vos risques et périls, cependant)
Mais...
Hmmm.
Où est défini l'implémentation du SystemManager? Qu'est-ce que le SystemManager?
Il y a le metadata [Frame] défini dans la classe Application. Ce metatag permet d'indiquer au compilateur la classe qui sera instancié sur un frame du swf.
Dans le cadre de mx.core.Application :
[Frame(factoryClass="mx.managers.SystemManager")]
C'est en modifiant ce metadata que j'ai pu avoir ma propre implémentation du SystemManager ainsi que du DragManager. Et au final, après avoir implémenté mon DragManager custom, j'ai trouvé une solution à mon problème d'origine sans avoir à modifier le DragManager de Flex. Il suffisait d'envoyer une implémentation spécial de MouseEvent, mais ça, c'est le but d'un autre billet! :D