토픽을 스크롤할 때 인라인 PDF 미리보기가 1페이지로 리셋됩니다

요약

인라인 PDF 미리보기가 긴 주제 내 스크롤 시 스크롤 위치가 항상 초기(1페이지)로 재설정됩니다.
이는 게시물이 뷰포트에서 벗어나면 Discourse의 게시물 스트림 재활용/가상화 메커니즘으로 인해 PDF 임베드가 제거되고 다시 삽입되기 때문에 발생합니다.

이 문제는 모든 브라우저와 모든 PDF 파일에서 발생하며, 모든 플러그인과 테마가 비활성화된 상태에서도 재현됩니다.

재현 단계

  1. PDF 첨부 파일이 포함된 주제를 생성합니다.
  2. 인라인 PDF 미리보기 구성 요소가 활성화되어 있는지 확인합니다.
  3. 주제를 아래로 스크롤하여 PDF가 포함된 게시물이 뷰포트에서 벗어나도록 합니다.
  4. 다시 같은 PDF 미리보기로 스크롤을 올립니다.
  5. 결과:
    • PDF가 처음부터 다시 로드됩니다.
    • 미리보기의 스크롤 위치가 손실됩니다.
    • PDF가 새로 로드된 것처럼 다시 렌더링됩니다.

PDF에 대한 네트워크 요청이 발생하지 않으므로, 이는 DOM 노드가 로컬에서 제거되고 다시 생성되었음을 나타냅니다.

예상 동작

  • PDF 미리보기는 주제 스크롤만으로 재로드되지 않고 스크롤 위치를 유지해야 합니다.
  • 다른 임베드 콘텐츠(이미지, 비디오, Oneboxes)는 스크롤 시 상태가 초기화되지 않으므로, PDF 미리보기도 일관되게 동작해야 합니다.

실제 동작

  • 게시물이 가시 범위에서 벗어나는 즉시 Discourse가 DOM 노드를 언로드합니다.
  • 게시물이 다시 뷰포트로 스크롤되어 들어올 때 임베드가 재구성됩니다.
  • 이로 인해 브라우저의 네이티브 PDF 렌더러가 1페이지부터 다시 시작하게 됩니다.
  • 이는 게시물이 뷰포트를 벗어날 때마다(위쪽이든 아래쪽이든) 발생합니다.

환경

  • 테스트된 모든 브라우저에서 발생: Chrome, Firefox, Safari, Edge
  • 모든 플러그인이 비활성화된 상태(Safe Mode)에서도 발생
  • 모든 테마 구성 요소가 비활성화된 상태에서도 발생
  • 크기와 형식이 다른 여러 PDF 파일에서 발생
  • Discourse(테스트 통과) 최신 브랜치에서 발생(게시일 기준)

기술적 참고 사항

Discourse는 스트림 가상화 과정의 일환으로 화면 밖의 게시물 구성 요소를 언마운트하는 것으로 보입니다.
PDF 미리보기는 단순한 <embed> / <iframe>을 사용하므로 영속성 메커니즘이 없으며, 다음과 같은 경우 완전히 초기화됩니다:

  • willDestroyElement()가 트리거될 때
  • 게시물의 컨테이너가 다시 렌더링될 때
  • 뷰포트로 재진입할 때 DOM 노드가 다시 생성될 때

이는 브라우저 네이티브 PDF 뷰어가 DOM 재구성 과정에서 스크롤 상태를 보존하지 않기 때문에 PDF에만 고유한 문제입니다.

이로 인해 PDF가 포함된 긴 주제를 읽는 것이 번거로워지며, 특히 여러 페이지에 걸친 첨부 파일의 경우 더욱 그러합니다.

요청 사항

  • 게시물 재활용 과정에서 인라인 PDF 미리보기 구성 요소가 제거되지 않도록 방지하거나, 또는
  • 플러그인/테마 구성 요소가 "영속 상태(persistent state)"를 선언하여 Discourse가 이를 언마운트하지 않도록 하는 방법을 제공하거나, 또는
  • 인라인 PDF 뷰어가 포함된 게시물에 대해 게시물 스트림 재활용을 비활성화하는 사이트 설정을 노출해 주세요.

부분적인 수정이라도 — 예를 들어 PDF 임베드가 포함된 게시물의 재활용을 건너뛰는 것 — 이 문제를 해결할 수 있습니다.

추가 배경

이것은 일회성 환경 문제가 아닙니다.
깨끗한 테스트 빌드, 여러 브라우저, 그리고 다양한 PDF 파일에서 일관되게 재현되었습니다.

이 동작을 설명하는 메타(Meta) 주제가 없으므로, 이는 보고되지 않은 회귀 문제(regression)이거나 스트림 가상화 개선 과정에서 의도치 않게 발생한 결과일 수 있습니다.

1개의 좋아요