El selector de emojis bloquea el editor de mensajes en Android / Chrome

Este problema ha existido durante un par de meses y puedo reproducirlo aquí en Meta usando un dispositivo Android/Chrome (ambos con la última versión); de hecho, esto ha estado ocurriendo desde hace varios meses, desde enero aproximadamente.

El editor de mensajes parece “fallar” de vez en cuando cuando se elige un emoji propuesto.

Pasos para reproducir:

  1. Publica una respuesta a un tema y agrega algo de texto.
  2. Comienza a agregar un pulgar hacia arriba escribiendo “:+1” y luego toca el emoji propuesto :+1:.

Qué sucede:

El editor parece fallar de alguna manera o se vuelve a dibujar. Por lo general, se pierde algo del texto escrito.

No es reproducible al 100 %, pero puedo encontrar el problema fácilmente en menos de un minuto de probar.

2 Me gusta

¿Qué versión exacta de Android/Chrome estás utilizando?

Puedo reproducirlo. A continuación se muestra el seguimiento de la pila:

_application-bfbda341c2eb6dd7d61c681e17bdccec057c30e045ddc332927a7363150e9b1b.js:16386 Uncaught TypeError: Cannot read property '0' of null
    at HTMLLIElement.<anonymous> (application-bfbda341c2eb6dd7d61c681e17bdccec057c30e045ddc332927a7363150e9b1b.br.js:1)
    at HTMLLIElement.dispatch (ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.br.js:1)
    at HTMLLIElement.d.handle (ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.br.js:1)
(anonymous) @ application-bfbda341c2eb6dd7d61c681e17bdccec057c30e045ddc332927a7363150e9b1b.br.js:1
dispatch @ ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.br.js:1
d.handle @ ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.br.js:1

Ese es este línea

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/lib/autocomplete.js#L308

El error ocurre porque selectedOption es 0 (una sola sugerencia, es decir, la primera), mientras que autocompleteOptions es de alguna manera null.

Investigando el porqué ahora…

Así que, por ahora, no estoy seguro de la causa. Al principio sospechaba de esta PR de @Osama:

Pero añadí bastantes puntos de interrupción y no puedo encontrar realmente «quién» está mutando autocompleteOptions y estableciéndolo en null.

Que autocompleteOptions provenga del ámbito del cierre padre dos niveles hacia arriba también es bastante extraño y hace que el código sea un poco difícil de seguir y depurar.

8 Me gusta

Android 11/Chrome 89, los más recientes disponibles.

1 me gusta

@ljpp / @falco ¿pueden seguir reproduciendo este error? He probado muchas variaciones al insertar un emoji y no he logrado reproducirlo ni una sola vez. Si todavía pueden reproducirlo, ¿podrían compartir los pasos exactos, por favor? ¡Gracias!

1 me gusta

Sí, sigue fallando en Chrome para Android en mi caso. Debes seguir las instrucciones al 100% para reproducirlo, ya que es muy específico.

1 me gusta

Acabo de probarlo y no pude reproducirlo fácilmente. Sin embargo, estoy bastante seguro de que lo he visto varias veces durante el verano, de forma accidental mientras escribía una publicación real.

Edición: Preguntaré a nuestra comunidad si pueden proporcionar una cobertura de pruebas más extensa.

Edición 2: Ah, sí, ahora lo he reproducido yo mismo. Nuestra comunidad está probando y parece que hay más reproducciones por parte de usuarios habituales.

1 me gusta

Lo he reprochado accidentalmente, así que esto sigue abierto.

Todavía tenemos esto en nuestra lista; simplemente estamos encontrando que es extremadamente difícil de reproducir y depurar.

No puedo realmente colocar un pr-welcome en esto porque es demasiado difícil. Lo revisaremos en algún momento, estableciendo un temporizador de 6 meses.

¿Este problema aún persiste?

Sí, sigue presente. Personalmente, no pude reproducirlo tras 15 minutos de pruebas intensivas, por lo que pedí apoyo a nuestra comunidad. Varios usuarios lograron reproducirlo e incluso uno lo demostró con una captura de pantalla. Los síntomas permanecen sin cambios: una vez que tocas el emoji de pulgar arriba en el selector, el teclado se pliega y se pierde parte del contenido escrito en el editor.

