XML and JSON mime type matching should be broader
Chromium의 XML MIME Type 판별 로직을 MIME Sniffing 표준에 맞게 개선한 기여
문제 설명
Chromium의 MimeUtil에는 XML MIME Type을 판별하는 로직이 존재하지만, WHATWG MIME Sniffing 표준에서 XML MIME Type으로 정의하고 있는 /+xml 형태를 처리하지 못하는 문제가 있었습니다.
기존에는 일부 하드코딩된 XML MIME Type만 인식하고 있었기 때문에 text/example+xml, image/example+xml과 같은 MIME Type을 XML로 판별하지 못했습니다.
JSON MIME Type에 대해서는 동일한 형태의 개선 작업이 먼저 이루어진 상태였으며, 이번 기여에서는 남아 있던 XML MIME Type 처리를 개선했습니다.
해결 내용
IsXMLMimeType()이 기존 XML MIME Type뿐만 아니라 +xml suffix를 가지는 MIME Type도 XML로 판별하도록 로직을 수정했습니다.
기능 변경이 웹 API의 PerformanceResourceTiming.contentType 결과에도 영향을 줄 수 있어, 단순히 MIME 판별 함수만 수정하지 않고 Feature Flag를 추가하여 기존 동작과 새로운 동작을 구분했습니다.
리뷰 과정에서 웹에 노출되는 동작 변경에는 별도의 표준화 및 Chromium의 기능 출시 절차가 필요하다는 것을 알게 되었습니다. 이에 Chrome Status에 기능을 등록하고 Blink의 Intent to Prototype 절차를 진행했습니다.
또한 실제 브라우저 동작까지 검증하기 위해 content-type-minimization.html과 연결되는 WPT 테스트 데이터에 +xml MIME Type 케이스를 추가했습니다.
테스트 방법
관련 단위 테스트를 빌드하고 MimeUtilXmlMimeTypeTest를 실행하여 Feature Flag가 활성화된 경우와 비활성화된 경우 모두 정상적으로 동작하는지 확인했습니다.
autoninja -C out/Default blink_common_unittests
out/Default/blink_common_unittests \
--gtest_filter='*MimeUtilXmlMimeTypeTest*'추가로 PerformanceResourceTiming.contentType까지 실제 웹 노출 경로를 검증하기 위해 WPT 테스트를 실행했습니다.
third_party/blink/tools/run_web_tests.py \
-t Default \
--additional-driver-flag=--enable-features=SpecCompliantXmlMimeTypes \
external/wpt/resource-timing/content-type-minimization.htmlFeature Flag가 활성화된 상태에서는 테스트가 통과했고, 비활성화한 상태에서는 새로 추가한 +xml 관련 5개 테스트가 의도대로 실패하는 것을 확인했습니다.
배운 점
처음에는 기존 JSON MIME Type 처리 방식을 참고하면 비교적 작은 로직 변경으로 끝날 것이라고 생각했습니다.
하지만 리뷰를 진행하면서 브라우저에서 웹 개발자에게 노출되는 동작을 변경할 경우 코드 수정뿐만 아니라 Feature Flag, WPT, Chrome Status, Intent to Prototype과 같은 Chromium의 기능 변경 절차까지 고려해야 한다는 것을 배웠습니다.
특히 단위 테스트에서 함수의 동작만 검증하는 것과 실제 웹 API까지 이어지는 경로를 검증하는 것은 다르다는 점을 경험했습니다. 관련 코드를 추적하여 PerformanceResourceTiming.contentType까지 이어지는 흐름을 확인하고 WPT 테스트를 추가하면서, Chromium에서 웹 표준 변경이 실제 브라우저 기능으로 반영되는 과정을 경험할 수 있었습니다.