From 5d1892effa24558945e14638b0440d6a5cc362a0 Mon Sep 17 00:00:00 2001 From: Arnold Loubriat Date: Thu, 30 Jul 2026 11:57:25 +0200 Subject: [PATCH] fix: Label via accessibilityValue for some roles on macOS --- adapters/macos/src/node.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/adapters/macos/src/node.rs b/adapters/macos/src/node.rs index d07ba50b5..f403183de 100644 --- a/adapters/macos/src/node.rs +++ b/adapters/macos/src/node.rs @@ -230,6 +230,17 @@ fn ns_role(node: &NodeRef) -> &'static NSAccessibilityRole { } } +fn label_is_exposed_in_value(role: Role) -> bool { + matches!( + role, + Role::Label + | Role::ListBoxOption + | Role::ListMarker + | Role::MenuListOption + | Role::TitleBar + ) +} + fn ns_sub_role(node: &NodeRef) -> &'static NSAccessibilitySubrole { let role = node.role(); @@ -309,6 +320,9 @@ impl NodeWrapper<'_> { // includes a title, VoiceOver behavior is broken. return None; } + if label_is_exposed_in_value(self.0.role()) { + return None; + } self.0.label() } @@ -329,6 +343,11 @@ impl NodeWrapper<'_> { // Also, `Node::is_selected` is mapped to checked via `accessibilityValue`. return Some(Value::Bool(self.0.is_selected().unwrap_or(false))); } + if label_is_exposed_in_value(self.0.role()) { + if let Some(label) = self.0.label() { + return Some(Value::String(label)); + } + } if let Some(value) = self.0.value() { return Some(Value::String(value)); }