기여 목록 / 8434601
FSA: Explain directory handle errors after context destruction
- 문제: 실행 컨텍스트가 파괴된 디렉터리 핸들의 오류 메시지에 실패 원인이 설명되지 않았습니다.
- 해결: 네 메서드에 공통 오류 메시지를 추가하고, iframe 제거 후 동작을 검증하는 Blink 웹 테스트를 작성했습니다.
- 결과: 기존 예외 타입과 제어 흐름을 유지하면서 디렉터리 핸들을 사용할 수 없는 이유를 명확히 전달합니다.
문제 설명
iframe에서 얻은 FileSystemDirectoryHandle을 보관한 상태로 iframe을 제거하면, 해당 핸들의 실행 컨텍스트가 파괴됩니다. 이후 핸들의 메서드를 호출하면 InvalidStateError가 발생하지만, 기존 구현은 빈 오류 설명을 전달하여 메시지에 호출한 메서드만 표시되었습니다.
이 때문에 개발자는 오류가 실행 컨텍스트의 수명과 관련되어 있다는 사실을 메시지만으로 파악하기 어려웠습니다. 다음 네 메서드의 !mojo_ptr_.is_bound() 분기에 같은 문제가 있었고, 오류 메시지를 추가하라는 TODO도 각각 남아 있었습니다.
getFileHandle()getDirectoryHandle()removeEntry()resolve()
해결 내용
공통 오류 메시지 정의
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에 반영했습니다.
네 메서드에 메시지 적용
기존
ThrowDOMException()호출의 빈 문자열을 공통 상수로 교체하고 관련 TODO를 제거했습니다. 예외 타입은InvalidStateError로 유지하며, 오류가 발생하는 조건과 각 메서드의 반환 흐름도 유지합니다.Blink 계층에서 회귀 테스트 작성
초기 패치의
content/브라우저 테스트를 리뷰에 따라 Blink 웹 테스트로 옮겼습니다. 수정 대상이 Blink이고 검사할 내용이 오류 문자열이므로, 전체 브라우저를 사용하는 테스트보다 해당 계층의 웹 테스트가 적합하다는 의견을 반영했습니다. 오류 메시지 문구는 표준화된 동작이 아니므로 WPT 대신 Blink 전용 테스트로 작성했습니다.
테스트 방법
third_party/blink/web_tests/http/tests/file-system-access/directory-handle-context-destroyed.html을 추가하여 네 메서드를 각각 별도의 promise_test로 검사합니다.
- iframe을 생성하고
frame.contentWindow.navigator.storage.getDirectory()로 OPFS 디렉터리 핸들을 얻습니다. - 핸들을 보관한 채 iframe을 제거하여 해당 실행 컨텍스트를 파괴합니다.
- 살아 있는 부모 컨텍스트의
FileSystemDirectoryHandle.prototype[method].call()을 사용하여 보관한 핸들의 메서드를 호출합니다.resolve()에는 디렉터리 핸들을, 나머지 메서드에는 엔트리 이름을 인자로 전달합니다. 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 테스트를 별도로 실행하지는 않았습니다.
배운 점
- 예외 타입이 올바르더라도 오류 메시지에 객체의 수명과 실패 원인이 드러나야 개발자가 문제를 진단하기 쉽습니다.
- 여러 메서드가 같은 실패 조건을 공유하면 오류 설명을 공통 상수로 정의하여 문구의 일관성을 유지할 수 있습니다.
- 회귀 테스트는 수정이 일어난 계층에 맞춰 작성하고, 표준화된 동작과 구현별 오류 문구를 구분해 테스트 위치를 선택해야 합니다.
- 실행 컨텍스트 파괴를 검증할 때는 파괴된 컨텍스트에서 얻은 객체와 이를 호출하는 살아 있는 컨텍스트를 구분해 재현해야 합니다.