C.W.K.
Stream
Lesson 05 of 05 · published

클립보드를 빌리고, 깨끗이 돌려줘

~10 min · pasteboard, clipboard, etiquette, privacy

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"클립보드는 유저 거지 네 거 아냐. 붙여넣으려고 빌렸으면, 발견한 그대로 돌려놔."

붙여넣기 발판엔 빚이 있어

클립보드 + Cmd+V 발판은 삽입의 일꾼이지만, 공유 자원을 써: 유저의 클립보드. Firekeeper 가 받아쓰기를 붙여넣으려고 클립보드에 쓰면, 네가 복사해 뒀던 뭐든 방금 짓밟은 거야 — URL, 문단, 이미지. 무례하고 놀라워. 그래서 붙여넣기 발판은 예의를 빚져: 현재 클립보드를 먼저 저장하고, 전사를 쓰고, 붙여넣고, 붙여넣기가 자리 잡으면 원본 클립보드를 복원해.

저장, 붙여넣기, 복원

1. 저장   = 현재 클립보드 내용 읽기 + 챙기기
2. 쓰기   = 전사를 클립보드에 넣기 (transient 표시)
3. 붙여넣기 = Cmd+V 합성
4. 정착   = 붙여넣기가 떨어지길 잠깐 기다리기
5. 복원   = 원본 내용 되돌리기
            (그 사이 딴 게 썼으면 복원 건너뜀)

미묘함 둘이 이걸 안전하게 만들어. 가능한 곳에서 Firekeeper 의 클립보드 쓰기를 transient 로 표시해, 클립보드-히스토리 도구가 네 받아쓰기를 네가 복사한 것처럼 기록 안 하게. 그리고 복원 전에, 그 창에서 딴 게 클립보드에 안 썼는지 확인해 — 썼으면, 더 새 내용을 짓밟지 마. 방금 복사를 덮어쓰는 예의는 예의 없는 것보다 나빠.

보안-필드 선

이 춤 전체가 꺼지는 곳이 하나 있어: 보안 필드. 타깃이 비밀번호 필드면, Firekeeper 는 그 주위에서 클립보드를 절대 읽거나 복원 안 하고, 삽입을 아예 거부해. 보안 맥락 근처에서 클립보드를 읽거나, 전사를 거기 얹어두는 건 보이스 도구가 절대 하면 안 되는 딱 그런 동작이야. 타깃 캡처의 보안-필드 체크가 여기까지 쭉 흘러: 삽입만 막는 게 아니라 클립보드 처리도 막아.

공유 상태를 발견한 그대로 남겨. 기능이 유저도 쓰는 자원을 빌려야 할 때 — 클립보드, 최전면 창, 오디오 기기 — 저장-과-복원을 빚져. 잘 처신하는 도구의 척도는, 작동한 후에 그저 빌렸던 시스템 부분이 안 건드린 것과 구별 안 된다는 거야.

Code

저장, 붙여넣기, 복원 — 그리고 보안 필드 근처엔 절대 안 함·swift
func pasteInsert(_ text: String, into t: TargetSnapshot) async -> Bool {
    guard !t.isSecureField else { return false }   // 여기선 클립보드 절대 안 건드림

    let pb = NSPasteboard.general
    let saved = pb.pasteboardItems?.map { $0.copy() }   // 1. 저장
    let tokenBefore = pb.changeCount

    pb.clearContents()
    pb.setString(text, forType: .string)               // 2. 쓰기 (transient 표시)
    await synthesizeCmdV()                              // 3. 붙여넣기
    try? await Task.sleep(for: .milliseconds(120))     // 4. 정착

    // 5. 붙여넣는 동안 딴 게 안 썼을 때만 복원.
    if pb.changeCount == tokenBefore + 1, let saved {
        pb.clearContents(); pb.writeObjects(saved)
    }
    return true
}

External links

Exercise

공유 시스템 자원을 빌리는 앱의 기능을 찾아(클립보드, 카메라, 최전면 창, 키보드 포커스). 그 자원을 이전 상태로 돌려놔, 아니면 흔적을 남겨? 필요한 저장-붙여넣기-복원 식 춤을 묘사해, 더 새 걸 짓밟지 않게 막는 확인 포함.
Hint
완전한 춤은 늘: 이전 상태 챙기기, 자원 쓰기, 그다음 복원 — 근데 쥐고 있는 동안 세상이 바뀌었는지 감지하는 가드와 함께. 그 가드 없으면, '복원' 이 '그사이 벌어진 뭐든 덮어쓰기' 가 돼, 예의를 데이터-손실 버그로 바꿔. change-count 확인이 빌리기를 안전하게 만드는 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.