VoiceOver Accessibility Patch Series — Testing Evidence ======================================================= Tester: Martin Sukany Date: 2026-02-28 Environment ----------- Host: CM2D4G-A9635005 (macOS 14) Base: emacs master (upstream HEAD at time of test) PATCH A: ZOOM (0000) ===================== 1. Patch Application -------------------- PASS — Standalone Zoom patch applies cleanly via git-am. No conflicts, no warnings. 2. Build -------- PASS — Full NS (Cocoa) build completed successfully. No warnings related to Zoom code. 3. Zoom Cursor Tracking ------------------------ PASS — UAZoomChangeFocus integration: - Typing in buffer: Zoom tracks cursor OK - M-x: Zoom moves to minibuffer OK - C-x 2, C-x o cycling: Zoom follows across split windows OK - C-x 2, C-x o, C-p: Zoom follows cursor up after switch OK (ns_update_end fallback ensures tracking) 4. No-Zoom Overhead -------------------- PASS — UAZoomEnabled() returns false when Zoom is off. Single function call overhead per redisplay cycle (negligible). PATCH B: VOICEOVER (0001-0008) =============================== 1. Patch Application -------------------- PASS — All 8 patches applied cleanly via git-am: 0001 ns: add accessibility base classes and text extraction 0002 ns: implement buffer accessibility element (core protocol) 0003 ns: add buffer notification dispatch and mode-line element 0004 ns: add interactive span elements for Tab navigation 0005 ns: integrate accessibility with EmacsView and redisplay 0006 doc: add VoiceOver accessibility section to macOS appendix 0007 ns: announce overlay completion candidates for VoiceOver 0008 ns: announce child frame completion candidates for VoiceOver No conflicts, no warnings. 2. Build -------- PASS — Full NS (Cocoa) build completed successfully: ./autogen.sh OK ./configure --with-ns OK make -j12 OK make install OK No warnings related to accessibility code. 3. Basic Launch --------------- PASS — emacs -Q starts without errors or warnings. 4. VoiceOver — Basic Navigation -------------------------------- PASS — VoiceOver active (Cmd+F5): - Buffer name announced on focus OK - Typing: each character announced OK - Arrow keys / C-n / C-p: line navigation announced OK - Word navigation (M-f / M-b): word announced OK - M-x: switches to minibuffer, announces "minibuffer" OK 5. VoiceOver — Completions --------------------------- PASS — Completion buffer interaction: - M-x, partial command, Tab → *Completions* OK - Tab cycling: announces each candidate OK - No double-speech OK 6. VoiceOver — Window Switching -------------------------------- PASS — Multiple windows (C-x 2, C-x 3, C-x o): - Announces buffer name and content on switch OK - Notification priority/preemption working OK 7. VoiceOver — Full Buffer Reading ----------------------------------- PASS — VO+A reads entire buffer including off-screen content. 8. VoiceOver — Accessibility Tree ----------------------------------- PASS — Virtual element tree dynamically maintained: - Buffer elements created per window OK - Mode-line elements readable via VO navigation OK - Tree updates on split/close OK 9. VoiceOver — Selection -------------------------- PASS — C-SPC + movement: announces "selected" with region. 10. VoiceOver — Org-mode Invisible Text ---------------------------------------- PASS — Folded text NOT read, unfolded text read correctly. 11. ERT — ns-accessibility-enabled Variable -------------------------------------------- PASS — ns-accessibility-enabled bound, defaults to t. 12. VoiceOver — Overlay Completion (Patch 0007) ------------------------------------------------ PASS — Vertico overlay completion: - Candidates announced on C-n / C-p OK - Selected face detected (vertico-current) OK - Deduplication working OK - hl-line-mode compatibility (textDidChange flag) OK 13. VoiceOver — Child Frame Completion (Patch 0008) ---------------------------------------------------- PASS — Corfu child frame completion: - Candidates announced via VoiceOver OK - Selected face detected (corfu-current) OK - No Emacs freeze (re-entrance guard) OK - Focus restored to parent after popup closes OK - Non-completion child frames skipped (10KB limit) OK 14. Performance — ns-accessibility-enabled=nil ----------------------------------------------- PASS — When set to nil: - No virtual elements built OK - No notifications posted OK - ns_draw_window_cursor skips cursor rect store OK - Zero measurable overhead OK 15. Documentation ----------------- PASS — Texinfo node accessible via C-h i g (emacs)VoiceOver. etc/NEWS entry present and accurate.