Projet de Spécialité Contribution à Firefox - Ensiwiki
Transcription
Projet de Spécialité Contribution à Firefox - Ensiwiki
Projet de Spécialité Contribution à Firefox Charly Molter, Zoé Bellot, Alexandre Dumont, Grégoire de Montullé Projet de spécialité Ensimag 2012 Ce projet de spécialité consiste à contribuer à Mozilla Firefox, le navigateur Web libre et gratuit développé et distribué par la Mozilla Foundation avec l'aide de centaines de contributeurs. Il totalise plusieurs millions d’utilisateurs dans le monde et représente un projet très volumineux. Concrètement, notre équipe est chargée de corriger un bug dans le moteur de rendu des pages Web (Gecko) ainsi que d’étendre une fonctionnalité utilisateur sur la version mobile du navigateur. Le projet s’organise sur quatre semaines et le rythme de travail est cadencé selon le principe des méthodes Agiles. I - Contexte du projet 1 - HTML5 / CSS3 HTML5 et CSS3 sont les derniers volets de la norme HTML/CSS du W3C. Ils ajoutent de nombreuses possibilités aux navigateurs et une grande partie de ces normes vise à faciliter l’utilisation des formulaires (validation, ergonomie...). Comme Mozilla Firefox se veut d’être un navigateur qui respecte pleinement les standards les plus récents, la communauté travaille activement au support de ces deux derniers. 2 - Architecture de Firefox Le navigateur Web Firefox possède une base logicielle partagée avec les produits Mozilla (client de messagerie Thunderbird, calendriers Sunbird, suite d’applications Seamonkey...). Cette base commune comporte plusieurs modules et outils utilisés par Firefox pour fonctionner correctement : ● Gecko, le moteur de rendu des pages Web. Il permet de générer un affichage graphique des pages écrites en HTML tout en prenant en compte le style css. ● Necko, le moteur pour la connectivité réseau. Il assure la gestion des communications réseaux, des sockets... ● XUL (XML-based User interface Language), un outil permettant la description d’interfaces utilisateurs. ● SpiderMonkey, le moteur Javascript. Lors de ce projet, notre équipe a principalement été amenée à manipuler le moteur de rendu Gecko utilisé par Firefox, ainsi que sa version mobile s’exécutant sur le système d’exploitation pour smartphones Android. 3 - Processus de développement La communauté Firefox regroupe un grand nombre de contributeurs et les exigences de qualité du logiciel imposent une hiérarchie et un contrôle rigoureux lors de l’ajout de code à la base. Le processus de développement de Firefox est articulé autour de quatre grandes versions du navigateur, qui représentent chacune une étape dans le processus : 2/11 Projet de spécialité mozilla-central (ou Nighlty) Ensimag 2012 C’est la version de développement actif. Les nouvelles fonctionnalités et les changements récents sont d’abord ajoutés à cette version, puis sont longuement testés et remaniés si nécessaire. Cette version a un caractère expérimental et peut ainsi parfois produire des comportements inattendus (instabilité). C’est la version pour laquelle nous avons contribué. C’est la version alpha du navigateur. Sont retenues dans cette version les fonctionnalités suffisamment stables pour être utilisées par le grand public et/ou arrivées à maturité. Cette version comporte des bugs mineurs et peut encore être soumise à des modifications. mozilla-aurora C’est la version d’essai du navigateur. Toutes les fonctionnalités constituant cette version feront parties de la prochaine version de Firefox. Elle ne comporte que des bugs très légers qui sont corrigés assez rapidement. mozilla-beta C’est la version publique offerte au téléchargement à tous les utilisateurs. Les seules modifications apportées sont des corrections de failles de sécurité. mozilla-firefox Les versions mozilla-aurora et mozilla-beta n’ont pour seul but que de stabiliser les changements retenus dans mozilla-central. Le processus de développement prend environ 16 semaines. Toutefois, de nombreuses fonctionnalités prennent plus de temps et mettent plus de 16 semaines à arriver dans la version publique de Firefox. 3/11 Projet de spécialité Ensimag 2012 II - Contributions L’objectif de ce projet est de comprendre une partie de la base de code de Firefox et de corriger deux bugs liés à l’implémentation du navigateur qui interviennent dans la gestion des formulaires HTML, et plus précisément les balises input et textarea. Concrètement, les deux bugs à traiter sont : ● L’ajout de la prise en charge de l’attribut inputmode à la balise input afin de permettre de sélectionner le type de clavier affiché sur la version mobile (Android) de Firefox. ● Une restructuration du moteur de rendu Gecko au niveau de la hiérarchie de la classe nsTextControlFrame, classe assurant la gestion des entrées utilisateur (les balises HTML input et textarea). En plus de faire gagner de la clarté au code, cette modification permet de corriger d’autres bugs connus de Firefox qui avaient été mis de côté. Par exemple, un bug récurrent a été résolu par cette correction : le padding dans les zones de texte n’était pas pris en compte par le navigateur lorsqu’il était précisé en pourcentage dans la feuille de style CSS. 1 - Ajout de l’attribut inputmode Présentation du problème Grégoire et Zoé ont travaillé sur la version Android de Firefox (nom de code du projet : Fennec). Sous Android, il existe différents types de claviers virtuels, en fonction de ce que l’utilisateur doit saisir dans une zone de texte (classique, numérique, majuscules, email, url...). Deux types de claviers virtuels Android 4/11 Projet de spécialité Ensimag 2012 Sur une page HTML, Firefox choisit le type de clavier pour une balise input en fonction de la valeur de l’attribut type de la balise. Cependant, ceci n’est pas toujours satisfaisant. Par exemple, si un site Web demande à l’utilisateur de saisir un numéro de carte bancaire, un clavier numérique serait préférable alors que le type de donnée n’est pas un entier mais plutôt une chaîne de caractère < input type=”text” /> → le type correspond bien mais le clavier n’est pas le bon < input type=”numeric” /> → le clavier est le bon mais le type ne correspond pas C’est pourquoi un nouvel attribut inputmode a été ajouté à la balise input dans la norme HTML5. Cet attribut permet de spécifier quel type de clavier virtuel doit être utilisé pour la saisie par l’utilisateur, en gardant le type de données voulu. Pour l’exemple de la carte bleue, on peut alors utiliser : < input type=”text” inputmode=”numeric” />. L'attribut inputmode est censé être prioritaire sur type pour le choix du clavier, mais la communauté a préféré faire l'inverse – si type impose un certain clavier, il est prioritaire sur inputmode – pour s'assurer de ne rien casser dans ce qui était géré avant. En effet, l'attribut inputmode est tout nouveau et on n'est pas encore certain de la façon dont il sera utilisé. Implémentation Déclaration de l’attribut inputmode de la balise input Pour ajouter ce nouvel attribut à la balise input, il a fallu trouver où étaient gérés les autres attributs. Ensuite, il a suffit de déclarer cet attribut en s’inspirant de ce qui existe déjà pour les autres, en précisant les valeurs possibles de cet attribut. Dans un premier temps (premier sprint du projet), nous avons simplement considéré une valeur auto, valeur par défaut, et la valeur numeric qui permet l’affichage d’un clavier numérique. Nous avons aussi rajouter un cas dans le parser HTML appelé par la fonction GetAttr qui permet de récupérer la valeur d’un attribut. Après avoir déclaré cet attribut et testé qu’il était bien reconnu (utilisation de la base de tests automatisés de Firefox et plus précisément des Mochitests), un premier patch a été soumis à la communauté Firefox, puis revu par notre mentor Mounir Lamouri et par un autre membre de la communauté, ce qui a permis d’améliorer notre code en suivant leurs remarques. Gestion du clavier virtuel Android Ensuite, il a fallu se renseigner sur le développement Android pour comprendre comment est géré l’affichage du clavier virtuel, et à quel niveau le choix du bon clavier est effectué. Nous avons compris que c’est l’attribut inputType qui est utilisé par Android. Cet attribut peut prendre différentes valeurs prédéfinies pour les différents claviers1. Nous avons trouvé la façon dont il est traité dans le code de Fennec pour l’affichage des claviers en fonction de la valeur de l’attribut type d’une balise HTML input. Nous avons en conséquence suivi exactement la même démarche pour l’attribut inputmode. On donne la bonne valeur à la variable inputType en fonction de la valeur de l’attribut inputmode de la balise HTML. Un deuxième patch a été soumis pour review à Firefox et là encore des retours nous sont parvenus et le code a été modifié en conséquence. 1 http://developer.android.com/reference/android/text/InputType.HTML 5/11 Projet de spécialité Ensimag 2012 Ajout de nouvelles valeur pour inputmode Sur demande de Mounir Lamouri, d’autres valeurs possibles ont été ajoutées pour l’attribut inputmode, et les claviers correspondants ont été gérés. L’attribut inputmode gère actuellement les valeurs suivantes : ● 'numeric' : 0-9, +, -, virgule, point ● 'digit' : 0-9 seulement ● 'uppercase' : A-Z seulement ● 'lowercase' : a-z seulement ● 'titlecase' : majuscule pour la première lettre de chaque nouveaux mot ● 'autocapitalized' : première lettre de chaque phrase en majuscule Il n’y a pas actuellement de clavier Android composé uniquement de chiffres, Firefox gère donc pour le moment les attributs ‘numeric’ et ‘digit’ de manière identique. 2 - Restructuration de Gecko - gestion des balises input et textarea Fonctionnement de la mise en page (layout) dans Firefox Dans Firefox, le rendu d’une page Web (écrite en HTML et formatée par une feuille de style CSS) se fait via le moteur de rendu Gecko. Afin d'interpréter du code HTML/CSS en un affichage graphique cohérent et dynamique, Gecko passe par différentes étapes. Lors de ces étapes, le code HTML est interprété puis traduit sous forme d’arbre de Frames (cadres). Concrètement, une page se divise en plusieurs cadres dans lesquels sont placés les divers éléments constituant la page (images, tableaux, zones de texte...). Il existe de nombreux types de Frames, chacune spécialisée dans le rendu graphique d’une ou de plusieurs balises HTML. De façon générale, chaque Frame dispose de caractéristiques qui lui sont propres, comme ses dimensions et le style CSS qui doit lui être appliqué lors de l’affichage. Cet arbre sert de support à l’affichage de la page telle qu’elle est présentée à l’utilisateur. A chaque nouvel évènement (e.g. lorsque l’utilisateur redimensionne la fenêtre, lorsque la page doit être chargée ou encore lorsque son contenu est modifié dynamiquement), cet arbre est susceptible d’être modifié : le processus de rafraîchissement de l’arbre de Frames s’appelle le Reflow, et s’applique sur chacune des Frames de l'arbre qui en a besoin. Chaque Frame est chargée de calculer sa taille et son emplacement dans la fenêtre du navigateur, en fonction de son père et de ses fils dans le Frame Tree, ainsi que de son style CSS. Lorsqu’une opération de Reflow est lancée sur une Frame, celle-ci se rafraichit (met à jour son état, ses dimensions, ses caractéristiques...) et rafraichit ses enfants dans l’arbre si besoin. La mise en page étant une opération graphique, elle est coûteuse et doit donc être légère et éviter tout calcul redondant. 6/11 Projet de spécialité Ensimag 2012 Fonctionnement du layout - du HTML à l’affichage graphique Présentation du problème La partie de Gecko sur laquelle nous travaillons concerne le rendu graphique des balises input et textarea. Au sein de l’arbre de Frames, ces balises sont gérées dans une Frame nommée nsTextControlFrame dans la base de code de Firefox. L’implémentation des Frames dans le navigateur induit un héritage entre ces éléments. Dans le cas des deux balises HTML qui nous intéressent, cet héritage n’est pas satisfaisant car il provoque des bugs lors du rendu. L’implémentation actuelle de nsTextControlFrame hérite de celle de nsStackFrame. Toutefois cet héritage n’est pas nécessaire et les particularités de nsBoxFrame (cf schéma ciaprès) font que les balises input et textarea sont mal affichées dans certains cas particuliers. Par exemple, le padding précisé en pourcentage dans le CSS n’est pas supporté pour ces zones de texte (exemple suivant). Input - Padding : 4% non supporté 7/11 Projet de spécialité Ensimag 2012 Le travail à faire consiste à remonter cette relation d’héritage au niveau de nsContainerFrame, et cette restructuration permettra de faciliter la résolution d’autres bugs par la suite. Héritage des classes à remanier Restructuration et validation Le changement d’héritage impose un remaniement quasi total de nsTextControlFrame. Il a fallu réimplémenter l’opération de Reflow et la façon dont sont calculés la taille et le positionnement de la Frame dans la page affichée par le navigateur. De plus, il a fallu s’assurer que la modification de l’héritage ne change pas l’affichage actuel des balises concernées (non régression). La validation de la restructuration passe par une batterie de tests hébergée sur les serveurs de Mozilla. Le navigateur offre aussi des outils de debug utiles pour corriger notre implémentation. Désormais, notre patch propose une réimplémentation de cette Frame et corrige aussi le bug lié au padding (cf précédemment). Input - Padding : 4% supporté 8/11 Projet de spécialité Ensimag 2012 3 - Gestion de projet Pour le projet, nous avons choisi d’utiliser les méthodes Agiles. Ce choix est justifié par la difficulté d’évaluer à l’avance le temps des tâches à faire, en particulier pour la restructuration du code de Gecko au niveau de nsTextControlFrame. Nous avons décidé de travailler en trois itérations pour l’ajout de l’attribut inputmode et en deux itérations pour la modification de l’héritage dans le moteur de rendu. Burndown du projet Ci dessus, la courbe verte représente l’évolution du travail pour l’ajout de l’attribut inputmode (3 sprints) et la courbe orange montre l’avancée pour la restructuration du moteur de rendu (2 sprints). 9/11 Projet de spécialité Ensimag 2012 III - Communauté Mozilla Nous sommes entrés en contact avec la communauté Firefox par l’intermédiaire de Mounir Lamouri, employé de Mozilla Corporation depuis deux ans. Il a été notre mentor pendant les quatre semaines, en suivant de près l’évolution du projet. C’est avec lui que nous avons défini les objectifs que nous nous sommes fixés, il a été notre interlocuteur privilégié pour répondre à nos questions et il s’est chargé de relire le code que nous avons proposé à la communauté pour nous faire des remarques. Nous avons eu l’occasion de le rencontrer dans les locaux de Mozilla à Paris lors d’un rassemblement de la communauté francophone. 1 - Soumission de patchs Une contribution à Mozilla s’effectue sous forme de soumission d’un patch. Une fois le code modifié et testé, le patch est proposé sur la page du bug correspondant. Ensuite, un système de review se met en place. Des personnes habilitées - souvent une ou deux - relisent le code proposé et font des remarques en retour. Le contributeur peut alors modifier son patch pour en proposer un nouveau, et ainsi de suite jusqu’à ce que la communauté accepte les modifications. Une revue de code peut prendre entre 2 jours et 6 mois, c’est pourquoi Mounir Lamouri nous a aidé à faire accélérer les choses, soit en relisant lui-même le patch, soit en demandant à d’autres de le faire. Les reviewers ne sont pas là pour modifier et améliorer le code soumis de façon à le rendre acceptable. L’esprit est vraiment de laisser le contributeur travailler jusqu’au bout, et s’il ne corrige pas son code en fonction des remarques, le travail sera perdu jusqu’à ce que quelqu’un d’autre s’y intéresse. 2 - Communication La communication est un atout clé dans le développement du logiciel libre. La communauté échange ainsi via IRC. Pendant quatre semaines, nous avons eu l’occasion de discuter avec des contributeurs d’origines très différentes, mais aussi avec des employés influents de Mozilla dont les conseils sont pertinents et adaptés. Il y a toujours quelqu’un pour répondre à une question sur les différentes chaînes thématiques : introduction, mobile, francophone, développeurs... Les channels IRC intéressants sont #developers, #introduction et #mozfr (canal de la communauté française). Une autre partie de la communication se fait par mailing-lists, toutefois les discussions se font le plus souvent sous forme de débats sur des nouvelles fonctionnalités plutôt que des explications. Le dernier vecteur d'échange de la communauté est Bugzilla, puisque chez Mozilla tout passe par des bugs (y compris la demande de droit d'accès au serveur de tests). 10/11 Projet de spécialité Ensimag 2012 IV - Bilan 1 - Bilan de l’équipe Ce projet nous a beaucoup appris. Tout d’abord, nous avons découvert ce que c’est que de contribuer à un logiciel libre. Nous nous sommes intégrés à une communauté en échangeant sur IRC, en posant des questions et en proposant des solutions. Nous avons même eu la chance de rencontrer nos interlocuteurs français lors d’un rassemblement de la communauté francophone dans les locaux de Mozilla à Paris. Nous avons dû faire des efforts pour répondre aux exigences de qualité. Nous avons aussi appris à ne pas paniquer avant de travailler sur une base de code déjà très conséquente et à bien se documenter avant de se lancer. Tout cela nous a forcé à être très autonomes, à interagir avec des personnes très qualifiées, et nous a donné l’opportunité de travailler sur un projet concret et professionnel. De plus, nous nous sommes familiarisés avec de nouveaux outils utilisés par la communauté : ● MXR : un outil en ligne pour parcourir la base de code de Mozilla ● Des bases de tests automatisées ● Mercurial : tout particulièrement les queues pour gérer les patchs ● L’environnement Android : cette partie a été à l’origine de plusieurs difficultés. Nous avons d’abord appris à développer des applications simples sur Android, avant de mettre en place un environnement pour Fennec, qui est plus complexe. 2 - Bilan de l’enseignement Nous avons particulièrement apprécié que l’Ensimag nous donne la possibilité de travailler sur un projet professionnel et complétement extérieur à l’école. C’est une excellente occasion de découvrir, d’apprendre de nouvelles façons de travailler et d’enrichir nos expériences professionnelles. Nous avons aimé pouvoir évoluer de façon très autonome, en ayant une salle réservée pour nous et un encadrant qui visiblement nous faisait confiance tout en restant assez disponible. 11/11