From 264612785157ac54b7e7fb65de33fd0ebbd03440 Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Wed, 17 Jun 2026 02:03:31 +0800 Subject: [PATCH] Report read-only value state to macOS accessibility (#21597) AvnAccessibilityElement answers accessibilityIsAttributeSettable for the value attribute using IValueProvider.IsReadOnly, so AX clients see a read-only TextBox as not settable. --- native/Avalonia.Native/src/OSX/automation.mm | 14 ++++++++++++++ src/Avalonia.Native/AvnAutomationPeer.cs | 1 + src/Avalonia.Native/avn.idl | 1 + 3 files changed, 16 insertions(+) diff --git a/native/Avalonia.Native/src/OSX/automation.mm b/native/Avalonia.Native/src/OSX/automation.mm index a6ae754c43..7897a76973 100644 --- a/native/Avalonia.Native/src/OSX/automation.mm +++ b/native/Avalonia.Native/src/OSX/automation.mm @@ -274,6 +274,20 @@ } } +- (BOOL)accessibilityIsAttributeSettable:(NSAccessibilityAttributeName)attribute +{ + if ([attribute isEqualToString:NSAccessibilityValueAttribute]) + { + if (_peer->IsValueProvider()) + return !_peer->ValueProvider_IsReadOnly(); + if (_peer->IsRangeValueProvider()) + return YES; + return NO; + } + + return [super accessibilityIsAttributeSettable:attribute]; +} + - (id)accessibilityMinValue { if (_peer->IsRangeValueProvider()) diff --git a/src/Avalonia.Native/AvnAutomationPeer.cs b/src/Avalonia.Native/AvnAutomationPeer.cs index 659ba78200..4a679e3ed7 100644 --- a/src/Avalonia.Native/AvnAutomationPeer.cs +++ b/src/Avalonia.Native/AvnAutomationPeer.cs @@ -201,6 +201,7 @@ namespace Avalonia.Native public int IsValueProvider() => IsProvider(); public IAvnString? ValueProvider_GetValue() => ValueProvider.Value.ToAvnString(); public void ValueProvider_SetValue(string value) => ValueProvider.SetValue(value); + public int ValueProvider_IsReadOnly() => ValueProvider.IsReadOnly.AsComBool(); [return: NotNullIfNotNull("peer")] public static AvnAutomationPeer? Wrap(AutomationPeer? peer) diff --git a/src/Avalonia.Native/avn.idl b/src/Avalonia.Native/avn.idl index 1b9ee376c6..a1b57f7d14 100644 --- a/src/Avalonia.Native/avn.idl +++ b/src/Avalonia.Native/avn.idl @@ -1329,6 +1329,7 @@ interface IAvnAutomationPeer : IUnknown bool IsValueProvider(); IAvnString* ValueProvider_GetValue(); void ValueProvider_SetValue([const] char* value); + bool ValueProvider_IsReadOnly(); IAvnString* GetHelpText(); IAvnString* GetPlaceholderText();