요약
인라인 PDF 미리보기가 긴 주제 내 스크롤 시 스크롤 위치가 항상 초기(1페이지)로 재설정됩니다.
이는 게시물이 뷰포트에서 벗어나면 Discourse의 게시물 스트림 재활용/가상화 메커니즘으로 인해 PDF 임베드가 제거되고 다시 삽입되기 때문에 발생합니다.
이 문제는 모든 브라우저와 모든 PDF 파일에서 발생하며, 모든 플러그인과 테마가 비활성화된 상태에서도 재현됩니다.
재현 단계
- PDF 첨부 파일이 포함된 주제를 생성합니다.
- 인라인 PDF 미리보기 구성 요소가 활성화되어 있는지 확인합니다.
- 주제를 아래로 스크롤하여 PDF가 포함된 게시물이 뷰포트에서 벗어나도록 합니다.
- 다시 같은 PDF 미리보기로 스크롤을 올립니다.
- 결과:
- 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)이거나 스트림 가상화 개선 과정에서 의도치 않게 발생한 결과일 수 있습니다.