Clamp depths below 1px in CSSPerspective::toMatrix()

MERGED2026blinkcss-typed-omcss-transforms
2026. 9. 7.injunchoi98 프로필 이미지injunchoi98

CSS Typed OM의 CSSPerspective.toMatrix()가 1px보다 작은 perspective 깊이를
1px로 제한하도록 수정했습니다.

문제 설명

CSS Transforms는 perspective 깊이가 1px보다 작을 때 렌더링과 행렬 변환에서
1px로 처리하도록 규정합니다. Blink의 렌더링 경로는 이 제한을 적용했지만
CSSPerspective::toMatrix()는 변환된 길이를 그대로 행렬에 전달했습니다.

그 결과 CSS.px(0.5)와 같은 값의 Typed OM 행렬이 렌더링 동작 및 WPT 기대값과
달랐습니다.

해결 내용

길이를 CSS px로 변환한 뒤 std::max(1.0, length->value())를 적용해 perspective
행렬에 전달했습니다.

matrix->perspectiveSelf(std::max(1.0, length->value()));

원래 단위의 값이 아니라 px 변환 후 제한하므로 0.5in처럼 1px보다 큰 절대
길이가 잘못 축소되지 않습니다. 수정 후 통과하는 WPT 실패 기대 파일도
삭제했습니다.

테스트 방법

CSS Typed OM의 행렬 변환, 상대 단위 오류, 생성, 직렬화에 관한 WPT 4개를
실행했습니다. 4개 모두 예상대로 통과했고 회귀나 예상 밖 결과는 없었습니다.
content_shell 빌드와 diff 검사도 통과했으며, 이후 Commit Queue 검증을 거쳐
Chromium main에 병합됐습니다.

배운 점

  • CSS 길이의 최솟값이나 최댓값은 단위 변환이 끝난 canonical 값에 적용해야
    합니다.
  • 렌더링 경로와 Typed OM의 직접 행렬 변환 경로가 같은 명세 규칙을 공유하는지
    함께 확인해야 합니다.

참고 자료