From 387eea5f51edfe25913b06be2eb6df26f9be434d Mon Sep 17 00:00:00 2001 From: attila Date: Thu, 19 Oct 2023 18:17:47 +0200 Subject: [PATCH] MacOS: Accessibility: Fix returning ignored native element in accessibilityChildren This fixes a bug, where VoiceOver would interact with the InnerNSView in the AudioPluginHost. Instead the focus now jumps from the minimise button directly to the plugin's first accessible element. On MacOS the rule is: when returning accessibilityChildren an ignored child must be replaced with its own children. When returning the accessibilityParent, an ignored element must be replaced with its own parent. --- .../native/accessibility/juce_Accessibility_mac.mm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/juce_gui_basics/native/accessibility/juce_Accessibility_mac.mm b/modules/juce_gui_basics/native/accessibility/juce_Accessibility_mac.mm index 8175e94d38..d0dd6eb379 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_Accessibility_mac.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_Accessibility_mac.mm @@ -792,8 +792,18 @@ private: for (auto* childHandler : children) [accessibleChildren addObject: static_cast (childHandler->getNativeImplementation())]; - if (auto* nativeChild = AccessibilityHandler::getNativeChildForComponent (handler->getComponent())) - [accessibleChildren addObject: static_cast (nativeChild)]; + if (id nativeChild = static_cast (AccessibilityHandler::getNativeChildForComponent (handler->getComponent()))) + { + // Having both native and non-native children would require implementing an + // ordering. However, this situation doesn't occur with any of our current + // use-cases. + jassert ([accessibleChildren count] == 0); + + if ([nativeChild isAccessibilityElement]) + [accessibleChildren addObject:nativeChild]; + else if (auto* childrenOfChild = [nativeChild accessibilityChildren]; childrenOfChild != nil) + [accessibleChildren addObjectsFromArray:(NSArray* _Nonnull) childrenOfChild]; + } return accessibleChildren; }