Skip to content

letterbox detector cold-start: env(safe-area-inset-top) stale 0이 보정 게이트를 막을 수 있음 — multi-timeout 재측정 + verdict 사유 노출 #536

@DaveDev42

Description

@DaveDev42

문제

letterbox 보정(#527)의 발동 게이트는 standalone && portrait && shortfall >= 24 && safeAreaTop > 0인데(e2e/fixture/launcher/letterbox.ts), safeAreaTopenv(safe-area-inset-top) CSS 측정값이다. iOS standalone(웹 클립)에는 cold start에서 env()가 0/stale 값을 반환하고 회전(orientationchange) 후에야 정정되는 알려진 WebKit 결함이 있다:

  • WebKit #274773 (env() cold-start stale)
  • https://gist.github.com/fozzedout/5e77925381991a9570151550992baf14 — "100dvh·env()는 cold start에서 틀린 값, 회전 후에야 정정"
  • 관련: WebKit #254868 (standalone+cover에서 svh/-webkit-fill-available/visualViewport가 safe-area 제외 값 보고, iOS 18.3.1에도 미해결)

이 경우 shortfall은 47로 정확히 측정되지만(screen.height − max(innerHeight, visualViewport.height) — env() 비의존이라 견고) safeAreaTop이 0으로 읽혀 verdict=false → 보정 미발동 → 하단 47pt 밴드가 빈 채 남는다. 현재 완화책은 mount + 600ms settle 단일 재측정 + resize/orientationchange 리스너(Launcher.tsx)인데, gist 관측대로라면 600ms 시점에도 env()가 stale일 수 있다 — 그 세션은 사용자가 회전하기 전까지 영구히 미보정.

제안

  1. settle 재측정을 단일 600ms → multi-timeout(예: 100/600/1500ms) 으로 확장.
  2. (검토) pageshow/visibilitychange(bfcache·standalone resume 복귀 시) 재측정 추가 — standalone은 메모리 resume이 잦아 cold-start 측정이 오래 살아남는다.
  3. diag 배너/진단 패널에 measured safeAreaTop 원시값 + verdict 사유를 노출해, 폰 관측만으로 "shortfall 47인데 top 0이라 미발동" 상태를 식별 가능하게.

Out of scope

safeAreaTop > 0 게이트 자체의 완화(top=0 케이스에 보정 발동)는 하지 않는다 — 구메타(stale web clip) healthy below-sb 케이스(shortfall 47–59, top 0, 창이 이미 물리 바닥에 도달)에 보정을 발동하면 47px 오버플로/스크롤을 만든다. letterbox.ts 케이스 매트릭스의 false 판정은 의도된 것.

Acceptance

  • cold start 직후 env()가 stale 0이어도, 회전 없이 수 초 내 재측정으로 verdict가 정정된다 (시뮬레이터/실기기).
  • 진단 표면에서 safeAreaTop 원시값과 verdict 사유를 읽을 수 있다.
  • 기존 케이스 매트릭스(healthy below-sb 포함)의 판정 회귀 없음 — letterbox.vitest 케이스 유지.

Metadata

Metadata

Assignees

No one assigned

    Labels

    roadmapharness roadmap 작업 항목 (Project #1)

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    Todo

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions