v14: fix VoiceOver virtual tree plumbing (based on Chromium analysis)

Root cause: VoiceOver ignored our virtual elements because they were
missing critical hierarchy metadata.  Chromium's AXPlatformNodeCocoa
(also an NSAccessibilityElement subclass) works because it provides
all of these.  Fixes based on VS Code/Chromium analysis:

1. Add accessibilityWindow + accessibilityTopLevelUIElement on base class
   (EmacsAccessibilityElement) — VoiceOver needs these to associate
   notifications with a window context
2. Add accessibilityParent on base class — unbroken chain to EmacsView
3. Add isAccessibilityFocused on EmacsAccessibilityBuffer — returns YES
   for active buffer
4. Post FocusedUIElementChangedNotification in windowDidBecomeKey —
   tells VoiceOver to start tracking the virtual element on app focus
5. Remove duplicate isAccessibilityFocused, deduplicate accessibilityParent
6. Keep all v13.3 features: Zoom, typing echo, full text protocol
This commit is contained in:
2026-02-26 10:20:03 +01:00
parent ce31b94bb9
commit 8fbdb2406d