[CSS] Apply NUL replacement during identifier lookahead
MERGED2026csstokenizer
2026. 8. 6.
injunchoi98
CSS 토크나이저가 식별자를 미리 확인하는 과정에서도 NUL 문자(U+0000)를 대체 문자(U+FFFD)로 처리하도록 수정했습니다.
문제 설명
CSS 입력 전처리 규칙에 따르면 U+0000 문자는 U+FFFD로 대체되어야 합니다. 그러나 토크나이저의 일부 식별자 lookahead 로직에서는 문자를 대체하지 않는 PeekWithoutReplacement()를 사용하고 있었습니다.
이 때문에 다음 입력들이 올바른 CSS 토큰으로 분류되지 않았습니다.
#<NUL>이 ID 해시 토큰이 아닌 구분자 토큰으로 분류됨-<NUL>이 식별자 토큰으로 인식되지 않음- NUL 문자가 포함된 선택자를 사용하는
querySelector()WPT가 실패함
해결 내용
Hash()와 NextCharsAreIdentifier()의 식별자 lookahead에서 PeekWithoutReplacement() 대신 NextInputChar()를 사용하도록 변경했습니다.
// Before
UChar next_char = input_.PeekWithoutReplacement(0);
// After
UChar next_char = input_.NextInputChar();이를 통해 lookahead 과정에서도 NUL 문자가 U+FFFD로 대체되며, 실제 토큰 소비 과정과 동일한 전처리 규칙이 적용됩니다.
또한 다음 작업을 함께 진행했습니다.
- 해시 및 식별자 판별 로직의 NUL 처리 수정
- NUL 문자가 포함된 식별자, at-keyword, hash, dimension 회귀 테스트 추가
- 수정 후 통과하게 된
ParentNode-querySelector-escapesWPT의 기존 실패 기대 파일 삭제
테스트 방법
css_tokenizer_test.cc에 다음 입력에 대한 회귀 테스트를 추가했습니다.
-<NUL>→ 식별자 토큰@-<NUL>→ at-keyword 토큰#<NUL>및#-<NUL>→ ID 해시 토큰1-<NUL>→ dimension 토큰
또한 ParentNode-querySelector-escapes WPT가 정상적으로 통과하는 것을 확인했으며, Chromium Commit Queue 검증을 거쳐 변경이 병합되었습니다.