"깨끗한 방법은 어디서나 통해. 안 통하는 데를 만나기 전까진. 어디서 멈추는지 정확히 아는 게 안 멈추는 척하는 것보다 훨씬 쓸모 있어."
깨끗한 읽기에도 끝이 있어
지난 두 레슨은 AX 로 읽는 걸 아주 반듯하게 보여줬지. 나무 하나, 질문 몇 개, 글이 툭 떨어지고. 접근성을 제대로 구현한 앱에선 맞는 얘기야. 네이티브 에디터, 애플 앱, 대부분의 Cocoa 입력 칸. 그런데 사람들이 실제로 하루 종일 머무는 소프트웨어 중 상당수가 안 그래. Chromium 으로 만든 브라우저들, 그리고 같은 엔진 위에 얹은 수많은 Electron 앱들. 채팅 클라이언트, 에디터, 메모 도구. 거기선 깨끗한 읽기가 벽에 부딪혀. 그 벽이 정확히 어디 있는지 아는 게 '대개는 되는' 도구랑 어디서나 되는 도구를 가르고.
불투명한 앱이 안 내주는 것
Chromium 이랑 Electron 은 화면 대부분을 네이티브 컨트롤 대신 자기가 직접 그려. 그래서 접근성 나무가 절반만 채워져 있어. 구체적으로는 kAXFocusedUIElementAttribute 가 쓸 만한 걸 안 돌려주거나, 돌려준 요소가 kAXSelectedTextAttribute 를 안 갖고 있지. 웹 내용에서 긁은 글이 표준 속성으로 아예 안 실려 나오는 거야. 악의도 아니고 따고 들어갈 자물쇠도 아니야. 읽을 정보가 그냥 없는 거지. Flint 쪽에서 보면 눈에 뻔히 보이는 하이라이트가 빈손으로 돌아와.
네이티브 에디터: 포커스된 요소 -> 긁어놓은 글 -> "..." (된다)
Chromium/Electron: 포커스된 요소 -> (없음) -> nil (구멍)
같은 호출인데 한쪽은 글을 돌려주고, 다른 쪽은
분명히 긁혀 있는데도 빈손으로 온다.
구멍인 걸 알아채기
위험한 실수는 AX 가 빈손으로 왔다고 '아무것도 안 긁혔네' 로 넘기는 거야. 네이티브 앱에선 맞는 말이지만 불투명한 앱에선 틀린 결론이거든. 긁혀 있는데 AX 가 못 볼 뿐이니까. 그래서 Flint 는 둘을 갈라. 제대로 협조하는 요소가 빈손이면 진짜로 빈 거고, 불투명한 걸로 알려진 앱에서 못 읽었으면 포기하라는 게 아니라 방법을 바꾸라는 신호야. 그 판단이 다음 레슨의 찔러보기로 데려가고.