Las previsualizaciones de PDF en línea se reinician a la página 1 al desplazarse por un tema

Resumen

Las previsualizaciones de PDF en línea reinician constantemente su posición de desplazamiento (vuelven a la página 1) al desplazarse por un tema largo. Esto sucede porque el elemento incrustado de PDF se destruye y se vuelve a insertar cuando la publicación sale de la vista, probablemente debido al reciclaje/virtualización del flujo de publicaciones de Discourse.

Esto afecta a todos los navegadores, a todos los PDF y ocurre incluso con todos los complementos y temas desactivados.

Pasos para reproducir

  1. Cree un tema con un archivo adjunto en PDF.
  2. Asegúrese de que el componente de previsualizaciones de PDF en línea esté activo.
  3. Desplácese hacia abajo en el tema hasta que la publicación que contiene el PDF salga de la ventana gráfica.
  4. Desplácese hacia arriba hasta la misma previsualización de PDF.
  5. Resultado:
    • El PDF se recarga desde el principio.
    • Se pierde la posición de desplazamiento de la previsualización.
    • El PDF se vuelve a renderizar como si se hubiera cargado recientemente.

No se realiza ninguna solicitud de red para el PDF, lo que indica que el nodo DOM se eliminó localmente y se recreó.

Comportamiento esperado

  • La previsualización del PDF debería mantener su posición de desplazamiento y no debería recargarse simplemente al desplazar el tema.
  • Otros contenidos incrustados (imágenes, vídeos, Oneboxes) no restablecen el estado al desplazarse; las previsualizaciones de PDF deberían comportarse de manera coherente.

Comportamiento actual

  • Tan pronto como la publicación sale del rango visible, Discourse descarga el nodo DOM.
  • Cuando la publicación vuelve a aparecer, se reconstruye el elemento incrustado.
  • Esto obliga al visor de PDF nativo del navegador a comenzar de nuevo desde la página 1.
  • Esto ocurre cada vez que la publicación sale de la ventana gráfica (hacia arriba o hacia abajo).

Entorno

  • Ocurre en todos los navegadores probados: Chrome, Firefox, Safari, Edge
  • Ocurre con todos los complementos desactivados (Modo seguro)
  • Ocurre con todos los componentes de tema desactivados
  • Ocurre con múltiples archivos PDF de diferentes tamaños y formatos
  • Ocurre en la rama más reciente de Discourse (tests-passed) (a partir de la fecha de publicación)

Notas técnicas

Discourse parece estar desmontando los componentes de las publicaciones fuera de la pantalla como parte de la virtualización del flujo.
Debido a que la previsualización del PDF utiliza un simple <embed> o <iframe>, no tiene un mecanismo de persistencia, por lo que se restablece por completo cada vez que:

  • se activa willDestroyElement()
  • se vuelve a renderizar el contenedor de la publicación
  • el nodo DOM se recrea al volver a entrar en la ventana gráfica

Esto es exclusivo de los PDF porque los visores de PDF nativos del navegador no conservan el estado de desplazamiento a través de la reconstrucción del DOM.

Esto hace que los temas largos con PDF sean frustrantes de leer, especialmente para los archivos adjuntos de varias páginas.

Resolución solicitada

  • Evitar que el componente de previsualización de PDF en línea se destruya durante el reciclaje de publicaciones O
  • Proporcionar una forma para que los componentes de complementos/temas declaren un “estado persistente” para que Discourse no los desmonte
  • O exponer una configuración del sitio para desactivar el reciclaje del flujo de publicaciones para las publicaciones que contienen visores de PDF en línea

Incluso una solución parcial, por ejemplo, omitir el reciclaje para las publicaciones que contienen elementos incrustados de PDF, resolvería el problema.

Contexto adicional

Esto no es un problema de entorno aislado: se ha reproducido de manera fiable en compilaciones de prueba limpias, múltiples navegadores y en diferentes PDF.

No hay temas en Meta que describan este comportamiento, por lo que podría ser una regresión no reportada o una consecuencia no deseada de las mejoras en la virtualización del flujo.

1 me gusta