fix: announce selected state in accessibility label for Chrome+VoiceOver#87122
fix: announce selected state in accessibility label for Chrome+VoiceOver#87122Krishna2323 wants to merge 12 commits intoExpensify:mainfrom
Conversation
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b9ef27dbe9
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@codex review |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
Codex Review: Didn't find any major issues. Delightful! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@MelvinBot review this PR and confirm everything looks correct. |
|
I reviewed the diff and the surrounding code. Here's my assessment: Overall: The approach is correct and well-scoped. The fix addresses a real Chrome+macOS VoiceOver limitation where What looks good:
Minor observations (non-blocking):
No correctness issues found. The PR matches the testing plan described and should resolve Expensify/App#74875. |
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@MelvinBot review this PR and confirm everything looks correct. |
|
I reviewed this PR again — the diff is unchanged since my previous review and my assessment stands. Summary: The approach is correct. It works around Chromium bug #337904204 by appending a localized "selected" string to the accessibility label on Chrome desktop only. Multi-select lists, mobile Chrome, and Safari are properly excluded. CI status: All checks pass except the PR Author Checklist (which is manual) and a few jobs still pending. No code-related failures. No issues found — this is ready for human review. |
|
@MelvinBot I made some changes in 1b6458c |
|
Reviewed commit One issue: Everything else looks good:
|
…ed state Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
… selection state Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@MelvinBot I have changed the approach, review again. |
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
The approach changed significantly — instead of appending "selected" to the label via UA sniffing, you're now using Issues to address:
What looks good:
|
…ed for checkable roles Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 178743fb56
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
src/components/SelectionList/utils/getSelectableState/index.web.ts
Outdated
Show resolved
Hide resolved
|
@mkhutornyi Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
…me only Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@codex review |
|
Codex Review: Didn't find any major issues. Hooray! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
src/components/SelectionList/utils/getSelectableState/index.web.ts
Outdated
Show resolved
Hide resolved
|
Reviewed the latest diff. The dead code from my previous review ( Issues:
The approach itself is sound: adding Recommendation: simplify by removing the unnecessary |
|
Test 3: Arrow key navigation This also doesn't work on Chrome + VoiceOver. test3.movI think the testing is blocked by general bug on selectionlist, where each menu item is not selected at all by screen reader. |
|
@mkhutornyi test steps updated, try on "Language" page. |
|
iOS and android work fine. |
|
Still same on Language page Screen.Recording.2026-04-07.at.10.57.13.am.mov |
I can see it says "current item", there seems to be focus bug but the fix is working. |
|
I think we should fix focus bug to test Chrome+VoiceOver properly. |
|
@mkhutornyi I’m not sure if we should do that here—I don’t want to stretch this PR further. I’ve already spent a lot of effort investigating and finding a proper fix. @rushatgabhane what do you think? |
|
yes it's out of scope but I believe we should fix it separately. |
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@mkhutornyi bump |
|
I meant not handle in this PR but should still fix. Until then, maybe put this PR on hold. |
|
@mkhutornyi seems like it's fixed, can you check? Monosnap.screencast.2026-04-10.00-53-34.mp4 |
|
After fix, each item should be white-bordered. Still on list container from your video. Check safari for the expected behavior. |
|
@mkhutornyi the PR is about the label announcement, I haven't modified the UI so we shouldn't care about that. Or am I missing something? |
|
I don't say that this PR is something wrong. Just blocked testing |
|
I can approve right away but for me it doesn't make sense to merge without proper test since this PR aims to fix the exactly Chrome+VoiceOver issue. |

Explanation of Change
Fixed Issues
$ #74875
PROPOSAL:
Tests
Setup
https://dev.new.expensify.com:8082/Test 1: Selected item announces "selected" (Chrome + VoiceOver)
Cmd + F5)VO + Down ArroworTabTest 2: No double "selected" announcement (Safari + VoiceOver)
Cmd + F5)Test 3: Arrow key navigation
Test 4: Multi-select lists are unaffected
SelectionList(e.g., Settings > Workspaces > [workspace] > Members and use the select-all / checkbox mode)Test 5: Other single-select lists
Offline tests
QA Steps
Same as Tests
Verify that no errors appear in the JS console
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
android_native.mp4
Android: mWeb Chrome
android_mWeb.mp4
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
web_chrome_jaws.mp4
web_chrome_mac.mp4
web_chrome_nvda.mp4
web_safari_mac.mp4