diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp index 5e34404bd31..e5cd07a55ab 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp @@ -11,6 +11,7 @@ #include #include "RootComponentView.h" #include "UiaHelpers.h" +#include namespace winrt::Microsoft::ReactNative::implementation { @@ -484,6 +485,9 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::GetPropertyValue(PROPERT if (props == nullptr) return UIA_E_ELEMENTNOTAVAILABLE; + // Cast to HostPlatformViewProps to access Windows-specific properties like accessibilityLevel + auto hostProps = std::static_pointer_cast(baseView->props()); + auto compositionView = strongView.try_as(); if (compositionView == nullptr) return UIA_E_ELEMENTNOTAVAILABLE; @@ -597,17 +601,17 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::GetPropertyValue(PROPERT } case UIA_PositionInSetPropertyId: { pRetVal->vt = VT_I4; - pRetVal->lVal = props->accessibilityPosInSet; + pRetVal->lVal = hostProps ? hostProps->accessibilityPosInSet : 0; break; } case UIA_SizeOfSetPropertyId: { pRetVal->vt = VT_I4; - pRetVal->lVal = props->accessibilitySetSize; + pRetVal->lVal = hostProps ? hostProps->accessibilitySetSize : 0; break; } case UIA_LiveSettingPropertyId: { pRetVal->vt = VT_I4; - pRetVal->lVal = GetLiveSetting(props->accessibilityLiveRegion); + pRetVal->lVal = GetLiveSetting(hostProps ? hostProps->accessibilityLiveRegion : "none"); break; } case UIA_ItemStatusPropertyId: { @@ -619,18 +623,20 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::GetPropertyValue(PROPERT } case UIA_LevelPropertyId: { pRetVal->vt = VT_I4; - pRetVal->lVal = props->accessibilityLevel; + pRetVal->lVal = hostProps ? hostProps->accessibilityLevel : 0; break; } case UIA_AccessKeyPropertyId: { pRetVal->vt = VT_BSTR; - auto accessKey = ::Microsoft::Common::Unicode::Utf8ToUtf16(props->accessibilityAccessKey.value_or("")); + auto accessKey = ::Microsoft::Common::Unicode::Utf8ToUtf16( + hostProps ? hostProps->accessibilityAccessKey.value_or("") : ""); pRetVal->bstrVal = SysAllocString(accessKey.c_str()); break; } case UIA_ItemTypePropertyId: { pRetVal->vt = VT_BSTR; - auto itemtype = ::Microsoft::Common::Unicode::Utf8ToUtf16(props->accessibilityItemType.value_or("")); + auto itemtype = ::Microsoft::Common::Unicode::Utf8ToUtf16( + hostProps ? hostProps->accessibilityItemType.value_or("") : ""); pRetVal->bstrVal = SysAllocString(itemtype.c_str()); break; } diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp index b53b7057344..7331b497498 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -747,6 +748,10 @@ void ComponentView::updateAccessibilityProps( if (!UiaClientsAreListening()) return; + // Cast to HostPlatformViewProps to access Windows-specific properties + auto oldHostProps = static_cast(&oldViewProps); + auto newHostProps = static_cast(&newViewProps); + winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_IsKeyboardFocusablePropertyId, oldViewProps.focusable, newViewProps.focusable); @@ -789,41 +794,41 @@ void ComponentView::updateAccessibilityProps( winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_PositionInSetPropertyId, - oldViewProps.accessibilityPosInSet, - newViewProps.accessibilityPosInSet); + oldHostProps->accessibilityPosInSet, + newHostProps->accessibilityPosInSet); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_SizeOfSetPropertyId, - oldViewProps.accessibilitySetSize, - newViewProps.accessibilitySetSize); + oldHostProps->accessibilitySetSize, + newHostProps->accessibilitySetSize); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_LiveSettingPropertyId, - oldViewProps.accessibilityLiveRegion, - newViewProps.accessibilityLiveRegion); + oldHostProps->accessibilityLiveRegion, + newHostProps->accessibilityLiveRegion); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( - EnsureUiaProvider(), UIA_LevelPropertyId, oldViewProps.accessibilityLevel, newViewProps.accessibilityLevel); + EnsureUiaProvider(), UIA_LevelPropertyId, oldHostProps->accessibilityLevel, newHostProps->accessibilityLevel); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_AccessKeyPropertyId, - oldViewProps.accessibilityAccessKey, - newViewProps.accessibilityAccessKey); + oldHostProps->accessibilityAccessKey, + newHostProps->accessibilityAccessKey); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_ItemTypePropertyId, - oldViewProps.accessibilityItemType, - newViewProps.accessibilityItemType); + oldHostProps->accessibilityItemType, + newHostProps->accessibilityItemType); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), UIA_FullDescriptionPropertyId, - oldViewProps.accessibilityDescription, - newViewProps.accessibilityDescription); + oldHostProps->accessibilityDescription, + newHostProps->accessibilityDescription); winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( EnsureUiaProvider(), @@ -833,7 +838,7 @@ void ComponentView::updateAccessibilityProps( // Handle annotation properties with single call winrt::Microsoft::ReactNative::implementation::UpdateUiaPropertiesForAnnotation( - EnsureUiaProvider(), oldViewProps.accessibilityAnnotation, newViewProps.accessibilityAnnotation); + EnsureUiaProvider(), oldHostProps->accessibilityAnnotation, newHostProps->accessibilityAnnotation); // Handle expand/collapse state changes if (oldViewProps.accessibilityState.has_value() != newViewProps.accessibilityState.has_value() ||