Skip to content

Commit 2d5d440

Browse files
authored
[0.77] [Fabric] Fix Bug in Narrator Navigation (#14507)
* [Fabric] Fix Bug in Narrator Navigation (#14498) * Fix Narrator Bug * Change files * Revert Codegen Changes * Backport * Format
1 parent 0560f78 commit 2d5d440

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Fix Narrator Bug",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp

+22-17
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <Utils/KeyboardUtils.h>
1616
#include <Utils/ValueUtils.h>
1717
#include <Views/FrameworkElementTransferProperties.h>
18+
#include <atlcomcli.h>
1819
#include <winrt/Microsoft.ReactNative.Composition.Experimental.h>
1920
#include <winrt/Microsoft.UI.Input.h>
2021
#include <winrt/Windows.UI.Composition.h>
@@ -350,9 +351,9 @@ void ComponentView::onLostFocus(
350351

351352
m_componentHostingFocusVisual->hostFocusVisual(false, get_strong());
352353
}
353-
if (m_uiaProvider) {
354+
if (UiaClientsAreListening()) {
354355
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
355-
m_uiaProvider, UIA_HasKeyboardFocusPropertyId, true, false);
356+
EnsureUiaProvider(), UIA_HasKeyboardFocusPropertyId, true, false);
356357
}
357358
}
358359
base_type::onLostFocus(args);
@@ -400,8 +401,8 @@ void ComponentView::onGotFocus(
400401
focusRect.size.height += (FOCUS_VISUAL_WIDTH * 2);
401402
focusVisualRoot(focusRect)->hostFocusVisual(true, get_strong());
402403
}
403-
if (m_uiaProvider) {
404-
auto spProviderSimple = m_uiaProvider.try_as<IRawElementProviderSimple>();
404+
if (UiaClientsAreListening()) {
405+
auto spProviderSimple = EnsureUiaProvider().try_as<IRawElementProviderSimple>();
405406
if (spProviderSimple != nullptr) {
406407
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
407408
m_uiaProvider, UIA_HasKeyboardFocusPropertyId, false, true);
@@ -705,67 +706,71 @@ void ComponentView::updateTransformProps(
705706
void ComponentView::updateAccessibilityProps(
706707
const facebook::react::ViewProps &oldViewProps,
707708
const facebook::react::ViewProps &newViewProps) noexcept {
708-
if (!m_uiaProvider)
709+
if (!UiaClientsAreListening())
709710
return;
710711

711712
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
712-
m_uiaProvider, UIA_IsKeyboardFocusablePropertyId, oldViewProps.focusable, newViewProps.focusable);
713+
EnsureUiaProvider(), UIA_IsKeyboardFocusablePropertyId, oldViewProps.focusable, newViewProps.focusable);
713714

714715
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
715-
m_uiaProvider,
716+
EnsureUiaProvider(),
716717
UIA_NamePropertyId,
717718
oldViewProps.accessibilityLabel,
718719
newViewProps.accessibilityLabel.empty() ? DefaultAccessibleName() : newViewProps.accessibilityLabel);
719720

720721
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
721-
m_uiaProvider,
722+
EnsureUiaProvider(),
722723
UIA_IsContentElementPropertyId,
723724
(oldViewProps.accessible && oldViewProps.accessibilityRole != "none"),
724725
(newViewProps.accessible && newViewProps.accessibilityRole != "none"));
725726

726727
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
727-
m_uiaProvider,
728+
EnsureUiaProvider(),
728729
UIA_IsControlElementPropertyId,
729730
(oldViewProps.accessible && oldViewProps.accessibilityRole != "none"),
730731
(newViewProps.accessible && newViewProps.accessibilityRole != "none"));
731732

732733
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
733-
m_uiaProvider,
734+
EnsureUiaProvider(),
734735
UIA_IsEnabledPropertyId,
735736
!(oldViewProps.accessibilityState && oldViewProps.accessibilityState->disabled),
736737
!(newViewProps.accessibilityState && newViewProps.accessibilityState->disabled));
737738

738739
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
739-
m_uiaProvider,
740+
EnsureUiaProvider(),
740741
UIA_IsEnabledPropertyId,
741742
!(oldViewProps.accessibilityState && oldViewProps.accessibilityState->busy),
742743
!(newViewProps.accessibilityState && newViewProps.accessibilityState->busy));
743744

