On Tue, 3 Nov 2026 22:24:50 GMT, Andy Goryachev <[email protected]> wrote:

>> Querying native accessibility children from accessibilityIsIgnored can cause 
>> AppKit to walk up the ancestor hierarchy and query the same window’s ignored 
>> status again, resulting in infinite recursion that causes a 
>> StackOverflowError. The error may go unnoticed during normal execution 
>> because the native code clears pending Java exceptions, while an exception 
>> breakpoint in a debug session exposes the StackOverflowError before it is 
>> cleared.
>> 
>> The fix introduces a Java method that traverses the JavaFX accessibility 
>> children directly and reports whether the hierarchy contains context-menu or 
>> tooltip content. The native peer uses this result to determine whether the 
>> window should be ignored, without requesting native unignored children.
>> 
>> The original child query also initialized descendant accessibility peers so 
>> that VoiceOver could discover the menu content. The replacement preserves 
>> this behavior by initializing every peer encountered during traversal and 
>> continuing through all descendants even after finding a matching role.
>> 
>> 
>> 
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacAccessible.java 
> line 896:
> 
>> 894:             ObservableList<Node> children = 
>> (ObservableList<Node>)accessible.getAttribute(CHILDREN);
>> 895:             if (children != null) {
>> 896:                 for (Node child : children) {
> 
> should you check `isVisible()` on each child?

Not really - we need to come down to all the children to trigger their a11y 
peers being initialized - otherwise VO might report an incorrect number of 
children.

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/2360#discussion_r4461598741

Reply via email to