Antes podía reproducirlo muy fácilmente, pero ahora no logro encontrar la forma exacta. El problema existe, pero no es reproducible al 100%. Seguiremos probando para intentar determinar si hay algún paso de la interfaz de usuario que desencadene esto.

1 me gusta

¿Puedes pedirle a alguien que pueda reproducirlo que vea si puede hacerlo en try.discourse.org?

Lo acabo de reproducir sin intentarlo.

Firefox 94.1.1 (Build #2015842491)

Y Chrome 95.0.4638.74

2 Me gusta

Siento que los selectores de emojis de plataformas no nativas sean el verdadero error aquí. :wink: ¿La solución trivial es usar el selector de emojis nativo de tu sistema operativo preferido?

Claro que suele haber una solución alternativa. No siempre, por ejemplo, puede haber emojis personalizados en uso en Discourse.

De cualquier manera, recargar la página y perder el contenido escrito es un comportamiento deficiente que deberíamos solucionar.

Ok, he vuelto a revisar esto hoy y logré reproducirlo después de cambiar el teclado virtual de mi teléfono a Gboard. Gboard a veces dispara los eventos keydown y keyup dos veces por una sola pulsación de tecla y si eso sucede con la última tecla que presionas antes de seleccionar un emoji del autocompletado, obtendrás un error.

No estoy seguro de qué causa que Gboard dispare estos eventos dos veces, pero parece depender de lo que hayas escrito y de tu configuración de Gboard.

Los eventos dobles causan un error debido a la forma en que está diseñada nuestra biblioteca de autocompletado. La biblioteca escucha los eventos keydown y keyup, y en keydown borra las sugerencias de autocompletado y en keyup ofrece nuevas sugerencias basadas en el nuevo término de autocompletado.

Sin embargo, hay una pequeña protección/optimización para evitar que la biblioteca realice trabajo duplicado cuando el término no ha cambiado desde las sugerencias anteriores, y aquí es donde ocurre el problema. El primer par de eventos keydown y keyup borra las sugerencias antiguas y ofrece nuevas como se esperaba, pero el segundo par erróneo borrará las sugerencias nuevamente en keydown pero no ofrecerá nuevas en keyup porque el término de autocompletado no ha cambiado.

La única “solución” menos improvisada que se me ocurre es eliminar la protección/optimización para que la biblioteca siempre ofrezca nuevas sugerencias en keyup, pero no estoy seguro de si esto es deseable o vale la pena.

Sé que queremos reescribir nuestra biblioteca de autocompletado en algún momento (es uno de los códigos más antiguos de la base de código y necesita desesperadamente una reescritura), así que tal vez este error podría esperar hasta que lleguemos a la reescritura.

5 Me gusta

¿El bloqueo es una especie de “bucle infinito”? ¿Podemos simplemente rastrear que hemos entrado en un bucle de retroalimentación y limpiar las cosas?

1 me gusta

No, el bloqueo se debe al acceso a una variable nula. Cuando se borran las sugerencias, la variable autocompleteOptions se establece en null y luego, cuando se toca una de las sugerencias renderizadas, esperamos que autocompleteOptions sea un array, pero es null.

Esto me da otra idea: ¿quizás podríamos comprobar si autocompleteOptions es null cuando se selecciona una sugerencia y, si la variable es null, volver a obtener las sugerencias para el término dado?

2 Me gusta

Sí, esto suena como una buena solución alternativa.

2 Me gusta

Ah, me siento tan tonto por no haber informado este detalle. Mi teléfono anterior era un Android One limpio, por lo que tenía Gboard por defecto, y me ha seguido desde entonces al siguiente dispositivo (Sammy A42 5G). Pero la mayoría de los dispositivos Android que se venden hoy en día usan una aplicación de teclado de terceros por defecto.

Genial ver este progreso.

2 Me gusta

He fusionado mi solución para este error:

La solución se ha implementado en Meta y en tu sitio @ljpp, hazme saber si tus usuarios aún pueden reproducirlo.

5 Me gusta