Краткое описание
Предпросмотр встроенных PDF-файлов последовательно сбрасывает позицию прокрутки (возвращаясь к первой странице) при прокрутке длинной темы.
Это происходит потому, что встроенный PDF-просмотрщик уничтожается и вставляется заново, когда пост выходит за пределы видимости, вероятно, из-за механизма повторного использования/виртуализации потока постов в Discourse.
Это влияет на все браузеры, все PDF-файлы и наблюдается даже при отключенных всех плагинах и темах.
Шаги для воспроизведения
- Создайте тему с вложением PDF-файла.
- Убедитесь, что компонент Inline PDF Previews активен.
- Прокрутите тему вниз, пока пост с PDF не выйдет за пределы видимости.
- Прокрутите обратно вверх к тому же предпросмотру PDF.
- Результат:
- 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 нет тем, описывающих это поведение, поэтому это может быть незарегрессией или непреднамеренным следствием улучшений виртуализации потока.