Skip to content

Commit e3b41f8

Browse files
authored
[Fabric] Fix Bug in Narrator Navigation (#14498)
* Fix Narrator Bug * Change files * Revert Codegen Changes
1 parent 5959d3a commit e3b41f8

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
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

Lines changed: 22 additions & 17 deletions
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>
@@ -331,9 +332,9 @@ void ComponentView::onLostFocus(
331332

332333
m_componentHostingFocusVisual->hostFocusVisual(false, get_strong());
333334
}
334-
if (m_uiaProvider) {
335+
if (UiaClientsAreListening()) {
335336
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
336-
m_uiaProvider, UIA_HasKeyboardFocusPropertyId, true, false);
337+
EnsureUiaProvider(), UIA_HasKeyboardFocusPropertyId, true, false);
337338
}
338339
}
339340
base_type::onLostFocus(args);
@@ -381,8 +382,8 @@ void ComponentView::onGotFocus(
381382
focusRect.size.height += (FOCUS_VISUAL_WIDTH * 2);
382383
focusVisualRoot(focusRect)->hostFocusVisual(true, get_strong());
383384
}
384-
if (m_uiaProvider) {
385-
auto spProviderSimple = m_uiaProvider.try_as<IRawElementProviderSimple>();
385+
if (UiaClientsAreListening()) {
386+
auto spProviderSimple = EnsureUiaProvider().try_as<IRawElementProviderSimple>();
386387
if (spProviderSimple != nullptr) {
387388
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
388389
m_uiaProvider, UIA_HasKeyboardFocusPropertyId, false, true);
@@ -743,67 +744,71 @@ void ComponentView::updateTransformProps(
743744
void ComponentView::updateAccessibilityProps(
744745
const facebook::react::ViewProps &oldViewProps,
745746
const facebook::react::ViewProps &newViewProps) noexcept {
746-
if (!m_uiaProvider)
747+
if (!UiaClientsAreListening())
747748
return;
748749

749750
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
750-
m_uiaProvider, UIA_IsKeyboardFocusablePropertyId, oldViewProps.focusable, newViewProps.focusable);
751+
EnsureUiaProvider(), UIA_IsKeyboardFocusablePropertyId, oldViewProps.focusable, newViewProps.focusable);
751752

752753
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
753-
m_uiaProvider,
754+
EnsureUiaProvider(),
754755
UIA_NamePropertyId,
755756
oldViewProps.accessibilityLabel,
756757
newViewProps.accessibilityLabel.empty() ? DefaultAccessibleName() : newViewProps.accessibilityLabel);
757758

758759
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
759-
m_uiaProvider,
760+
EnsureUiaProvider(),
760761
UIA_IsContentElementPropertyId,
761762
(oldViewProps.accessible && oldViewProps.accessibilityRole != "none"),
762763
(newViewProps.accessible && newViewProps.accessibilityRole != "none"));
763764

764765
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
765-
m_uiaProvider,
766+
EnsureUiaProvider(),
766767
UIA_IsControlElementPropertyId,
767768
(oldViewProps.accessible && oldViewProps.accessibilityRole != "none"),
768769
(newViewProps.accessible && newViewProps.accessibilityRole != "none"));
769770

770771
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
771-
m_uiaProvider,
772+
EnsureUiaProvider(),
772773
UIA_IsEnabledPropertyId,
773774
!(oldViewProps.accessibilityState && oldViewProps.accessibilityState->disabled),
774775
!(newViewProps.accessibilityState && newViewProps.accessibilityState->disabled));
775776

776777
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
777-
m_uiaProvider,
778+
EnsureUiaProvider(),
778779
UIA_IsEnabledPropertyId,
779780
!(oldViewProps.accessibilityState && oldViewProps.accessibilityState->busy),
780781
!(newViewProps.accessibilityState && newViewProps.accessibilityState->busy));
781782

782783
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
783-
m_uiaProvider, UIA_ControlTypePropertyId, oldViewProps.accessibilityRole, newViewProps.accessibilityRole);
784+
EnsureUiaProvider(), UIA_ControlTypePropertyId, oldViewProps.accessibilityRole, newViewProps.accessibilityRole);
784785

785786
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
786-
m_uiaProvider, UIA_HelpTextPropertyId, oldViewProps.accessibilityHint, newViewProps.accessibilityHint);
787+
EnsureUiaProvider(), UIA_HelpTextPropertyId, oldViewProps.accessibilityHint, newViewProps.accessibilityHint);
787788

788789
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
789-
m_uiaProvider,
790+
EnsureUiaProvider(),
790791
UIA_PositionInSetPropertyId,
791792
oldViewProps.accessibilityPosInSet,
792793
newViewProps.accessibilityPosInSet);
793794

794795
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
795-
m_uiaProvider, UIA_SizeOfSetPropertyId, oldViewProps.accessibilitySetSize, newViewProps.accessibilitySetSize);
796+
EnsureUiaProvider(),
797+
UIA_SizeOfSetPropertyId,
798+
oldViewProps.accessibilitySetSize,
799+
newViewProps.accessibilitySetSize);
796800

797801
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
798-
m_uiaProvider,
802+
EnsureUiaProvider(),
799803
UIA_LiveSettingPropertyId,
800804
oldViewProps.accessibilityLiveRegion,
801805
newViewProps.accessibilityLiveRegion);
802806

803807
if ((oldViewProps.accessibilityState.has_value() && oldViewProps.accessibilityState->selected.has_value()) !=
804808
((newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->selected.has_value()))) {
805809
auto compProvider =
806-
m_uiaProvider.try_as<winrt::Microsoft::ReactNative::implementation::CompositionDynamicAutomationProvider>();
810+
EnsureUiaProvider()
811+
.try_as<winrt::Microsoft::ReactNative::implementation::CompositionDynamicAutomationProvider>();
807812
if (compProvider) {
808813
if ((newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->selected.has_value())) {
809814
winrt::Microsoft::ReactNative::implementation::AddSelectionItemsToContainer(compProvider.get());

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

Lines changed: 2 additions & 2 deletions
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(
8081
const winrt::Microsoft::ReactNative::ComponentView &value,
8182
winrt::Microsoft::ReactNative::FocusNavigationDirection direction) noexcept {
@@ -92,11 +93,10 @@ void RootComponentView::SetFocusedComponent(
9293
if (auto rootView = m_wkRootView.get()) {
9394
winrt::get_self<winrt::Microsoft::ReactNative::implementation::ReactNativeIsland>(rootView)->TrySetFocus();
9495
}
96+
m_focusedComponent = value;
9597
auto args = winrt::make<winrt::Microsoft::ReactNative::implementation::GotFocusEventArgs>(value, direction);
9698
winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(value)->onGotFocus(args);
9799
}
98-
99-
m_focusedComponent = value;
100100
}
101101

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,10 +1159,10 @@ void WindowsTextInputComponentView::OnTextUpdated() noexcept {
11591159
emitter->onChange(onChangeArgs);
11601160
}
11611161

1162-
if (m_uiaProvider) {
1162+
if (UiaClientsAreListening()) {
11631163
auto text = GetTextFromRichEdit();
11641164
winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty(
1165-
m_uiaProvider, UIA_ValueValuePropertyId, text, text);
1165+
EnsureUiaProvider(), UIA_ValueValuePropertyId, text, text);
11661166
}
11671167
}
11681168

0 commit comments

Comments
 (0)