OSSCA Chromium

기여 목록 / 8425503

[Blink] Expose ProgressEvent in service workers

BlinkfeatureMerged

서비스 워커에서도 기존 ProgressEvent 생성자를 사용할 수 있도록 Blink의 인터페이스 노출 범위를 확장했습니다. 기본 활성화된 런타임 기능으로 노출을 제어하고, 생성자 테스트를 Window와 세 종류의 워커에서 실행하도록 변경했습니다.

문제 설명

XHR 표준의 ProgressEvent 인터페이스는 노출 대상을 Window와 Worker로 정의합니다. 그러나 기존 Blink IDL은 Window, DedicatedWorker, SharedWorker만 나열해 서비스 워커를 빠뜨리고 있었습니다.

이로 인해 서비스 워커에서는 기존 ProgressEvent 구현을 생성자로 사용할 수 없었습니다. 또한 생성자 WPT가 HTML 파일로 작성되어 있어 서비스 워커에서의 노출 여부와 동작을 확인하지 못했습니다.

해결 내용

1. 서비스 워커에 기존 인터페이스 노출

progress_event.idl의 노출 조건에 ServiceWorker를 추가했습니다. 기존 세 환경은 StableBlinkFeatures를 사용하고, 새로 추가한 서비스 워커 노출은 ProgressEventInServiceWorker 기능으로 제어합니다.

다음은 변경된 IDL의 노출 조건입니다.

Exposed(Window StableBlinkFeatures,
        DedicatedWorker StableBlinkFeatures,
        SharedWorker StableBlinkFeatures,
        ServiceWorker ProgressEventInServiceWorker)

기존 이벤트 구현을 재사용하므로 새로운 C++ 이벤트 클래스를 추가하지 않았습니다.

2. 기본 활성화와 비활성화 수단 설정

runtime_enabled_features.json5에 다음 항목을 추가했습니다.

{
  name: "ProgressEventInServiceWorker",
  status: "stable",
},

기본적으로 활성화하되, 커밋 설명에 명시한 대로 Finch를 통해 비활성화할 수 있는 수단을 유지했습니다. 서비스 워커의 전역 인터페이스 기대 목록도 일반 실행과 virtual/stable 양쪽에서 갱신해 생성자와 lengthComputable, loaded, total 속성이 노출되는 결과를 반영했습니다.

3. 생성자 테스트의 실행 환경 확대

xhr/progressevent-constructor.html을 .any.js로 전환하고 다음 메타데이터로 실행 대상을 지정했습니다.

// META: title=ProgressEvent constructor
// META: global=window,dedicatedworker,sharedworker,serviceworker

기존 생성자 검증을 재사용하면서 Dedicated Worker, Shared Worker, Service Worker에서도 같은 동작을 검사할 수 있도록 했습니다.

테스트 방법

변환한 WPT에는 다음 내용을 포함한 기존 테스트 10개가 들어 있습니다.

  • 이벤트의 기본 속성과 lengthComputable, loaded, total의 기본값
  • 초기화 옵션, JavaScript 값 변환과 속성 이름의 대소문자 구분
  • 양수·0·소수·음수의 loaded와 total 값
  • 사용하지 않는 initProgressEvent()가 존재하지 않는지 여부

서비스 워커의 전역 인터페이스 목록 테스트는 기본 환경과 virtual/stable 환경 모두에 ProgressEvent가 표시되는지 확인하도록 기대 결과를 갱신했습니다.

Gerrit 기록상 2026년 9월 21일 Patch Set 1의 CQ dry run은 chromeos-arm64-generic-rel의 빌드 파일 생성 단계에서 실패했습니다. 리베이스한 Patch Set 2는 9월 22일 CQ dry run을 통과했습니다. Kentaro Hara와 Kent Tamura의 리뷰를 거쳐 10월 13일 CQ 실행 후 리베이스된 Patch Set 3가 머지됐습니다.

생성자 테스트 변경은 같은 날 WPT PR #63586으로 upstream에 머지됐습니다. Gerrit export 댓글과 upstream의 .html 삭제·.any.js 추가 내용을 대조했습니다. 이 문서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.

리뷰 과정

리뷰에서는 웹에 노출되는 API의 변경이므로 Intent to Ship을 보내고 API owner의 승인을 받아야 한다는 의견이 나왔습니다. 작성자는 이후 Intent to Ship 논의를 연결하고 LGTM 세 개를 받았다고 Gerrit 댓글에 보고한 뒤 재리뷰를 요청했습니다.

기존 표준과 구현의 차이를 줄이는 작업이라도 웹에서 사용할 수 있는 API가 달라지므로, 코드 리뷰와 별도로 출시 검토 과정이 필요했던 사례입니다.

관련 이슈와 외부 PR

배운 점

  • API 구현이 이미 존재하더라도 IDL의 노출 대상에서 실행 환경이 빠지면 해당 환경에서 사용할 수 없습니다. 표준의 노출 범위와 실제 바인딩 설정을 함께 확인해야 합니다.
  • WPT를 .any.js로 전환하면 같은 생성자 검증을 여러 전역 환경에서 재사용할 수 있습니다.
  • API 노출 변경에는 구현과 테스트뿐 아니라 런타임 기능 설정, 인터페이스 목록, 출시 검토도 함께 고려해야 합니다.

참고 자료