Goal Anchor
- Outcome: 지원하는 Web Cut에서 clipboard 표현 확보가 실패하면 브라우저의 후속 삭제로 넘어가지 않고 문서·선택·History를 보존한다.
- Done: 표현 인코딩/쓰기 실패를 회귀 테스트로 고정하고, 실제 Rich Text Usage의 native Cut 단축키에서 실패 후 문서·DOM 선택·Undo/Redo 보존과 정상 재시도를 확인한다. 공통 Web owner 문서와 이슈 댓글에 이벤트 책임·명세 근거·검증 한계를 남긴다.
- Don't: Core·Profile·공개 API 형태를 늘리지 않는다. Copy/Paste 및 Cut 미지원·clipboardData 부재·payload 부재의 기존 위임 정책을 바꾸지 않는다. Host나 Rich Text에 별도 우회 구현을 만들지 않는다. OS clipboard와 문서의 원자성이나 이미 쓴 표현의 롤백을 보장하지 않는다.
이어받은 계약
사용자의 “계속해줘 다음 작업”, “merge하고” 요청에 따라 #728을 머지한 뒤 기존 EG-CUT의 실패 시 원본 보존 계약을 이어서 검증한다. #726 설계 초안에도 ‘제거 callback 미호출 외에 event 취소·후속 beforeinput/input·document·History 관찰’이 미검증 질문으로 남아 있다. 이번 이슈는 그 실행 경로의 결함 수정이며 #725의 설계 범위를 변경하지 않는다.
재현된 현재 동작
기준 main: aae30a66159e4ec0649fa94806d55805341cb965.
실제 /editing/rich-text Usage에서 text-editable의 offset 2–4를 선택하고, 테스트에서 DataTransfer.setData의 첫 structured MIME 쓰기를 예외로 실패시킨 뒤 실제 ControlOrMeta+x를 입력했다.
- Chrome 152.0.7977.83, Firefox 150.0.2, WebKit 26.4 모두 같은 결과.
cut은 isTrusted: true, defaultPrevented: false.
- 이어
beforeinput(deleteByCut)이 발생하고 Rich Text editor가 선택 영역을 제거한다.
여기를 선택하고 직접 입력해 보세요. → 여기선택하고 직접 입력해 보세요.로 canonical document가 바뀌고 Undo가 활성화된다.
- 직접 호출한 clipboard binding에서는
clipboard.unavailable, 제거 callback 0회지만 preventDefault도 0회다. 기존 단위 검증만으로는 브라우저의 후속 삭제를 발견하지 못했다.
실패는 테스트에서 주입했으며 실제 OS 권한 거절을 재현했다고 주장하지 않는다. 합성 ClipboardEvent로 후속 삭제를 흉내 내지 않았다.
책임 경계
정본은 packages/json-document-web/src/clipboard.ts의 createWebClipboardBinding이다. 지원하는 Cut callback, 사용 가능한 event clipboardData, 확보한 payload가 있는 경우 표현 인코딩/쓰기 전에 native Cut 책임을 확보해야 한다. 쓰기가 끝난 뒤에만 정본 제거 callback을 호출하는 순서는 유지한다. 실패 결과와 이벤트 소유권은 서로 다른 사실이다.
기존 createWebClipboardSurface, Rich Text Web binding 및 사이트 Usage는 이 정본을 소비한다. 기존 공개 export·API reference·Usage·source 등록을 유지하고 실제 경로를 검증한다.
완료 증거
읽을 거리
Goal Anchor
이어받은 계약
사용자의 “계속해줘 다음 작업”, “merge하고” 요청에 따라 #728을 머지한 뒤 기존 EG-CUT의 실패 시 원본 보존 계약을 이어서 검증한다. #726 설계 초안에도 ‘제거 callback 미호출 외에 event 취소·후속 beforeinput/input·document·History 관찰’이 미검증 질문으로 남아 있다. 이번 이슈는 그 실행 경로의 결함 수정이며 #725의 설계 범위를 변경하지 않는다.
재현된 현재 동작
기준 main:
aae30a66159e4ec0649fa94806d55805341cb965.실제
/editing/rich-textUsage에서text-editable의 offset 2–4를 선택하고, 테스트에서DataTransfer.setData의 첫 structured MIME 쓰기를 예외로 실패시킨 뒤 실제ControlOrMeta+x를 입력했다.cut은isTrusted: true,defaultPrevented: false.beforeinput(deleteByCut)이 발생하고 Rich Text editor가 선택 영역을 제거한다.여기를 선택하고 직접 입력해 보세요.→여기선택하고 직접 입력해 보세요.로 canonical document가 바뀌고 Undo가 활성화된다.clipboard.unavailable, 제거 callback 0회지만preventDefault도 0회다. 기존 단위 검증만으로는 브라우저의 후속 삭제를 발견하지 못했다.실패는 테스트에서 주입했으며 실제 OS 권한 거절을 재현했다고 주장하지 않는다. 합성 ClipboardEvent로 후속 삭제를 흉내 내지 않았다.
책임 경계
정본은
packages/json-document-web/src/clipboard.ts의createWebClipboardBinding이다. 지원하는 Cut callback, 사용 가능한 event clipboardData, 확보한 payload가 있는 경우 표현 인코딩/쓰기 전에 native Cut 책임을 확보해야 한다. 쓰기가 끝난 뒤에만 정본 제거 callback을 호출하는 순서는 유지한다. 실패 결과와 이벤트 소유권은 서로 다른 사실이다.기존
createWebClipboardSurface, Rich Text Web binding 및 사이트 Usage는 이 정본을 소비한다. 기존 공개 export·API reference·Usage·source 등록을 유지하고 실제 경로를 검증한다.완료 증거
읽을 거리
deleteByCut의 의미와 beforeinput 취소 가능성을 확인할 수 있다. 이번 이벤트 순서의 실행 증거는 위의 세 엔진 재현이다.