페이지에서 파일 선택 버튼을 찾았다고 아무 파일이나 보낼 수 있는 것은 아니다. 선택한 파일의 수명은 앞선 글에서 다뤘다. 이번에는 웹의 입력 기능과 호스트의 파일 허용이 어떻게 만나야 하는지, 버튼 뒤에서 열린 chooser도 정말 같은 프레임의 것인지 확인한 경계를 본다.

웹 입력란과 호스트 선택은 다른 정보다

browser.upload의 공개 호출은 현재 ref와 fileIds를 받는다. 임의 로컬 경로를 인자로 넣는 스키마가 아니다. 실제 경로는 호스트가 등록한 핸들에서 찾고 프로필과 현재 작업의 허용 목록을 확인한다. 웹페이지의 file input이나 accept 속성이 로컬 자료의 사용 권한을 만들어 주지는 않는다.

앞선 파일 핸들 글의 변경·철회 검사는 이 앞단의 계약이다. 이번에는 그 계약을 통과한 paths가 드라이버 내부에서만 현재 입력 노드에 연결되는 구조를 읽는다. 경로를 외부 호출에서 안 받는 것과 파일이 실제로 선택됐는지는 또 다른 질문이다. 어느 하나의 성공으로 나머지 단계가 자동 통과되지는 않는다.

직접 file input과 버튼 뒤 chooser는 다르게 읽는다

setFiles는 현재 ref를 validate한 뒤 실제 file input이면 그 노드를 잡아 DOM.setFileInputFiles를 호출한다. 버튼처럼 picker를 여는 컨트롤이면 먼저 pickerTarget 검사를 거쳐 chooser 이벤트를 기다린다. 이름에 사진이나 동영상이 들어 있다고 모든 패널 버튼을 선택창으로 간주하지 않는다.

chooser는 예상 session과 frameId에 묶어 보고 backend node가 있는지 확인한다. 다른 프레임 이벤트가 오면 오류다. 단일 선택 모드에 여러 파일을 넣으려는 경우와 디렉터리 선택도 따로 거절한다. 단순히 화면에서 그럴듯한 버튼을 눌렀다는 것보다 어느 네이티브 입력에 파일을 연결했는지가 중요했다.

페이지가 입력 목록을 바로 비워도 성공을 추측하지 않는다

일부 업로더는 FileList를 복사한 뒤 input.value를 동기적으로 비운다. 선택 뒤 목록이 비어 있다고 아무것도 선택하지 않았다는 뜻일 수도 있고, 이미 페이지가 복사했다는 뜻일 수도 있다. 빈 목록 하나로 어느 쪽을 결정하지 않았다.

현재 경로는 격리된 세계에서 해당 input의 trusted input·change 이벤트를 제한적으로 기록한다. 실제 목록이 남아 있으면 그것을 읽고 비워졌다면 그 선택 근거의 이름·크기를 읽는다. 임의 페이지 변수가 성공이라고 말한 내용을 가져오는 방식이 아니다. 다만 이것도 네이티브 선택 정보이며 서버 수신의 바이트를 확인한 증거는 아니다.

전달 직전 확인과 임시 관찰의 정리를 같이 둔다

직접 입력과 chooser 경로는 실제 파일 연결 전에 onDispatch와 check를 거친다. TaskFiles의 콜백은 그 시점에도 핸들과 메타데이터를 재검사한다. 선택을 준비한 뒤 취소하거나 문서가 바뀌는 경우를 처음 검사만으로 넘기지 않는다.

finally에서는 타이머·poll·디버거 listener를 정리하고 chooser interception을 끄며 임시 selection listener와 원격 object를 해제한다. 종료한 관찰이 다음 파일 선택의 근거로 남지 않게 하는 수명 관리다. 이 정리가 모든 서버 부작용을 되돌리는 것은 아니다. 전달 전에 거절한 일과 이미 보낸 파일의 결과 확인은 계속 구분한다.

반례는 패널 버튼과 실제 선택창을 구별한다

원래 chooser 시험은 실제 선택창을 여는 사진·영상 추가 버튼과 단순 동영상 패널 버튼을 나눠 검사한다. 허용 경로는 로컬 수신기의 파일 결과도 따로 읽고, 패널만 여는 버튼은 선택창 컨트롤이 아니라는 오류를 기대한다. 선택 확인과 서버 수신 비교를 하나의 verified로 섞지 않은 것이다.

이번에는 소스와 해당 시험 설계를 읽었으며 실제 파일 선택창이나 운영 업로드를 새로 실행하지 않았다. 공유 파일 영수증 모듈은 합성 bytes·허용 핸들·선택 정보 비교만 제공한다. 실제 chooser를 다루는 기능은 없다. 웹에서 보이는 능력과 호스트가 허용한 자료를 별도 검사로 연결해야 한다는 기준을 공개한다.