744745
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
745-
m_uiaProvider, UIA_ControlTypePropertyId, oldViewProps.accessibilityRole, newViewProps.accessibilityRole);
746+
EnsureUiaProvider(), UIA_ControlTypePropertyId, oldViewProps.accessibilityRole, newViewProps.accessibilityRole);
746747

747748
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
748-
m_uiaProvider, UIA_HelpTextPropertyId, oldViewProps.accessibilityHint, newViewProps.accessibilityHint);
749+
EnsureUiaProvider(), UIA_HelpTextPropertyId, oldViewProps.accessibilityHint, newViewProps.accessibilityHint);
749750

750751
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
751-
m_uiaProvider,
752+
EnsureUiaProvider(),
752753
UIA_PositionInSetPropertyId,
753754
oldViewProps.accessibilityPosInSet,
754755
newViewProps.accessibilityPosInSet);
755756

756757
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
757-
m_uiaProvider, UIA_SizeOfSetPropertyId, oldViewProps.accessibilitySetSize, newViewProps.accessibilitySetSize);
758+
EnsureUiaProvider(),
759+
UIA_SizeOfSetPropertyId,
760+
oldViewProps.accessibilitySetSize,
761+
newViewProps.accessibilitySetSize);
758762

759763
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
760-
m_uiaProvider,
764+
EnsureUiaProvider(),
761765
UIA_LiveSettingPropertyId,
762766
oldViewProps.accessibilityLiveRegion,
763767
newViewProps.accessibilityLiveRegion);
764768

765769
if ((oldViewProps.accessibilityState.has_value() && oldViewProps.accessibilityState->selected.has_value()) !=
766770
((newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->selected.has_value()))) {
767771
auto compProvider =
768-
m_uiaProvider.try_as<winrt::Microsoft::ReactNative::implementation::CompositionDynamicAutomationProvider>();
772+
EnsureUiaProvider()
773+
.try_as<winrt::Microsoft::ReactNative::implementation::CompositionDynamicAutomationProvider>();
769774
if (compProvider) {
770775
if ((newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->selected.has_value())) {
771776
winrt::Microsoft::ReactNative::implementation::AddSelectionItemsToContainer(compProvider.get());

vnext/Microsoft.ReactNative/Fabric/Composition/RootComponentView.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ void RootComponentView::updateLayoutMetrics(
7676
winrt::Microsoft::ReactNative::ComponentView RootComponentView::GetFocusedComponent() noexcept {
7777
return m_focusedComponent;
7878
}
79+
7980
void RootComponentView::SetFocusedComponent(const winrt::Microsoft::ReactNative::ComponentView &value) noexcept {
8081
if (m_focusedComponent == value)
8182
return;
@@ -90,11 +91,10 @@ void RootComponentView::SetFocusedComponent(const winrt::Microsoft::ReactNative:
9091
if (auto rootView = m_wkRootView.get()) {
9192
winrt::get_self<winrt::Microsoft::ReactNative::implementation::ReactNativeIsland>(rootView)->TrySetFocus();
9293
}
94+
m_focusedComponent = value;
9395
auto args = winrt::make<winrt::Microsoft::ReactNative::implementation::GotFocusEventArgs>(value);
9496
winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(value)->onGotFocus(args);
9597
}
96-
97-
m_focusedComponent = value;
9898
}
9999

100100
bool RootComponentView::NavigateFocus(const winrt::Microsoft::ReactNative::FocusNavigationRequest &request) noexcept {

vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1147,10 +1147,10 @@ void WindowsTextInputComponentView::OnTextUpdated() noexcept {
11471147
emitter->onChange(onChangeArgs);
11481148
}
11491149

1150-
if (m_uiaProvider) {
1150+
if (UiaClientsAreListening()) {
11511151
auto text = GetTextFromRichEdit();
11521152
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
1153-
m_uiaProvider, UIA_ValueValuePropertyId, text, text);
1153+
EnsureUiaProvider(), UIA_ValueValuePropertyId, text, text);
11541154
}
11551155
}
11561156

0 commit comments

Comments
 (0)