Skip to content

Conversation

@flutter-zl
Copy link
Contributor

@flutter-zl flutter-zl commented Jul 8, 2025

Description
This PR fixes an accessibility issue where CheckedPopupMenuItem was not properly announcing its checked state to screen readers.

Before
https://github.com/user-attachments/assets/b1785522-eea4-4fc3-9a9a-1872615838c0

After
Demo app: https://checked-0707.web.app/
https://github.com/user-attachments/assets/a8083c0b-11c8-4e93-bd71-842dfe5fa344

Issues Fixed
This PR fixes #171463.

Breaking Changes
None.

Pre-launch Checklist

  • I read the [Contributor Guide] and followed the process outlined there for submitting PRs.
  • I read the [Tree Hygiene] wiki page, which explains my responsibilities.
  • I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement].
  • I signed the [CLA].
  • I listed at least one issue that this PR fixes in the description above.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is [test-exempt].
  • I followed the [breaking change policy] and added [Data Driven Fixes] where supported.
  • All existing and new tests are passing.

…ntics and exposing checked state to screen readers
@github-actions github-actions bot added framework flutter/packages/flutter repository. See also f: labels. f: material design flutter/packages/flutter/material repository. labels Jul 8, 2025
@flutter-zl flutter-zl requested a review from mdebbar July 8, 2025 17:00
@flutter-zl flutter-zl marked this pull request as ready for review July 8, 2025 17:00
Comment on lines 612 to 620
final Widget parentWidget = super.build(context);

assert(parentWidget is MergeSemantics, 'Expected MergeSemantics from parent build method');
final MergeSemantics mergeSemantics = parentWidget as MergeSemantics;

assert(mergeSemantics.child is Semantics, 'Expected Semantics as child of MergeSemantics');
final Semantics parentSemantics = mergeSemantics.child! as Semantics;

final Widget innerContent = parentSemantics.child!;
Copy link
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky. What do you think about doing it like this: 389f17c

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Great suggestion. I created a new PR: #171994.

@flutter-zl flutter-zl closed this Jul 11, 2025
@flutter-zl flutter-zl reopened this Jul 11, 2025
@flutter-zl flutter-zl changed the title Fix CheckedPopupMenuItem accessibility by using menuItemCheckbox semantics and exposing checked state Fix CheckedPopupMenuItem semantics to use menuItemCheckbox role with checked state Jul 11, 2025
Copy link
Contributor

@mdebbar mdebbar left a comment

Choose a reason for hiding this comment

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

LGTM with some suggestions for tests.

(SemanticsNode node) => node.getSemanticsData().hasFlag(SemanticsFlag.isChecked),
);
expect(checkedNode.getSemanticsData().hasFlag(SemanticsFlag.hasCheckedState), isTrue);
expect(checkedNode.getSemanticsData().hasFlag(SemanticsFlag.isChecked), isTrue);
Copy link
Contributor

Choose a reason for hiding this comment

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

We are already filtering the nodes by SemanticsFlag.isChecked, so there's no reason to check again for it.

Comment on lines 1641 to 1644
final SemanticsNode checkedNode = menuItemNodes.firstWhere(
(SemanticsNode node) => node.getSemanticsData().hasFlag(SemanticsFlag.isChecked),
);
expect(checkedNode.getSemanticsData().hasFlag(SemanticsFlag.hasCheckedState), isTrue);
Copy link
Contributor

Choose a reason for hiding this comment

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

Check for role and button too?

…ce popup menu test coverage with comprehensive semantic property verification
@flutter-zl flutter-zl enabled auto-merge July 11, 2025 21:42
@flutter-zl flutter-zl added this pull request to the merge queue Jul 11, 2025
Merged via the queue into flutter:master with commit 7015afc Jul 11, 2025
71 checks passed
@flutter-zl flutter-zl deleted the check_0707 branch July 11, 2025 22:32
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jul 12, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Jul 12, 2025
Roll Flutter from 43657f3 to 35f197f (39 revisions)

flutter/flutter@43657f3...35f197f

