VoiceOver Accessibility Patch Series — Testing Evidence ======================================================= Tester: Martin Sukany Date: 2026-02-28 Environment ----------- Host: CM2D4G-A9635005 (macOS) Base: emacs master (upstream HEAD at time of test) 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. Zoom Cursor Tracking ------------------------ PASS — UAZoomChangeFocus integration working correctly: - Typing in buffer: cursor tracked, Zoom follows OK - M-x: Zoom moves focus to minibuffer OK - M-x list- TAB M-v: switches to *Completions* buffer, TAB cycles focus across completion candidates OK - C-x 2, C-x 2, C-x 3 (multiple splits), then C-x o cycling: Zoom focus correctly follows between windows OK 5. Documentation ---------------- PASS — Texinfo node accessible via C-h i g (emacs)VoiceOver Accessibility. Node correctly linked from macOS appendix menu. 6. VoiceOver — Basic Navigation -------------------------------- PASS — VoiceOver active (Cmd+F5): - Buffer name announced correctly on focus OK - Typing: each character announced as typed OK - Arrow keys / C-n / C-p: line-by-line navigation, current line announced OK - Word navigation: reads full current word OK - M-x: switches to minibuffer, announces "minibuffer" OK 7. VoiceOver — Completions --------------------------- PASS — Completion buffer interaction: - M-x list-* then M-v to switch to *Completions*: buffer content read correctly OK - TAB cycling in *Completions*: announces only the current candidate (interactive span focus) OK 8. VoiceOver — Window Switching -------------------------------- PASS — Multiple windows (C-x 2, C-x 3, C-x o cycling): - Announces current buffer name and content on switch OK - Begins reading buffer content automatically OK - User action (typing, navigation) correctly interrupts reading and announces new action instead OK - Notification priority/preemption working as designed OK 9. VoiceOver — Full Buffer Reading ----------------------------------- PASS — VO+A reads entire buffer including off-screen content. - Cursor synchronization between Emacs and VoiceOver virtual cursor working correctly OK 10. VoiceOver — Accessibility Tree ----------------------------------- PASS — Virtual element tree dynamically maintained: - New AX element created for each open buffer OK - Minibuffer element present and readable OK - Mode-line elements present per buffer, readable via VoiceOver virtual navigation OK - Tree correctly updates when windows are split/closed OK 11. VoiceOver — Selection -------------------------- PASS — C-SPC + cursor movement: - Announces "selected" with region feedback OK 12. VoiceOver — Org-mode Invisible Text ---------------------------------------- PASS — Org-mode folding (Tab on headings): - Folded: hidden text NOT read by VoiceOver OK - Unfolded: full content read correctly OK - Invisible text filtering (TEXT_PROP_MEANS_INVISIBLE) working as designed OK 13. ERT — ns-accessibility-enabled Variable -------------------------------------------- PASS — Ran 1 test, 1 result as expected: - ns-accessibility-enabled is bound OK - ns-accessibility-enabled defaults to t OK (ERT 1/1 passed, 2026-02-28 11:45:55 CET) 14. VoiceOver — Overlay Completion (Patch 0007) ------------------------------------------------ PASS — Vertico minibuffer overlay completion: - Vertico candidates announced on C-n / C-p navigation OK - Selected candidate face detected (vertico-current) OK - Deduplication: same candidate not re-announced OK - Zoom tracks selected candidate in minibuffer (overlayZoomRect / overlayZoomActive lifecycle) OK - overlayZoomActive cleared on text input OK - hl-line-mode compatibility: cursor movement in dired and read-only buffers correctly announces lines (textDidChange flag decouples modiff branch from cursor-move branch) OK 15. VoiceOver — Child Frame Completion (Patch 0008) ---------------------------------------------------- PASS — Corfu child frame completion: - Corfu popup candidates announced via VoiceOver OK - Selected candidate face detected (corfu-current) OK - Zoom tracks selected candidate in child frame (direct UAZoomChangeFocus) OK - No Emacs freeze (re-entrance guard before child frame dispatch, buffer switch with unbind_to on all paths) OK - Focus restored to parent buffer after corfu closes (childFrameCompletionActive flag + FOR_EACH_FRAME visibility check + FocusedUIElementChanged) OK - Non-completion child frames skipped (10KB buffer limit) OK - specpdl_ref type used correctly (not ptrdiff_t) OK