OSSCA Chromium

기여 목록 / 8434601

FSA: Explain directory handle errors after context destruction

BlinkfixMerged
  • 문제: 실행 컨텍스트가 파괴된 디렉터리 핸들의 오류 메시지에 실패 원인이 설명되지 않았습니다.
  • 해결: 네 메서드에 공통 오류 메시지를 추가하고, iframe 제거 후 동작을 검증하는 Blink 웹 테스트를 작성했습니다.
  • 결과: 기존 예외 타입과 제어 흐름을 유지하면서 디렉터리 핸들을 사용할 수 없는 이유를 명확히 전달합니다.

문제 설명

iframe에서 얻은 FileSystemDirectoryHandle을 보관한 상태로 iframe을 제거하면, 해당 핸들의 실행 컨텍스트가 파괴됩니다. 이후 핸들의 메서드를 호출하면 InvalidStateError가 발생하지만, 기존 구현은 빈 오류 설명을 전달하여 메시지에 호출한 메서드만 표시되었습니다.

이 때문에 개발자는 오류가 실행 컨텍스트의 수명과 관련되어 있다는 사실을 메시지만으로 파악하기 어려웠습니다. 다음 네 메서드의 !mojo_ptr_.is_bound() 분기에 같은 문제가 있었고, 오류 메시지를 추가하라는 TODO도 각각 남아 있었습니다.

  • getFileHandle()
  • getDirectoryHandle()
  • removeEntry()
  • resolve()

해결 내용

  1. 공통 오류 메시지 정의

    third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.cc의 익명 네임스페이스에 kContextDestroyedErrorMessage 상수를 추가했습니다.

    constexpr char kContextDestroyedErrorMessage[] =
        "The directory handle is no longer associated with an active execution "
        "context.";

    디렉터리 핸들이 더 이상 활성 실행 컨텍스트와 연결되어 있지 않다는 설명입니다. 리뷰에서 네 곳에 반복된 문자열을 공통 상수로 추출하도록 제안받아 Patch Set 4에 반영했습니다.

  2. 네 메서드에 메시지 적용

    기존 ThrowDOMException() 호출의 빈 문자열을 공통 상수로 교체하고 관련 TODO를 제거했습니다. 예외 타입은 InvalidStateError로 유지하며, 오류가 발생하는 조건과 각 메서드의 반환 흐름도 유지합니다.

  3. Blink 계층에서 회귀 테스트 작성

    초기 패치의 content/ 브라우저 테스트를 리뷰에 따라 Blink 웹 테스트로 옮겼습니다. 수정 대상이 Blink이고 검사할 내용이 오류 문자열이므로, 전체 브라우저를 사용하는 테스트보다 해당 계층의 웹 테스트가 적합하다는 의견을 반영했습니다. 오류 메시지 문구는 표준화된 동작이 아니므로 WPT 대신 Blink 전용 테스트로 작성했습니다.

테스트 방법

third_party/blink/web_tests/http/tests/file-system-access/directory-handle-context-destroyed.html을 추가하여 네 메서드를 각각 별도의 promise_test로 검사합니다.

  1. iframe을 생성하고 frame.contentWindow.navigator.storage.getDirectory()로 OPFS 디렉터리 핸들을 얻습니다.
  2. 핸들을 보관한 채 iframe을 제거하여 해당 실행 컨텍스트를 파괴합니다.
  3. 살아 있는 부모 컨텍스트의 FileSystemDirectoryHandle.prototype[method].call()을 사용하여 보관한 핸들의 메서드를 호출합니다. resolve()에는 디렉터리 핸들을, 나머지 메서드에는 엔트리 이름을 인자로 전달합니다.
  4. promise_rejects_dom()으로 InvalidStateError를 검증하고, 같은 Promise의 .catch()에서 메서드 이름을 포함한 접두사와 새 설명으로 구성된 전체 메시지를 확인합니다. 메서드를 두 번 호출하는 방식은 아닙니다.

Gerrit 기록상 Patch Set 4의 첫 CQ dry run에서는 북마크 UI 테스트의 base::BarrierClosure 관련 컴파일 오류 등이 보고되었습니다. 같은 패치로 재실행한 dry run은 2026년 9월 22일 UTC에 통과했습니다.

지정된 9월 23일 리뷰 메시지에는 Arthur Sonzogni의 Code-Review +1이 기록되어 있습니다. 같은 날 Commit-Queue +2가 설정되어 full run이 시작되었으며, 보고서 작성 시점에는 최종 병합 완료 결과가 확인되지 않았습니다. 위 테스트 및 CQ 결과는 패치와 Gerrit 기록을 기준으로 정리했으며, 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.

배운 점

  • 예외 타입이 올바르더라도 오류 메시지에 객체의 수명과 실패 원인이 드러나야 개발자가 문제를 진단하기 쉽습니다.
  • 여러 메서드가 같은 실패 조건을 공유하면 오류 설명을 공통 상수로 정의하여 문구의 일관성을 유지할 수 있습니다.
  • 회귀 테스트는 수정이 일어난 계층에 맞춰 작성하고, 표준화된 동작과 구현별 오류 문구를 구분해 테스트 위치를 선택해야 합니다.
  • 실행 컨텍스트 파괴를 검증할 때는 파괴된 컨텍스트에서 얻은 객체와 이를 호출하는 살아 있는 컨텍스트를 구분해 재현해야 합니다.

참고 자료