El bug de Firefox en `<textarea>` corregido después de 25 años
(bugzilla.mozilla.org)- El antiguo Bug 33654 de Firefox era un problema en el que
<textarea>se mostraba más grande que las filas y columnas especificadas al aplicarROWS=yCOLS=porque también sumaba el espacio de la barra de desplazamiento, y ahora se cerró como duplicado de Bug 1830576 - En entornos donde las overlay scrollbars están desactivadas o se usa la opción “always show scrollbars”, se repetía el fenómeno de que
<textarea rows=N>se calculaba con una altura de aproximadamente N+1 filas - La discusión inicial se amplió a la herencia de fuentes, la aplicación forzada de
monospace, el cálculo decolsbasado en el ancho promedio dewyW, y la forma de reservar espacio para la barra de desplazamiento; durante mucho tiempo se acumularon casos de prueba, parches y capturas de pantalla - En la práctica,
rows=1podía verse como de 3 filas orows=2como de 3 filas de alto, y encols=80la posición del salto de línea difería entre IE y Firefox, desajustando el control del layout de formularios entre navegadores - Cuando Bug 1830576 pasó a
VERIFIED FIXED, la aplicación del espacio de la barra de desplazamiento quedó consistente entre WebKit, Chromium y Firefox, y Bug 33654 se ordenó comoRESOLVED DUPLICATE
Estado y alcance de Bug 33654
- Bug 33654 era un defecto por el cual
<textarea>aplicaba incorrectamenteROWS=yCOLS=, generando espacio adicional para las barras de desplazamiento horizontal y vertical cuando las overlay scrollbars estaban desactivadas - El producto y componente son
Core :: Layout: Form Controls, que cubre el layout y la apariencia de los controles de formulario HTML, en particular elementos comotextarea - Su estado actual es
RESOLVED DUPLICATE of bug 1830576- El título del bug duplicado, Bug 1830576, es
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration - El estado de Bug 1830576 es
VERIFIED FIXED
- El título del bug duplicado, Bug 1830576, es
- El bug se abrió hace 26 años y se cerró hace 2 años como
RESOLVED DUPLICATE - En los metadatos figuran versión
Trunk, plataformax86 / All, tipodefect, prioridadP3y severidadS3 - La palabra clave es
testcase, el Whiteboard es[html][behavior]relnote-devel, y el número de votos aparece como 99 - Los adjuntos figuran como
17 files, 17 obsolete files, con una carga repetida de casos de prueba, parches y capturas de pantalla
Los primeros síntomas detectados
- En el reporte inicial, Andrew McMillan señaló que un ejemplo de
TEXTAREAdefinido conROWS=5 COLS=30se mostraba aproximadamente comoROWS=7 COLS=48 - En los primeros comentarios se sucedieron casos en los que
INPUT TYPE=TEXTyTEXTAREAno usaban correctamente la fuente especificada, o el área era demasiado alta incluso cuando aparecía la barra de desplazamiento - Después, la discusión convergió en que el layout de textarea estaba recibiendo información incorrecta: había espacio extra en las columnas y una fila adicional
- Desde temprano también se consideró como posible causa la forma de reservar anticipadamente espacio para la barra de desplazamiento
Cálculo de fuentes y parches iniciales
- En un caso del newsgroup de HTML authoring, al usar
textarea { font-size: 8pt }junto con<textarea cols="40" rows="12">, IE renderizaba el ancho correctamente, pero Mozilla parecía calcularlo con base en una fuente de 12pt - Un archivo de prueba que usaba la fuente
arialincluía<textarea NAME=system_code wrap=soft rows=5 cols=30 WRAP style="font-family:arial"> - Rod consideró que, como el cálculo de tamaño era correcto con la fuente predeterminada, el problema central no era tanto el sizing sino que textarea no estaba usando la fuente correcta
- Kin encontró código que forzaba
font-family: monospace;en el área de contenido de TextControl cuando estaba activado el flagPlainTextdel editor- Al eliminar ese código, se usaba la fuente correcta
- Sin embargo, en modo NavQuirks seguía quedando el problema de que una cadena de 30 caracteres dentro de un textarea de 30 columnas ocupaba solo alrededor de 2/3 del ancho
- Como causa se apuntó al método de
nsFormControlHelper, que calculaba el ancho del textarea tomando el ancho promedio dewyWde la fuente, multiplicándolo por el número de columnas y sumando el ancho de la barra de desplazamiento
Patch to use the correct font.agregabaeEditorEnableWrapHackMaska los flags de inicialización del editor de texto plano y restringía condicionalmente la aplicación defont-family: monospace;- Ese parche llegó a marcarse como
RESOLVED FIXED, pero se reabrió cuando el reportero original indicó queCOLS=...estaba bien, peroROWS=...seguía funcionando mal
Reproducción repetida y bugs duplicados
- La lista de bugs duplicados incluía muchos casos donde
<textarea>se veía una línea más alto que lo indicado orows=1aparecía como si tuviera 3 líneas- 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:
- El interactive testcase era un documento HTML 4.01 Strict donde los valores de
rowsycolspodían cambiarse con botones, y no usaba font tag ni fuentes de ancho variable- El resultado era que siempre se mostraban 3 columnas más de las especificadas, y normalmente 1 fila más
- Si se pedía
rows=1, se mostraban 3 filas
- En builds trunk de Linux y Win2000 de 2002, se reportó que
<textarea cols=40 rows=2></textarea>se mostraba con 3 filas, y que conrows=Naparecían exactamenteN+1filas - También se usó como referencia la prueba de W3C HTML 4.01, y hubo comentarios señalando que el problema se veía claramente en la prueba relacionada con
ROWS - En Windows 2000 y Mozilla
0.9.3también se compartieron ejemplos donde un textarea conrows=1claramente no se veía como de 1 fila
Debate sobre el cálculo del espacio para la barra de desplazamiento
- El Comment 86 explicaba que el tamaño del textarea se calculaba como el valor especificado de
cols/rowsmás el espacio de la barra de desplazamiento - A diferencia de IE, Mozilla mostraba la barra de desplazamiento solo cuando era necesaria, por lo que los usuarios percibían esto como un comportamiento roto
- Se propusieron tres opciones posibles
- No sumar el tamaño de la barra de desplazamiento al calcular el tamaño del textarea
- Mostrar siempre la barra de desplazamiento, como IE
- Incluir solo la barra de desplazamiento que vaya a mostrarse
- A la tercera opción se le objetó que el tamaño dependería de si se muestra la barra de desplazamiento, y eso a su vez dependería otra vez del tamaño, creando una circularidad
- El Comment 87 propuso como cuarta opción que
ROWSyCOLScontrolaran solo el tamaño del contenido del textarea, y que si aparecía la barra de desplazamiento el textarea creciera - Después, la dirección de implementación pasó a discutirse como un proceso de hacer reflow con width/height sin barra de desplazamiento para determinar si esta era necesaria, y luego, si hacía falta, volver a hacer reflow con un nuevo width/height
Impacto visible para los usuarios
- Si se especificaba
rows="2"pero aparecía un textarea con altura de 3 filas, se desdibujaba la intención de guiar visualmente la cantidad de texto esperada- Una aplicación web pedía un texto breve de resumen y usaba
rows="2"para sugerir una cantidad “más que una línea pero no un ensayo” - Debido a las diferencias entre Firefox, IE6 y Opera 8, el mismo valor de
rowsproducía guías visuales distintas según el user agent
- Una aplicación web pedía un texto breve de resumen y usaba
- También continuaron comentarios diciendo que el comportamiento de Firefox era incorrecto incluso cuando el contenido del textarea no requería desplazamiento
- Aunque se configurara
rows="3"para un campo como una dirección, cuyo contenido rara vez superaría tres líneas, Firefox siempre mostraba una fila extra - La página se hacía innecesariamente más grande y el usuario podía pensar que todavía no había llenado suficiente información porque la caja era más grande de lo esperado
- Aunque se configurara
- En la comparación con
cols=80, se describía con capturas que IE hacía el salto de línea después de llenar hasta el borde de la barra de desplazamiento con 80 caracteres1, mientras que Firefox dejaba espacio para 2 caracteres más después de esos 80 y luego mostraba una barra de desplazamiento horizontal - Incluso en 2019 seguían apareciendo comentarios indicando que el problema persistía, y se citó como ejemplo de impacto una tarjeta de Trello de Discord titulada
Chat bar is a line taller than usual on Firefox
Intentos de parche durante muchos años
- Hideo Saito adjuntó varias veces parches y casos de prueba
patch for rows and cols- testcase del parche de
wrap="off" base patchadditional patch for another bugpatch which does not remove space
- Un enfoque consistía en ejecutar
nsTextControlFrame::Reflowcon un intrinsic size que excluyera la barra de desplazamiento y, si la barra existía, sumar su tamaño al intrinsic size y volver a hacer reflow - También se trató un enfoque que modificaba
GetScrollbarStylespara que el text control frame pudiera controlar si la barra de desplazamiento seríaauto,hiddenoscroll - roc prefería resolverlo en
nsTextControlFrameen lugar de introducir muchos cambios ennsGfxScrollFrame - Los parches posteriores repitieron revisiones y retrabajo alrededor de mecanismos como
SetScrollbarStyles,GetScrollbarStyles,SetScrollbarSpace,GetScrollbarOverflowState,FrameNeedsReflowy callbacks post-reflow - Algunos parches recibieron
review-o quedaron obsoletos, y los revisores señalaron que hacía falta actualizarlos para el trunk
Soluciones temporales y límites
- Hubo una sugerencia de que agregar CSS
textarea{ overflow-x: hidden }resolvía el problema - Se aclaró que esto solo aplicaba cuando no era necesaria una barra de desplazamiento horizontal
- Otros comentarios respondieron que este bug no podía corregirse solo con CSS
overflowy que Firefox era el único navegador que renderizaba textarea agregando una línea extra - Emilio Cobos Álvarez comentó que la causa parecía ser el tamaño de la barra de desplazamiento y que aplicar
scrollbar-width: nonea<textarea>parecía resolverlo - Aun así, el mismo comentario añadía que el bug como tal debía corregirse
Cierre final
- Hace 3 años, BugBot señaló que, aunque la severidad de este bug era relativamente baja (
S3), tenía 27 duplicados, 103 votos y 91 personas en CC, y pidió revisar una posible subida de severidad - El resumen del bug cambió de
TEXTAREA incorrectly applying ROWS= and COLS=aTEXTAREA incorrectly applying ROWS= and COLS= (horizontal / vertical scrollbar extra space, with overlay scrollbars disabled) - Daniel Holbert añadió como dependencia Bug 1830576,
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration - Luke Warlow preguntó si, dado que Bug 1830576 ya estaba corregido, podía cerrarse este bug porque la aplicación del espacio de la barra de desplazamiento ya era consistente entre WebKit, Chromium y Firefox
- Emilio Cobos Álvarez estuvo de acuerdo, y Bug 33654 pasó de
NEWaRESOLVEDy se cerró comoDUPLICATE - El duplicado quedó apuntando a Bug 1830576, cuyo estado es
VERIFIED FIXED
1 comentarios
Opiniones de Hacker News
¡Ja! Estuve suscrito a este bug durante la mayor parte de esos 25 años. En ese entonces no existía Firefox, y esto se había registrado como un bug del lado de Mozilla, de antes o después, no de Netscape Navigator.
No recuerdo por qué me suscribí, pero probablemente había dejado un comentario. Cada tantos años me llegaba un correo de notificación y siempre me daba risa; hace unos días por fin lo arreglaron.
Siempre pensé que algo como
html { background: transparent; }simplemente debería funcionar. Aunque esta corrección de bug en realidad no hace eso. Para empezar, no es una función que los sitios web elijan por defecto, sino una configuración que puede activar el usuario o una extensión. Probablemente sea mejor así; si se permitiera por defecto, habría abierto una nueva vía para el clickjacking.Me salgo un poco del tema, pero realmente odio la moda de mostrar duraciones fáciles de leer para humanos como “hace un mes”. Que muestren la fecha y ya; yo puedo hacer la cuenta.
Outlook, al menos la versión para Mac, es lo peor. Los correos anteriores a hoy aparecen, por ejemplo, solo como “ayer”, y hay que hacer clic en el correo para ver también la hora. Recibo decenas de correos al día, así que si 50 mensajes aparecen en fila solo como “ayer”, no sirve para nada.
La cerveza, fría; las marcas de tiempo, exactas.
Bugzilla de Firefox es sin duda uno de los rastreadores de bugs que llevan más tiempo en operación. Es impresionante que, pese a haber pasado por muchísimas revisiones, todavía conserve bastante de su sensación original. Antes era una base de código bastante áspera y monstruosa.
Alrededor del año 2000, en una organización de desarrollo para Windows, monté una instancia para reemplazar un rastreador de bugs interno basado en Microsoft Access/Outlook. Era complejo, pero durante un tiempo fue casi de lo mejor en rastreadores de bugs. FogBugz también estaba empezando por esa época, y creo que ese equipo fue uno de los primeros en tomarse en serio la experiencia de usuario.
En cambio, FogBugz es una herramienta que siempre quise probar si se me daba la oportunidad.
Cosas así calientan el corazón. Hace poco me pasó algo parecido con un bug de Firefox de 24 años: https://bugzilla.mozilla.org/show_bug.cgi?id=62151
Entre los bugs sin resolver de larga data, el que más me molesta es que en LibreOffice no se pueda configurar correctamente el eje x de un diagrama de dispersión con formato de fecha.
https://bugs.documentfoundation.org/show_bug.cgi?id=54132
Es un bug de 12 años. Por los comentarios, parece que no quieren arreglarlo porque el código es demasiado “horriblemente complejo” y hay muchas probabilidades de que cualquier corrección introduzca regresiones.
Espero que la próxima vez se ocupen de XDG. También llevo 20 años esperando esto [1]
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=259356
Sinceramente, esta especificación no resuelve de manera activa los problemas reales que tiene la gente. La mayor parte de la adopción es resultado de personas a las que les molesta la organización del directorio
$HOMEpresionando insistentemente a los mantenedores, y al 99% de los usuarios no les importa si un programa sigue o no los directorios base de XDG. A lo sumo sirve para poder decir que es “más limpio”, siguiendo una especificación de freedesktop que no ha logrado una adopción amplia en más de 20 años.En lo personal, no me gusta esa separación laxa entre configuración/datos/caché ni sus intenciones implícitas. No todo encaja en esas categorías, y eso vuelve difícil predecir el comportamiento del sistema. ¿Un daemon va a borrar mi caché? ¿El usuario va a andar copiando su carpeta de configuración? ¿Exactamente qué se va a respaldar? La especificación no tiene un estándar sobre cómo deberían tratarse realmente las carpetas. Es ambigua a propósito, pero de una forma que puede romper cosas cuando la gente hace suposiciones.
Es parecido a separar
/usrde la raíz, separar/usr/localde la raíz, o tener/opt. Se siente como otro intento de crear un residuo de una época pasada que seguirá quedándose ahí.En nuestro producto también lo soportamos a regañadientes, pero solo cuando la variable de entorno correspondiente está configurada explícitamente. Ignoramos al 100% el comportamiento de XDG que dice que, si no está configurada, esos deberían ser los valores predeterminados en todos los sistemas Linux. Es porque difiere de lo que esperan otros sistemas tipo UNIX, como MacOS. Solo pusimos lo suficiente para evitar que los fanáticos de Arch Linux lleguen cada semana al rastreador de bugs a exigir que lo adoptemos, y ellos no llegan ni al 1% del total de usuarios. Ya es bastante difícil documentar dónde pueden encontrar los usuarios los archivos de nuestro producto en sus sistemas. Los usuarios no siempre conocen XDG, y para la mayoría XDG tampoco es una convención establecida que ya esperen. No tiene mucho valor salvo para quienes quieren un directorio de usuario limpio, y hay demasiado legado como para mover a todos a esta especificación.
Sinceramente, habría que repensarlo todo e ir por una solución basada en contenedores en la que las apps de escritorio no puedan escapar de una pequeña cárcel. Algo muy parecido a las apps snap. También se podría aprender un poco de Nix. Hay que admitir que fue un fracaso intentar que todas las apps de usuario de Linux del mundo se preocupen por los directorios base de XDG, e incluso por el directorio de usuario, y los adopten. Ya es suficientemente difícil soportar ports para Mac y Windows, que no siguen este comportamiento. Hay que salir del modelo de permisos UNIX en el que los programas se ejecutan con permisos del usuario y ejecutar cada programa con su propio uid. Android funciona así.
Ojalá arreglen el bug en el que la opción de copiar se desactiva aleatoriamente aunque haya texto para copiar. De verdad me vuelve loco.
AWS resuelve este problema borrando periódicamente los bugs antiguos y todas las menciones a ellos.
Artículo relacionado de agosto pasado:
Happy 25th Birthday to Bugzilla
https://news.ycombinator.com/item?id=37279543
¡Genial! Aunque 2000-03-28 todavía no fue hace 25 años.