Предпросмотр PDF-файлов в строке сбрасывается на первую страницу при прокрутке темы

Краткое описание

Предпросмотр встроенных PDF-файлов последовательно сбрасывает позицию прокрутки (возвращаясь к первой странице) при прокрутке длинной темы.
Это происходит потому, что встроенный PDF-просмотрщик уничтожается и вставляется заново, когда пост выходит за пределы видимости, вероятно, из-за механизма повторного использования/виртуализации потока постов в Discourse.

Это влияет на все браузеры, все PDF-файлы и наблюдается даже при отключенных всех плагинах и темах.

Шаги для воспроизведения

  1. Создайте тему с вложением PDF-файла.
  2. Убедитесь, что компонент Inline PDF Previews активен.
  3. Прокрутите тему вниз, пока пост с PDF не выйдет за пределы видимости.
  4. Прокрутите обратно вверх к тому же предпросмотру PDF.
  5. Результат:
    • PDF перезагружается с начала.
    • Позиция прокрутки предпросмотра теряется.
    • PDF рендерится заново, как будто только что загружен.

Запрос к сети для загрузки PDF не происходит, что указывает на локальное удаление и повторное создание узла DOM.

Ожидаемое поведение

  • Предпросмотр PDF должен сохранять позицию прокрутки и не должен перезагружаться просто из-за прокрутки темы.
  • Другое встроенное содержимое (изображения, видео, Oneboxes) не сбрасывает состояние при прокрутке; предпросмотры PDF должны вести себя аналогично.

Фактическое поведение

  • Как только пост выходит за пределы видимости, Discourse удаляет узел DOM.
  • Когда пост снова появляется в видимой области, встроенный элемент восстанавливается.
  • Это заставляет нативный PDF-рендерер браузера начинать заново с первой страницы.
  • Это происходит каждый раз, когда пост выходит за пределы видимости (вверх или вниз).

Окружение

  • Наблюдается во всех протестированных браузерах: Chrome, Firefox, Safari, Edge
  • Наблюдается при отключенных всех плагинах (безопасный режим)
  • Наблюдается при отключенных всех компонентах тем
  • Наблюдается с множеством PDF-файлов разных размеров и форматов
  • Наблюдается в ветке Discourse (tests-passed) последней версии (на момент публикации)

Технические заметки

Похоже, что Discourse отключает компоненты постов, находящихся вне экрана, в рамках виртуализации потока.
Поскольку предпросмотр PDF использует простой тег <embed> / <iframe>, у него нет механизма сохранения состояния, поэтому он полностью сбрасывается всякий раз, когда:

  • вызывается willDestroyElement()
  • контейнер поста перерисовывается
  • узел DOM воссоздается при повторном появлении в видимой области

Это уникально для PDF, так как нативные PDF-просмотрщики браузеров не сохраняют состояние прокрутки при перестроении DOM.

Это делает чтение длинных тем с PDF-файлами раздражающим, особенно для многостраничных вложений.

Запрошенное решение

  • Предотвратить уничтожение компонента Inline PDF Preview во время повторного использования постов ИЛИ
  • Предоставить возможность компонентам плагинов/тем объявлять «сохраняемое состояние», чтобы Discourse не отключал их
  • Либо добавить настройку сайта для отключения повторного использования потока постов для постов, содержащих встроенные PDF-просмотрщики

Даже частичное исправление — например, пропуск повторного использования для постов с встроенными PDF-файлами — решило бы проблему.

Дополнительный контекст

Это не разовая проблема окружения:
Она надежно воспроизводится в чистых тестовых сборках, в разных браузерах и с разными PDF-файлами.

В Meta нет тем, описывающих это поведение, поэтому это может быть незарегрессией или непреднамеренным следствием улучшений виртуализации потока.

1 лайк