기여 목록 / 8429428
FSA: Preserve errors from incognito sync access handles
시크릿 모드의 동기 파일 접근 핸들이 읽기·쓰기·길이 작업에서 발생한 파일 오류를 성공 결과로 잘못 전달하지 않도록 수정했습니다. 일반 모드와 시크릿 모드에서 할당량 초과 오류가 올바르게 표시되는지도 브라우저 테스트로 확인했습니다.
문제 설명
FileSystemAccessIncognitoFileDelegate의 Read(), Write(), GetLength(), SetLength()는 FileErrorOr 결과를 조건식으로 반환했습니다. 오류가 발생해도 base::unexpected로 감싸지 않아, 파일 오류 값이 성공값처럼 처리될 수 있었습니다.
예를 들어 할당량을 초과한 Write()의 FILE_ERROR_NO_SPACE가 기록된 바이트 수로 해석되고, SetLength()로 수행하는 파일 크기 변경은 오류가 났는데도 성공한 것처럼 보일 수 있었습니다. 동기 접근 핸들을 사용하는 웹 페이지에는 실제 실패 원인이 전달되어야 합니다.
해결 내용
파일 오류를 오류 결과로 반환
third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc의 네 메서드에서 파일 오류가FILE_OK가 아니면base::unexpected(file_error)를 반환하도록 변경했습니다. 성공한 경우에만 읽거나 쓴 바이트 수, 파일 길이 또는 성공 값을 반환합니다.if (file_error != base::File::FILE_OK) { return base::unexpected(file_error); }할당량 초과 시 웹 API 결과 검증
content/browser/file_system_access/file_system_access_sync_access_handle_browsertest.cc에 일반 모드와 시크릿 모드를 모두 실행하는 매개변수화 브라우저 테스트를 추가했습니다. 각각 브라우저 컨텍스트의 저장소 할당량을 제한하고, worker에서 OPFS 동기 접근 핸들을 사용합니다.write()와truncate()가 작은 작업에는 성공한 뒤 할당량을 크게 넘는 작업에서는QuotaExceededError를 발생시키는지 확인합니다. 테스트 종료 시 핸들을 닫고 파일을 삭제합니다.
테스트 방법
| 테스트 | 검증 내용 |
|---|---|
WriteThrowsQuotaExceededError |
1바이트 쓰기는 성공하고, 3천만 바이트 쓰기는 일반·시크릿 모드 모두에서 QuotaExceededError를 발생시킵니다. |
TruncateThrowsQuotaExceededError |
파일 길이를 1바이트로 바꾸는 작업은 성공하고, 3천만 바이트로 늘리는 작업은 두 모드 모두에서 QuotaExceededError를 발생시킵니다. |
Gerrit 기록상 Patch Set 2와 4의 CQ dry run이 통과했습니다. 최종 변경은 2026년 9월 29일 Chromium main에 반영되었습니다(refs/heads/main@{#1706543}). 위 결과는 패치와 Gerrit 기록을 기준으로 정리했으며, 보고서 작성 과정에서 Chromium 브라우저 테스트를 별도로 실행하지는 않았습니다.
배운 점
FileErrorOr<T>에서 오류 값을 그대로 반환하면T의 성공값으로 변환될 수 있습니다. 실패는base::unexpected로 명시해야 호출자가 구분할 수 있습니다.- 오류 전달은 delegate 단위뿐 아니라 동기 접근 핸들을 사용하는 웹 API까지 확인해야 합니다.
- 일반 모드와 시크릿 모드가 서로 다른 파일 delegate 경로를 사용하므로, 같은 할당량 실패 시나리오를 두 컨텍스트에서 모두 검증해야 합니다.
- 실패 테스트 앞에 작은 성공 작업을 두면 핸들이 정상 동작하는 상태에서 할당량 오류가 발생했음을 확인할 수 있습니다.