Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement ISelectionProvider and ISelectionItemProvider #14019

Merged
merged 24 commits into from
Dec 17, 2024

Conversation

chiaramooney
Copy link
Contributor

@chiaramooney chiaramooney commented Oct 22, 2024

Description

Type of Change

  • New feature (non-breaking change which adds functionality)

Why

Accessibility on the new architecture should reach parity with Paper.

Resolves #13064
Resolves #13060
Resolves #13056
Resolves #13052
Resolves #13048
Resolves #13044
Resolves #13040
Resolves #13036
Resolves #13032
Resolves #12047
#13327
#13316

Resolves #13354
Resolves #13353

What

  • Adds support for ISelectionProvider interface
  • Adds support for ISelectionItemProvider interface
  • Adds support for accessibilityState:selected
  • Adjusts AccessibilityState native type on Windows to be std::optional instead of bool
  • Adjusts AccessibilityState native type on Windows to include multiselectable and required fields of type std::optional
  • Adds multiselectable and required fields to AccessibilityState type in JS with type boolean | undefined
  • Adds support for aria-multiselectable and aria-required.
  • Adds support for the following accessibilityActions: addToSelection, removeFromSelection, select
  • Fixes crash in AccessibilityInsights.

Testing

Locally tested for:

  • ISelectionItemProvider: AddToSelection, RemoveFrommSelection, Select, get_IsSelected, get_SelectionContainer
  • ISelectionProvider:  GetSelection, get_CanSelectMultiple, get_IsSelectionRequired
  • Parent as selection container, Non-parent ancestor as selection container
  • Adding/Removing SelectionItem from the Visual Tree
  • Adding/Removing SelectionContainer from Visual Tree
  • Calling addToSelection, removeFromSelection, and select accessibilityActions
  • Adjusting values of accessibilityState multiselectable and required
  • Child views that aren't selectable items
  • Selection of multiple items

Changelog

Should this change be included in the release notes: Yes

@chiaramooney chiaramooney requested a review from a team as a code owner October 22, 2024 23:32
Copy link
Contributor

@danielayala94 danielayala94 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I didn't understand when and what should be addRef'd. If you can provide some clarity here, it would be helpful.

My sincere advice here is to move into smart pointers. Then, there won't be a need to manually manage memory for each and every object. In Windows, we rely on the winrt library (see winrt::com_ptr) to work with COM interfaces.

https://learn.microsoft.com/en-us/uwp/cpp-ref-for-winrt/com-ptr
https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/consume-com

@chiaramooney
Copy link
Contributor Author

In general, I didn't understand when and what should be addRef'd. If you can provide some clarity here, it would be helpful.

My sincere advice here is to move into smart pointers. Then, there won't be a need to manually manage memory for each and every object. In Windows, we rely on the winrt library (see winrt::com_ptr) to work with COM interfaces.

https://learn.microsoft.com/en-us/uwp/cpp-ref-for-winrt/com-ptr https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/consume-com

So unfortunately the methods here are defined by UIA (we are just adding implementations for them) so I can't change the type values of the IRawElementProviderFragment** types in most cases.

My understanding is if we are returning a reference to an object then we need to AddRef so the object is not destroyed prematurely. In the cases when we don't add AddRef but it is needed the app will crash when the program executes.

@chiaramooney chiaramooney requested a review from a team as a code owner December 11, 2024 19:43

struct AccessibilityState {
bool disabled{false};
std::optional<bool> selected{std::nullopt}; // [Windows] - Do not remove; required for Windows ISelectionItemProvider Implementation
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will these ever get upstreamed? Are the new props actually from aria?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hard to say. I will file an issue to request they get upstreamed but it seems RN only decided to implement a subset of the aria props. The new props are real aria props. Meta just hasn't integrated them into the platform. Maybe they aren't needed for accessibility on mobile?

Copy link
Contributor

@danielayala94 danielayala94 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@chiaramooney chiaramooney merged commit 3388c98 into microsoft:main Dec 17, 2024
59 checks passed
@chiaramooney chiaramooney deleted the cm-selection-provider branch December 17, 2024 18:07
acoates-ms pushed a commit to acoates-ms/react-native-windows that referenced this pull request Jan 10, 2025
)

Adds support for ISelectionProvider interface
Adds support for ISelectionItemProvider interface
Adds support for accessibilityState:selected
Adjusts AccessibilityState native type on Windows to be std::optional instead of bool
Adjusts AccessibilityState native type on Windows to include multiselectable and required fields of type std::optional
Adds multiselectable and required fields to AccessibilityState type in JS with type boolean | undefined
Adds support for aria-multiselectable and aria-required.
Adds support for the following accessibilityActions: addToSelection, removeFromSelection, select
Fixes crash in AccessibilityInsights.
acoates-ms added a commit that referenced this pull request Jan 13, 2025
)

* Implement ISelectionProvider and ISelectionItemProvider (#14019)

Adds support for ISelectionProvider interface
Adds support for ISelectionItemProvider interface
Adds support for accessibilityState:selected
Adjusts AccessibilityState native type on Windows to be std::optional instead of bool
Adjusts AccessibilityState native type on Windows to include multiselectable and required fields of type std::optional
Adds multiselectable and required fields to AccessibilityState type in JS with type boolean | undefined
Adds support for aria-multiselectable and aria-required.
Adds support for the following accessibilityActions: addToSelection, removeFromSelection, select
Fixes crash in AccessibilityInsights.

* [Fabric] Implement IRangeValueProvider and Adjust IValueProvider Implementation (#14212)

* IRangeValue Provider

* Adjust ReadOnly to Use Prop Value

* Complete IRangeValueProvider Implementation

* Change files

* Update Snapshots

* Rework modal to be implemented entirely using public APIs (#14256)

* Rework modal implementation to use public APIs

* shutdown fix

* Change files

* format

* remove dead code

* format

* fixes

* fix

* UIA tree for root component should be kept distinct from main UIA tree

* input offset fix for sub rootviews

* Split modal into two componentview's so that we dont have multiple roots in our componentview tree

* format

* Ensure rootview removes itself from the island, before a new one adds itself on instance reload

* defork some modal test pages

* remove override

* fix

* fix

* snapshots

---------

Co-authored-by: Chiara Mooney <34109996+chiaramooney@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: Accessibility Area: ActivityIndicator Area: Component Views Area: Fabric Support Facebook Fabric Area: Image Area: Modal Area: RefreshControl Area: ScrollView Area: Slider Area: Switch Area: Text Area: TextInput Area: View Props https://reactnative.dev/docs/view#props Area: View New Architecture Broad category for issues that apply to the RN "new" architecture of Turbo Modules + Fabric Parity: Fabric vs. Paper RNW Fabric does not look or behave like RNW Paper
Projects
None yet
5 participants