2025-07-12 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from 8aoEy1hp2a9HI1pt-... to xQlbHCUI33kDvkew8... (flutter/flutter#172060)
2025-07-12 dkwingsmt@users.noreply.github.com Add RSuperellipse support to Web (global cache) (flutter/flutter#171489)
2025-07-12 87506348+jingshao-code@users.noreply.github.com Fix grammar: Change 'A' to 'An' before IOSSystemContextMenuItemData (flutter/flutter#172019)
2025-07-11 jason-simmons@users.noreply.github.com Manual roll Dart to b21dca1b89ff (flutter/flutter#172038)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from 2ea2ba09ef85 to 92354f64e37f (1 revision) (flutter/flutter#172039)
2025-07-11 zhongliu88889@gmail.com Fix CheckedPopupMenuItem semantics to use menuItemCheckbox role with checked state (flutter/flutter#171749)
2025-07-11 30870216+gaaclarke@users.noreply.github.com adds gemini.md to `engine` and `licenses_cpp` (flutter/flutter#172022)
2025-07-11 737941+loic-sharma@users.noreply.github.com [Web] Implement disabling interactive selection (flutter/flutter#171935)
2025-07-11 737941+loic-sharma@users.noreply.github.com [tool] Make google3 have to override feature flags (flutter/flutter#171933)
2025-07-11 30870216+gaaclarke@users.noreply.github.com License cpp 710 (flutter/flutter#171989)
2025-07-11 muhatashim@google.com add content description to tooltip-only nodes for android (flutter/flutter#171541)
2025-07-11 jhy03261997@gmail.com [Web a11y]Update table cell to use LabelRepresentation.sizedSpan  (flutter/flutter#172013)
2025-07-11 bkonyi@google.com [ Tool ] Enable `omit_obvious_*_types` and `specify_nonobvious_*_types` lints (flutter/flutter#172018)
2025-07-11 zhongliu88889@gmail.com Add SemanticsLabelBuilder for Accessible Label Concatenation (flutter/flutter#171683)
2025-07-11 15619084+vashworth@users.noreply.github.com Run tests on either macOS 14 or 15 (flutter/flutter#171076)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from db1a5550c848 to 2ea2ba09ef85 (1 revision) (flutter/flutter#172017)
2025-07-11 dkwingsmt@users.noreply.github.com [Cupertino] Make some widgets no longer use RSuperellipse (flutter/flutter#171830)
2025-07-11 jason-simmons@users.noreply.github.com Detach the resource context from the IO thread only if the shell's IO manager is no longer being used by any other spawned shells (flutter/flutter#171554)
2025-07-11 30870216+gaaclarke@users.noreply.github.com Started querying the app state for the gpu disabled sync switch (flutter/flutter#171785)
2025-07-11 30870216+gaaclarke@users.noreply.github.com License_cpp 7/02 (flutter/flutter#171558)
2025-07-11 sokolovskyi.konstantin@gmail.com [web] Refactor clipboard. (flutter/flutter#171427)
2025-07-11 matanlurey@users.noreply.github.com Require 64-bit Windows (flutter/flutter#171925)
2025-07-11 mdebbar@google.com Run hot_reload_with_asset_web_test.dart on Mac/Windows (flutter/flutter#171280)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from da7e3eae7c2b to db1a5550c848 (2 revisions) (flutter/flutter#171999)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from 26571c3b1771 to da7e3eae7c2b (2 revisions) (flutter/flutter#171997)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from 34a40032ff0a to 26571c3b1771 (1 revision) (flutter/flutter#171995)
2025-07-11 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from lO64ePNEGrGzs-MFC... to 8aoEy1hp2a9HI1pt-... (flutter/flutter#171993)
2025-07-10 pranav072bex@ioepc.edu.np Remove redundant ThemeData(useMaterial3: true) from tests (flutter/flutter#171569)
2025-07-10 jessiewong401@gmail.com [Android 16] Updated linux_android_emu to a 36 AVD in framework CI (flutter/flutter#169121)
2025-07-10 87506348+jingshao-code@users.noreply.github.com [iOS] Add Live Text option to system context menu (flutter/flutter#170969)
2025-07-10 engine-flutter-autoroll@skia.org Roll Skia from dc3da09ca905 to 34a40032ff0a (1 revision) (flutter/flutter#171982)
2025-07-10 pedromassango.developer@gmail.com feat: Expose FocusNode of FocusTraversalGroup (flutter/flutter#171979)
2025-07-10 alex.medinsh@gmail.com `CupertinoDatePicker` and `CupertinoTimerPicker` new onChanged behavior (flutter/flutter#170793)
2025-07-10 jason-simmons@users.noreply.github.com Manual roll Dart SDK from 8d69b07b9d9d to 07ea3aaaadf0 (32 revisions) (flutter/flutter#171969)
2025-07-10 34465683+rkishan516@users.noreply.github.com Style: Rename pageBuilder with builder in showCupertinoSheet (flutter/flutter#170625)
2025-07-10 engine-flutter-autoroll@skia.org Roll Skia from bdb8bfcde7f3 to dc3da09ca905 (3 revisions) (flutter/flutter#171971)
2025-07-10 34465683+rkishan516@users.noreply.github.com Feat: Add foreground color for cupertino button (flutter/flutter#170898)
2025-07-10 engine-flutter-autoroll@skia.org Roll Skia from 0fef076beec3 to bdb8bfcde7f3 (34 revisions) (flutter/flutter#171964)
2025-07-10 mdebbar@google.com Run stateless_stateful_hot_reload_web_test.dart on Mac/Windows (flutter/flutter#171283)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
Please CC louisehsu@google.com,stuartmorgan@google.com on the revert to ensure that a human
is aware of the problem.

...
azatech pushed a commit to azatech/flutter that referenced this pull request Jul 28, 2025
…checked state (flutter#171749)

Description
This PR fixes an accessibility issue where CheckedPopupMenuItem was not
properly announcing its checked state to screen readers.

Before

https://github.com/user-attachments/assets/b1785522-eea4-4fc3-9a9a-1872615838c0

After
Demo app: https://checked-0707.web.app/

https://github.com/user-attachments/assets/a8083c0b-11c8-4e93-bd71-842dfe5fa344

Issues Fixed
This PR fixes flutter#171463. 

Breaking Changes
None.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
vashworth pushed a commit to vashworth/packages that referenced this pull request Jul 30, 2025
Roll Flutter from 43657f3 to 35f197f (39 revisions)

flutter/flutter@43657f3...35f197f

2025-07-12 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from 8aoEy1hp2a9HI1pt-... to xQlbHCUI33kDvkew8... (flutter/flutter#172060)
2025-07-12 dkwingsmt@users.noreply.github.com Add RSuperellipse support to Web (global cache) (flutter/flutter#171489)
2025-07-12 87506348+jingshao-code@users.noreply.github.com Fix grammar: Change 'A' to 'An' before IOSSystemContextMenuItemData (flutter/flutter#172019)
2025-07-11 jason-simmons@users.noreply.github.com Manual roll Dart to b21dca1b89ff (flutter/flutter#172038)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from 2ea2ba09ef85 to 92354f64e37f (1 revision) (flutter/flutter#172039)
2025-07-11 zhongliu88889@gmail.com Fix CheckedPopupMenuItem semantics to use menuItemCheckbox role with checked state (flutter/flutter#171749)
2025-07-11 30870216+gaaclarke@users.noreply.github.com adds gemini.md to `engine` and `licenses_cpp` (flutter/flutter#172022)
2025-07-11 737941+loic-sharma@users.noreply.github.com [Web] Implement disabling interactive selection (flutter/flutter#171935)
2025-07-11 737941+loic-sharma@users.noreply.github.com [tool] Make google3 have to override feature flags (flutter/flutter#171933)
2025-07-11 30870216+gaaclarke@users.noreply.github.com License cpp 710 (flutter/flutter#171989)
2025-07-11 muhatashim@google.com add content description to tooltip-only nodes for android (flutter/flutter#171541)
2025-07-11 jhy03261997@gmail.com [Web a11y]Update table cell to use LabelRepresentation.sizedSpan  (flutter/flutter#172013)
2025-07-11 bkonyi@google.com [ Tool ] Enable `omit_obvious_*_types` and `specify_nonobvious_*_types` lints (flutter/flutter#172018)
2025-07-11 zhongliu88889@gmail.com Add SemanticsLabelBuilder for Accessible Label Concatenation (flutter/flutter#171683)
2025-07-11 15619084+vashworth@users.noreply.github.com Run tests on either macOS 14 or 15 (flutter/flutter#171076)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from db1a5550c848 to 2ea2ba09ef85 (1 revision) (flutter/flutter#172017)
2025-07-11 dkwingsmt@users.noreply.github.com [Cupertino] Make some widgets no longer use RSuperellipse (flutter/flutter#171830)
2025-07-11 jason-simmons@users.noreply.github.com Detach the resource context from the IO thread only if the shell's IO manager is no longer being used by any other spawned shells (flutter/flutter#171554)
2025-07-11 30870216+gaaclarke@users.noreply.github.com Started querying the app state for the gpu disabled sync switch (flutter/flutter#171785)
2025-07-11 30870216+gaaclarke@users.noreply.github.com License_cpp 7/02 (flutter/flutter#171558)
2025-07-11 sokolovskyi.konstantin@gmail.com [web] Refactor clipboard. (flutter/flutter#171427)
2025-07-11 matanlurey@users.noreply.github.com Require 64-bit Windows (flutter/flutter#171925)
2025-07-11 mdebbar@google.com Run hot_reload_with_asset_web_test.dart on Mac/Windows (flutter/flutter#171280)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from da7e3eae7c2b to db1a5550c848 (2 revisions) (flutter/flutter#171999)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from 26571c3b1771 to da7e3eae7c2b (2 revisions) (flutter/flutter#171997)
2025-07-11 engine-flutter-autoroll@skia.org Roll Skia from 34a40032ff0a to 26571c3b1771 (1 revision) (flutter/flutter#171995)
2025-07-11 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from lO64ePNEGrGzs-MFC... to 8aoEy1hp2a9HI1pt-... (flutter/flutter#171993)
2025-07-10 pranav072bex@ioepc.edu.np Remove redundant ThemeData(useMaterial3: true) from tests (flutter/flutter#171569)
2025-07-10 jessiewong401@gmail.com [Android 16] Updated linux_android_emu to a 36 AVD in framework CI (flutter/flutter#169121)
2025-07-10 87506348+jingshao-code@users.noreply.github.com [iOS] Add Live Text option to system context menu (flutter/flutter#170969)
2025-07-10 engine-flutter-autoroll@skia.org Roll Skia from dc3da09ca905 to 34a40032ff0a (1 revision) (flutter/flutter#171982)
2025-07-10 pedromassango.developer@gmail.com feat: Expose FocusNode of FocusTraversalGroup (flutter/flutter#171979)
2025-07-10 alex.medinsh@gmail.com `CupertinoDatePicker` and `CupertinoTimerPicker` new onChanged behavior (flutter/flutter#170793)
2025-07-10 jason-simmons@users.noreply.github.com Manual roll Dart SDK from 8d69b07b9d9d to 07ea3aaaadf0 (32 revisions) (flutter/flutter#171969)
2025-07-10 34465683+rkishan516@users.noreply.github.com Style: Rename pageBuilder with builder in showCupertinoSheet (flutter/flutter#170625)
2025-07-10 engine-flutter-autoroll@skia.org Roll Skia from bdb8bfcde7f3 to dc3da09ca905 (3 revisions) (flutter/flutter#171971)
2025-07-10 34465683+rkishan516@users.noreply.github.com Feat: Add foreground color for cupertino button (flutter/flutter#170898)
2025-07-10 engine-flutter-autoroll@skia.org Roll Skia from 0fef076beec3 to bdb8bfcde7f3 (34 revisions) (flutter/flutter#171964)
2025-07-10 mdebbar@google.com Run stateless_stateful_hot_reload_web_test.dart on Mac/Windows (flutter/flutter#171283)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
Please CC louisehsu@google.com,stuartmorgan@google.com on the revert to ensure that a human
is aware of the problem.

...
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 15, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 15, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 16, 2025
ksokolovskyi pushed a commit to ksokolovskyi/flutter that referenced this pull request Aug 19, 2025
…checked state (flutter#171749)

Description
This PR fixes an accessibility issue where CheckedPopupMenuItem was not
properly announcing its checked state to screen readers.

Before

https://github.com/user-attachments/assets/b1785522-eea4-4fc3-9a9a-1872615838c0

After
Demo app: https://checked-0707.web.app/

https://github.com/user-attachments/assets/a8083c0b-11c8-4e93-bd71-842dfe5fa344

Issues Fixed
This PR fixes flutter#171463. 

Breaking Changes
None.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
mboetger pushed a commit to mboetger/flutter that referenced this pull request Sep 18, 2025
…checked state (flutter#171749)

Description
This PR fixes an accessibility issue where CheckedPopupMenuItem was not
properly announcing its checked state to screen readers.

Before

https://github.com/user-attachments/assets/b1785522-eea4-4fc3-9a9a-1872615838c0

After
Demo app: https://checked-0707.web.app/

https://github.com/user-attachments/assets/a8083c0b-11c8-4e93-bd71-842dfe5fa344

Issues Fixed
This PR fixes flutter#171463. 

Breaking Changes
None.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
lucaantonelli pushed a commit to lucaantonelli/flutter that referenced this pull request Nov 21, 2025
…checked state (flutter#171749)

Description
This PR fixes an accessibility issue where CheckedPopupMenuItem was not
properly announcing its checked state to screen readers.

Before

https://github.com/user-attachments/assets/b1785522-eea4-4fc3-9a9a-1872615838c0

After
Demo app: https://checked-0707.web.app/

https://github.com/user-attachments/assets/a8083c0b-11c8-4e93-bd71-842dfe5fa344

Issues Fixed
This PR fixes flutter#171463. 

Breaking Changes
None.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Google3 Bug][A11Y]: CheckedPopupMenuItem does not read as "selected" with screenreader

2 participants