기여 목록 / 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를 온전히 보존해야 합니다.
- 텍스트 조각의 대문자 변환은 앞선 문자의 단어 경계 문맥에 영향을 받으므로, 문자열 변환과 레이아웃 양쪽에서 회귀 테스트가 필요합니다.
- 변경 동작을 런타임 플래그로 제어하고 기존 코드를 보존하면, 예상하지 못한 문제가 발생했을 때 플래그를 비활성화하여 기존 동작으로 빠르게 되돌릴 수 있습니다.