Le bug `<textarea>` de Firefox corrigé après 25 ans
(bugzilla.mozilla.org)- L’ancien bug 33654 de Firefox concernait le fait que
<textarea>ajoutait aussi l’espace des barres de défilement lors de l’application deROWS=etCOLS=, ce qui l’affichait plus grand que le nombre de lignes et de colonnes demandé ; il est désormais fermé comme doublon du bug 1830576 - Dans les environnements où les overlay scrollbars sont désactivées ou où le réglage « toujours afficher les barres de défilement » est activé,
<textarea rows=N>était régulièrement calculé avec une hauteur d’environ N+1 lignes - Les premières discussions se sont étendues à l’héritage des polices, à l’application forcée de
monospace, au calcul decolsfondé sur la largeur moyenne dewetW, ainsi qu’à la façon de réserver l’espace des barres de défilement ; des cas de test, correctifs et captures d’écran se sont accumulés pendant longtemps - Concrètement,
rows=1pouvait paraître faire 3 lignes,rows=2s’afficher avec une hauteur de 3 lignes, et aveccols=80, l’emplacement du retour à la ligne différait entre IE et Firefox, ce qui désalignait le contrôle de mise en page des formulaires selon les navigateurs - Avec le passage du bug 1830576 à l’état
VERIFIED FIXED, l’application de l’espacement des barres de défilement est devenue cohérente entre WebKit, Chromium et Firefox, et le bug 33654 a été reclassé enRESOLVED DUPLICATE
État et périmètre du bug 33654
- Bug 33654 correspondait à un défaut où
<textarea>appliquait incorrectementROWS=etCOLS=, en ajoutant un espace supplémentaire pour les barres de défilement horizontales et verticales lorsque les overlay scrollbars étaient désactivées - Le produit et composant sont
Core :: Layout: Form Controls, couvrant la mise en page et l’apparence des contrôles de formulaire HTML, notamment des éléments commetextarea - Son état actuel est
RESOLVED DUPLICATE of bug 1830576- Le titre du bug de référence, 1830576, est
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration - Le bug 1830576 est à l’état
VERIFIED FIXED
- Le titre du bug de référence, 1830576, est
- Le bug a été ouvert il y a 26 ans et fermé comme
RESOLVED DUPLICATEil y a 2 ans - Les métadonnées indiquent la version
Trunk, la plateformex86 / All, le typedefect, la prioritéP3et la sévéritéS3 - Les mots-clés incluent
testcase, le Whiteboard est[html][behavior]relnote-devel, et le nombre de votes affiché est 99 - Les pièces jointes sont indiquées comme
17 files, 17 obsolete files, avec un historique répété d’ajouts de cas de test, de patches et de captures d’écran
Les premiers symptômes observés
- Dans le signalement initial, Andrew McMillan indiquait qu’un exemple de
TEXTAREAdéfini avecROWS=5 COLS=30s’affichait plutôt comme unROWS=7 COLS=48 - Les premiers commentaires relayaient aussi des cas où
INPUT TYPE=TEXTetTEXTAREAn’utilisaient pas correctement la police spécifiée, ou bien où la zone restait trop haute même quand la barre de défilement apparaissait - La discussion a ensuite convergé vers l’idée que la mise en page du textarea recevait de mauvaises informations, avec un espace supplémentaire dans les colonnes et une ligne de plus dans les rangées
- La possibilité que cela vienne d’une réservation anticipée de l’espace destiné aux barres de défilement a également été évoquée très tôt
Calcul des polices et premiers correctifs
- Dans un cas issu du groupe de discussion HTML authoring, l’usage conjoint de
textarea { font-size: 8pt }et de<textarea cols="40" rows="12">montrait qu’IE rendait la largeur correctement, alors que Mozilla semblait la calculer comme si la police était en 12pt - Un fichier de test utilisant la police
arialcontenait<textarea NAME=system_code wrap=soft rows=5 cols=30 WRAP style="font-family:arial"> - Rod estimait que le calcul de taille était correct avec la police par défaut, et que le vrai problème tenait davantage au fait que le textarea n’utilisait pas la bonne police
- Kin a découvert que lorsque l’indicateur
PlainTextde l’éditeur était activé, du code forçaitfont-family: monospace;sur la zone de contenu du TextControl- En retirant ce code, la bonne police était utilisée
- Mais en mode NavQuirks, une chaîne de 30 caractères dans un textarea de 30 colonnes n’occupait encore qu’environ les 2/3 de la largeur
- La cause pointée était la manière dont
nsFormControlHelpercalculait la largeur du textarea en prenant la largeur moyenne dewetWdans la police, en la multipliant par le nombre de colonnes, puis en ajoutant la largeur de la barre de défilement
- Le correctif
Patch to use the correct font.ajoutaiteEditorEnableWrapHackMaskaux indicateurs d’initialisation de l’éditeur plain text et limitait conditionnellement l’application defont-family: monospace; - Ce patch a un temps conduit à l’état
RESOLVED FIXED, mais le rapporteur d’origine a signalé que siCOLS=...semblait correct,ROWS=...restait erroné, ce qui a rouvert le bug
Reproductions répétées et bugs en doublon
- La liste des bugs en doublon comprend de nombreux cas où
<textarea>paraissait avoir une ligne de plus que demandé, ou oùrows=1semblait faire 3 lignes- Bug 46106:
Textarea displaying more rows than designated. - Bug 116779:
<textarea rows=1> shows 3 rows - Bug 133342:
textarea always rendered with one more row than defined - Bug 186271:
textareas are 1 row taller than specified - Bug 206946:
<textarea rows="2"> shows ~3 lines - Bug 911226:
<TEXTAREA> always rendered one line too tall !
- Bug 46106:
- Le cas de test interactif était un document HTML 4.01 Strict permettant de modifier
rowsetcolsvia des boutons, sans utiliser de balise de police ni de police à largeur variable- Le résultat montrait toujours 3 colonnes de plus que la valeur demandée, et généralement 1 ligne de plus
- En demandant
rows=1, 3 lignes étaient affichées
- Sur des builds trunk Linux et Win2000 de 2002, on rapportait que
<textarea cols=40 rows=2></textarea>s’affichait sur 3 lignes, et qu’avecrows=N, on obtenait exactementN+1lignes - Les tests W3C HTML 4.01 servaient aussi de référence, avec des commentaires indiquant que le problème était particulièrement visible dans les tests liés à
ROWS - Sous Windows 2000 et Mozilla
0.9.3, des exemples montraient également qu’un textarearows=1ne paraissait clairement pas faire une seule ligne
Débat sur le calcul de l’espace des barres de défilement
- Le commentaire 86 expliquait que la taille du textarea était calculée comme la valeur de
cols/rowsdemandée plus l’espace des barres de défilement - À la différence d’IE, Mozilla n’affichait les barres de défilement que lorsqu’elles étaient nécessaires, ce qui amenait les utilisateurs à percevoir ce comportement comme cassé
- Trois options possibles ont été proposées
- Ne pas ajouter la taille des barres de défilement lors du calcul du textarea
- Toujours afficher les barres de défilement, comme IE
- N’inclure que les barres de défilement effectivement affichées
- La troisième option a été critiquée car la taille dépendrait alors de l’affichage des barres, tandis que l’affichage des barres dépend lui-même de la taille, créant une dépendance circulaire
- Le commentaire 87 proposait une quatrième option : faire en sorte que
ROWSetCOLSne contrôlent que la taille du contenu du textarea, et que le textarea s’agrandisse si les barres de défilement apparaissent - La direction prise ensuite pour l’implémentation consistait à effectuer un reflow avec une largeur/hauteur sans barres de défilement pour déterminer si elles étaient nécessaires, puis à refaire un reflow avec les nouvelles dimensions si besoin
Impact visible pour les utilisateurs
- Quand
rows="2"produisait un textarea haut de 3 lignes, l’intention de guider visuellement la quantité de texte attendue devenait floue- Une application web demandait un court texte de résumé et utilisait
rows="2"pour suggérer une saisie « plus qu’une ligne, mais pas une dissertation » - En raison des différences de comportement entre Firefox, IE6 et Opera 8, une même valeur
rowsproduisait des indications visuelles différentes selon l’agent utilisateur
- Une application web demandait un court texte de résumé et utilisait
- Des commentaires ont aussi souligné que le comportement de Firefox restait incorrect même quand le contenu du textarea ne nécessitait aucun défilement
- Pour un champ d’adresse censé rarement dépasser trois lignes, définir
rows="3"conduisait malgré tout Firefox à afficher systématiquement une ligne supplémentaire - La page devenait inutilement plus grande, et l’utilisateur pouvait penser que le champ, plus haut que prévu, n’avait pas encore été suffisamment rempli
- Pour un champ d’adresse censé rarement dépasser trois lignes, définir
- Dans la comparaison avec
cols=80, une capture expliquait qu’IE remplissait 80 caractères1jusqu’au bord de la barre de défilement avant de passer à la ligne, tandis que Firefox laissait encore la place pour 2 caractères après les 801, puis affichait une barre de défilement horizontale - En 2019, des commentaires signalaient encore la présence du problème, et la carte Trello de Discord
Chat bar is a line taller than usual on Firefoxétait citée comme exemple d’impact
Des tentatives de correction sur la durée
- Hideo Saito a joint à plusieurs reprises des patches et cas de test
patch for rows and cols- cas de test du patch
wrap="off" base patchadditional patch for another bugpatch which does not remove space
- Une approche consistait à faire exécuter
nsTextControlFrame::Reflowavec une intrinsic size excluant les barres de défilement, puis, si celles-ci étaient présentes, à leur ajouter leur taille avant de relancer le reflow - Une autre approche examinée consistait à modifier
GetScrollbarStylespour permettre au text control frame de choisir entreauto,hiddenetscrollpour les barres de défilement - roc préférait une solution traitée dans
nsTextControlFrameplutôt qu’une approche introduisant de nombreux changements dansnsGfxScrollFrame - Les patches ultérieurs ont fait l’objet de plusieurs cycles de revue et de reprise autour de mécanismes comme
SetScrollbarStyles,GetScrollbarStyles,SetScrollbarSpace,GetScrollbarOverflowState,FrameNeedsReflowet les callbacks post-reflow - Certains patches ont reçu un
review-ou ont été rendus obsolètes, les relecteurs signalant la nécessité de mises à jour adaptées au trunk
Contournements temporaires et limites
- Il a été proposé d’ajouter
textarea{ overflow-x: hidden }en CSS pour corriger le problème - Cette méthode n’était valable qu’à condition qu’aucune barre de défilement horizontale ne soit nécessaire
- D’autres commentaires ont rétorqué que ce bug ne pouvait pas être corrigé via le seul
overflowCSS, et que Firefox était le seul navigateur à rendre les textarea avec une ligne supplémentaire - Emilio Cobos Álvarez a indiqué que la cause semblait liée à la taille des barres de défilement et qu’appliquer
scrollbar-width: noneà<textarea>semblait résoudre le problème - Le même commentaire ajoutait cependant que le bug devait malgré tout être corrigé proprement
Conclusion
- Il y a 3 ans, BugBot notait que la sévérité de ce bug était relativement faible (
S3), mais qu’il comptait 27 doublons, 103 votes et 91 personnes en CC, et demandait s’il fallait envisager une hausse de sévérité - Le résumé du bug a été modifié de
TEXTAREA incorrectly applying ROWS= and COLS=enTEXTAREA incorrectly applying ROWS= and COLS= (horizontal / vertical scrollbar extra space, with overlay scrollbars disabled) - Daniel Holbert a ajouté comme dépendance le bug 1830576,
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration - Luke Warlow a demandé si le bug 33654 pouvait être fermé maintenant que le bug 1830576 avait été corrigé, puisque l’application de l’espacement des barres de défilement était désormais cohérente entre WebKit, Chromium et Firefox
- Emilio Cobos Álvarez a approuvé cette conclusion, et le bug 33654 est passé de
NEWàRESOLVEDavant d’être fermé commeDUPLICATE - Le doublon retenu est le bug 1830576, qui est à l’état
VERIFIED FIXED
1 commentaires
Commentaires sur Hacker News
Ha ! J’ai suivi ce bug pendant la majeure partie de ces 25 ans. À l’époque, Firefox n’existait pas encore, et il avait été enregistré côté Mozilla, avant ou après cette période, plutôt que pour Netscape Navigator
Je ne me souviens plus pourquoi je le suivais, mais j’ai sans doute laissé un commentaire. Tous les quelques années, je recevais un mail de notification et ça me faisait toujours rire, puis il a enfin été corrigé il y a quelques jours
Je me suis toujours dit que quelque chose comme
html { background: transparent; }devrait simplement fonctionner. Cela dit, cette correction de bug ne fait pas vraiment cela. D’abord, ce n’est pas une fonctionnalité activée par défaut par les sites web, mais un réglage que l’utilisateur ou une extension peut activer. C’est probablement mieux ainsi, car si c’était autorisé par défaut, cela aurait ouvert une nouvelle voie au clickjackingC’est un peu hors sujet, mais je déteste vraiment cette mode des indications de durée lisibles par les humains comme « il y a un mois ». Affichez juste la date et je ferai le calcul moi-même
Outlook, au moins sur Mac, est le pire. Les mails d’avant aujourd’hui apparaissent par exemple juste comme « hier », et il faut cliquer sur le message pour voir jusqu’à l’heure. Je reçois des dizaines de mails par jour, donc voir 50 messages d’affilée marqués seulement « hier » ne sert à rien
La bière doit être fraîche, et les horodatages précis
La Bugzilla de Firefox fait clairement partie des suivis de bugs les plus anciens encore en activité. Elle a connu d’innombrables révisions, et il est impressionnant qu’elle ait conservé autant de sa sensation d’origine. Avant, c’était une base de code assez brute, presque monstrueuse
Vers 2000, dans une organisation de développement Windows, nous avons déployé une instance pour remplacer un outil interne de suivi de bugs basé sur Microsoft Access/Outlook. C’était complexe, mais pendant un temps c’était pratiquement ce qui se faisait de mieux en matière de suivi de bugs. FogBugz commençait tout juste à cette époque, et je pense que leur équipe a été l’une des premières à prendre vraiment l’expérience utilisateur au sérieux
À l’inverse, FogBugz est un outil que j’ai toujours eu envie d’essayer dès que l’occasion se présenterait
Ce genre de chose me réchauffe le cœur. J’ai récemment vécu quelque chose de similaire avec un bug Firefox vieux de 24 ans : https://bugzilla.mozilla.org/show_bug.cgi?id=62151
Parmi les bugs non résolus de longue date, le plus agaçant pour moi est l’impossibilité dans LibreOffice de définir correctement l’axe x d’un nuage de points au format date
https://bugs.documentfoundation.org/show_bug.cgi?id=54132
C’est un bug vieux de 12 ans. À en juger par les commentaires, le code est si « horriblement complexe » qu’ils hésitent à le corriger, de peur de provoquer des régressions
La prochaine fois, j’aimerais qu’ils s’attaquent à XDG. Ça aussi, on l’attend depuis 20 ans [1]
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=259356
Honnêtement, cette spécification ne résout pas activement de vrais problèmes rencontrés par les gens. L’essentiel de son adoption vient de personnes agacées par l’organisation du répertoire
$HOMEqui ont harcelé les mainteneurs, et 99 % des utilisateurs se moquent de savoir si un programme respecte ou non les répertoires par défaut XDG. Cela sert surtout à pouvoir dire que c’est « plus propre », conformément à une spécification freedesktop qui n’a jamais été largement adoptée en plus de 20 ansPersonnellement, je n’aime pas cette séparation floue entre configuration, données et cache, ni les intentions implicites qu’elle véhicule. Tout ne rentre pas dans ces catégories, et cela rend alors le comportement du système difficile à prévoir. Un démon va-t-il effacer mon cache ? L’utilisateur va-t-il copier partout son dossier de configuration ? Qu’est-ce qui sera sauvegardé exactement ? La spécification ne standardise pas la façon dont ces dossiers doivent réellement être traités. C’est volontairement vague, mais d’une manière qui casse dès que les gens commencent à faire des suppositions
C’est un peu comme séparer
/usrde la racine, ou/usr/localde la racine, ou avoir/opt. On a l’impression d’essayer de créer encore une nouvelle relique d’une époque révolue qui continue de traînerDans notre produit aussi, on le prend en charge à contrecœur, mais uniquement si les variables d’environnement concernées sont explicitement définies. Quand elles ne le sont pas, on ignore à 100 % le comportement XDG qui dit que cela devrait être la valeur par défaut sur tous les systèmes Linux. Parce que ce n’est pas comme ça que d’autres UNIX, comme macOS, sont censés fonctionner. On a juste ajouté ce qu’il fallait pour éviter que des passionnés d’Arch Linux débarquent chaque semaine sur le bug tracker pour exiger son adoption, alors qu’ils représentent moins de 1 % de l’ensemble des utilisateurs. C’est déjà assez difficile de documenter où les utilisateurs doivent chercher les fichiers de notre produit sur leur système. Les utilisateurs ne connaissent pas toujours XDG, et pour la plupart ce n’est déjà pas une convention établie qu’ils attendent. À part pour ceux qui veulent un répertoire personnel propre, ça n’apporte pas une valeur forte, et il y a trop d’héritage pour faire basculer tout le monde vers cette spécification
Honnêtement, il faudrait tout repenser et aller vers une solution basée sur des conteneurs où les applications desktop ne peuvent pas sortir de leur petite prison. Quelque chose de très proche des applis snap. On pourrait aussi apprendre un peu de Nix. Il faut reconnaître comme un échec l’idée de faire en sorte que toutes les applications utilisateur Linux du monde prêtent attention aux répertoires par défaut XDG, voire même au répertoire personnel, et les adoptent. C’est déjà assez difficile de prendre en charge les ports Mac et Windows, qui ne suivent pas ce comportement. Il faut sortir du modèle de permissions UNIX où les programmes s’exécutent avec les droits de l’utilisateur, et faire tourner chaque programme sous son propre uid. C’est comme ça qu’Android fonctionne
J’aimerais vraiment qu’ils corrigent le bug où l’option de copie se désactive aléatoirement alors qu’il y a bien du texte à copier. C’est à devenir fou
AWS résout ce problème en supprimant périodiquement les vieux bugs et toutes les mentions qui en parlent
Un article lié en août dernier :
Happy 25th Birthday to Bugzilla
https://news.ycombinator.com/item?id=37279543
Sympa ! Mais le 2000-03-28, ce n’est pas encore il y a 25 ans