Skip to content

fix(#1181): RawSvg(OLE/차트) 첫 로드 백지 렌더 — 비동기 디코드 안전망 누락#1182

Merged
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:fix/1181-hancell-ole-first-render
May 31, 2026
Merged

fix(#1181): RawSvg(OLE/차트) 첫 로드 백지 렌더 — 비동기 디코드 안전망 누락#1182
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:fix/1181-hancell-ole-first-render

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

Closes #1181

원인

OLE/차트 미리보기는 PaintOp::RawSvg 로 emit (src/paint/json.rs:814) 되며 web_canvas RawSvg 핸들러는 <image data:...> / SVG 조각을 draw_image() 로 그려서 IMAGE_CACHE 비동기 디코드 경로를 그대로 탑니다. 그런데 #1154 v2 의 안전망은:

  • rendering.rs collect() : PaintOp::Image 만 image_count++ → RawSvg 페이지는 image_count == 0
  • page-renderer.ts scheduleReRender : if (imageCount <= 0) return 으로 200/600/1500ms 재시도 자체 미발화
  • prefetchFlowImages 정규식 "type":"image" → rawSvg 미매칭

첫 렌더 후 캔버스가 백지로 남고, 두 번째 로드 때만 모듈 static IMAGE_CACHE 가 디코드 완료된 element 를 유지하고 있어 img.complete() 분기로 즉시 그려지는 패턴.

수정

파일 변경
src/document_core/queries/rendering.rs collect()PaintOp::RawSvgimage_count += 1 처리.
rhwp-studio/src/view/page-renderer.ts prefetchFlowImages 가 전체 JSON 의 data:image/MIME;base64,... 패턴을 직접 스캔, rawSvg 내장 data URL 도 prefetch. 중복 dedupe Set 추가. 기존 image regex 유지.

Test plan

적용 범위

PaintOp::RawSvg 경로를 타는 모든 미리보기 (한셀 OLE / OOXML 차트 / EMF). 일반 그림(PaintOp::Image) 동작은 변화 없음.

## 증상

samples/한셀OLE.hwp 등 OLE 미리보기 페이지를 rhwp-studio 에서 첫 로드 시 백지로
렌더되고, 두 번째 로드부터는 정상. 모듈 static IMAGE_CACHE 가 첫 로드 중 디코드한
HtmlImageElement 를 유지해 두 번째 호출에서만 img.complete() 분기로 즉시 그려지는
패턴.

## 원인

OLE/차트 미리보기는 PaintOp::RawSvg 로 emit (src/paint/json.rs:814) 되며 web_canvas
RawSvg 핸들러는 단일 <image data:...> 또는 SVG 조각을 draw_image() 로 그려서
IMAGE_CACHE 비동기 디코드 경로를 그대로 탄다.

그런데 edwardkim#1154 v2 (PR edwardkim#1164) 의 디코드 안전망은 PaintOp::Image 만 image_count 에
포함시켜 RawSvg 케이스에서는:

- rendering.rs collect() : image_count == 0
- page-renderer.ts scheduleReRender : if (imageCount <= 0) return 으로 200/600/1500ms
  재시도 미발화
- prefetchFlowImages 정규식 ("type":"image") 도 rawSvg 미매칭

결과적으로 첫 렌더 후 캔버스가 백지로 남는다.

## 수정

1. src/document_core/queries/rendering.rs : collect() 가 PaintOp::RawSvg 도
   image_count += 1 처리. scheduleReRender 재시도 발화 트리거.
2. rhwp-studio/src/view/page-renderer.ts : prefetchFlowImages 가 전체 JSON 의
   data:image/MIME;base64,... 패턴을 직접 스캔하여 rawSvg 내장 데이터 URL 도
   prefetch (중복 dedupe). 기존 image 항목 regex 는 유지.

## 검증

Puppeteer 측정 (samples/한셀OLE.hwp):

| 시점 | 수정 전 load #1 | 수정 후 load #1 | 수정 후 load edwardkim#2 |
|------|-----------------|-----------------|-----------------|
| t+0ms | 6 (백지) | 1276 | 1276 |
| t+1500ms | 6 (백지) | 1276 | 1276 |
| t+3000ms | 6 (백지) | 1276 | 1276 |

cargo test --lib document_core::queries::rendering : 6 passed.

Closes edwardkim#1181
@edwardkim edwardkim self-requested a review May 31, 2026 03:41
@edwardkim edwardkim added the enhancement New feature or request label May 31, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 31, 2026
@edwardkim edwardkim added bug Something isn't working and removed enhancement New feature or request labels May 31, 2026
@edwardkim edwardkim merged commit 2374270 into edwardkim:devel May 31, 2026
7 checks passed
@edwardkim

Copy link
Copy Markdown
Owner

머지했습니다 (devel 23742708). 감사합니다.

검증(로컬):

  • cargo build / cargo test --lib document_core::queries::rendering (6 passed) / cargo test --tests (97 스위트, 1826 passed, 0 failed) / cargo clippy --lib / cargo fmt --all --check / tsc --noEmit 모두 통과
  • WASM 빌드 후 samples/한셀OLE.hwp 첫 로드 시각 판정 통과 (백지 회귀 해소 확인)
  • SVG 내보내기(export-svg)도 OLE 미리보기 PNG 정상 임베드 확인 (별도 RenderNode 경로)

참고: PR head 가 devel 보다 뒤처져 있어 GitHub UI 머지 대신 메인테이너 로컬 --no-ff 머지로 처리했습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants