OSSCA Chromium

기여 목록 / 8311028

[Blink] Fix capitalization after supplementary characters

BlinkfixMerged

Blink의 text-transform: capitalize 처리에서 supplementary character 뒤의 단어 경계를 올바르게 판단하도록 수정했습니다.

문제 설명

capitalize 처리에서는 previous_character로 이전 문자의 문맥을 전달하여 단어 경계를 판단합니다. 기존에는 UTF-16 코드 유닛 하나만 저장할 수 있어, 두 코드 유닛으로 표현되는 supplementary code point를 온전히 보존하지 못했습니다.

이로 인해 ::first-letter가 적용된 텍스트의 대문자 변환이 잘못되어 css/css-pseudo/first-letter-capitalize-supplementary-char.html WPT가 실패했습니다.

해결 내용

  • previous_character를 UChar32로 변경하고, 이전 문자를 코드 포인트 단위로 전달하도록 관련 레이아웃 및 텍스트 처리 코드를 수정했습니다.
  • 보존된 코드 포인트를 단어 경계 판단에 사용하도록 capitalize 처리를 보완했습니다.
  • 기본 활성화된 CapitalizeAfterSupplementaryCharacterFix 런타임 플래그로 변경 동작을 제어하도록 했습니다.
  • 회귀 테스트를 추가하고 해당 WPT의 실패 기대값을 제거했습니다.

테스트 방법

CL에 기록한 검증 대상은 다음과 같습니다.

wtf_unittests --gtest_filter=CaseMapTest.ToTitleWithPreviousCharacter
blink_platform_unittests --gtest_filter="CapitalizeTest*"
blink_unittests --gtest_filter="*CapitalizationAfterSupplementaryCharacter"

관련 WPT는 external/wpt/css/css-pseudo/first-letter-capitalize-supplementary-char.html입니다. Gerrit의 CQ dry run 통과 후, 2026년 9월 16일 Chromium main에 병합되었습니다.

배운 점

  • UTF-16 코드 유닛과 유니코드 코드 포인트를 구분해야 하며, 이전 문자 문맥을 전달할 때도 supplementary character를 온전히 보존해야 합니다.
  • 텍스트 조각의 대문자 변환은 앞선 문자의 단어 경계 문맥에 영향을 받으므로, 문자열 변환과 레이아웃 양쪽에서 회귀 테스트가 필요합니다.
  • 변경 동작을 런타임 플래그로 제어하고 기존 코드를 보존하면, 예상하지 못한 문제가 발생했을 때 플래그를 비활성화하여 기존 동작으로 빠르게 되돌릴 수 있습니다.

참고 자료