[CSS] Apply NUL replacement during identifier lookahead

MERGED2026csstokenizer
2026. 8. 6.injunchoi98 프로필 이미지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로 대체되며, 실제 토큰 소비 과정과 동일한 전처리 규칙이 적용됩니다.

또한 다음 작업을 함께 진행했습니다.

  1. 해시 및 식별자 판별 로직의 NUL 처리 수정
  2. NUL 문자가 포함된 식별자, at-keyword, hash, dimension 회귀 테스트 추가
  3. 수정 후 통과하게 된 ParentNode-querySelector-escapes WPT의 기존 실패 기대 파일 삭제

테스트 방법

css_tokenizer_test.cc에 다음 입력에 대한 회귀 테스트를 추가했습니다.

  • -<NUL> → 식별자 토큰
  • @-<NUL> → at-keyword 토큰
  • #<NUL>#-<NUL> → ID 해시 토큰
  • 1-<NUL> → dimension 토큰

또한 ParentNode-querySelector-escapes WPT가 정상적으로 통과하는 것을 확인했으며, Chromium Commit Queue 검증을 거쳐 변경이 병합되었습니다.

참고 자료