Sitelet https://github.com/flutter/flutter/pull/190353
Skip to content

a11y: Map disabled/read-only semantics to AX node restriction - #190353

Merged
cbracken merged 1 commit into
flutter:masterfrom
cbracken:extract-axnode-restriction
Aug 3, 2026
Merged

cbracken merged 1 commit into
flutter:masterfrom
cbracken:extract-axnode-restriction

Conversation

@cbracken

@cbracken cbracken commented Jul 31, 2026 •

Copy link
Copy Markdown
Member

This is a partial re-land of
#184501, which just lands the common bridge code and tests as well as a macOS test for behaviour landed in landed in #190330.

This sets AXNodeData::SetRestriction() from the Flutter semantics flags: kDisabled when is_enabled is false, and kReadOnly for read-only text fields. Previously the restriction was never populated, so disabled and read-only nodes were indistinguishable from editable/enabled ones at the platform layer.

We also add a macOS regression test that checks that a disabled, editable text field is exposed as static text rather than a FlutterTextField.

This guards the !GetData().IsReadOnlyOrDisabled() check in FlutterPlatformNodeDelegateMac::Init. The GetData() override rewrites a disabled field's role to kStaticText but leaves kEditableRoot set, so IsTextField() stays true and the restriction check is what prevents an editable FlutterTextField from being created. I've added this in response to a bad comment by the Gemini review bot to ensure that this doesn't regress.

Issue: #184559

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance.

Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the gemini-code-assist bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.

@cbracken
cbracken requested a review from hannah-hyj July 31, 2026 15:22
@cbracken
cbracken requested a review from a team as a code owner July 31, 2026 15:22
@flutter-dashboard flutter-dashboard Bot added the CICD Run CI/CD label Jul 31, 2026
@github-actions github-actions Bot added engine flutter/engine related. See also e: labels. a: accessibility Accessibility, e.g. VoiceOver or TalkBack. (aka a11y) platform-macos Building on or for macOS specifically a: desktop Running on desktop team-macos Owned by the macOS platform team labels Jul 31, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request updates the accessibility bridge to set the restriction state of semantics nodes to disabled or read-only based on their flags, and adds corresponding unit tests. The review feedback points out that FlutterSemanticsNode2 structs in the new macOS test are declared without initialization, which can lead to undefined behavior, and suggests zero-initializing them.

@cbracken
cbracken force-pushed the extract-axnode-restriction branch 2 times, most recently from 320162f to 9af819b Compare July 31, 2026 22:18
This is a partial re-land of
flutter#184501, which just lands the
common bridge code and tests as well as a macOS test for behaviour
landed in landed in flutter#190330.

This sets AXNodeData::SetRestriction() from the Flutter semantics flags:
kDisabled when is_enabled is false, and kReadOnly for read-only text
fields. Previously the restriction was never populated, so disabled and
read-only nodes were indistinguishable from editable/enabled ones at the
platform layer.

We also add a macOS regression test that checks that a disabled,
editable text field is exposed as static text rather than a
FlutterTextField.

This guards the !GetData().IsReadOnlyOrDisabled() check in
FlutterPlatformNodeDelegateMac::Init. The GetData() override rewrites a
disabled field's role to kStaticText but leaves kEditableRoot set, so
IsTextField() stays true and the restriction check is what prevents an
editable FlutterTextField from being created. I've added this in
response to a bad comment by the Gemini review bot to ensure that this
doesn't regress.

Issue: flutter#184559
@cbracken
cbracken force-pushed the extract-axnode-restriction branch from 9af819b to 77db09c Compare August 2, 2026 22:20
@cbracken
cbracken requested a review from chunhtai August 3, 2026 00:42

@hannah-hyj hannah-hyj left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@cbracken
cbracken added this pull request to the merge queue Aug 3, 2026
Merged via the queue into flutter:master with commit 30c289b Aug 3, 2026
17 checks passed
@cbracken
cbracken deleted the extract-axnode-restriction branch August 3, 2026 21:11
cbracken added a commit to cbracken/flutter that referenced this pull request Aug 4, 2026
Relands flutter#184501, which was reverted in flutter#186492 because mapping read-only
text fields to Role::kTextField caused the macOS embedder to instantiate
a FlutterTextPlatformNode for them, producing detached accessibility
elements and test crashes.

The underlying macOS issue is now fixed by flutter#190330 and flutter#190353. This
relands the remaining bits of flutter#184501. In the common bits of the bridge,
read-only text fields now map to `Role::kTextField`. In the Windows
implementation `ENABLED_CHANGED` and `READONLY_CHANGED` are dispatched
as MSAA `kStateChanged` events and `AXPlatformNodeWin` now raises the
corresponding `UIA_IsEnabledPropertyId` change.

Issue: flutter#184559
cbracken added a commit to cbracken/flutter that referenced this pull request Aug 4, 2026
Relands flutter#184501, which was reverted in flutter#186492 because mapping read-only
text fields to Role::kTextField caused the macOS embedder to instantiate
a FlutterTextPlatformNode for them, producing detached accessibility
elements and test crashes.

The underlying macOS issue is now fixed by flutter#190330 and flutter#190353. This
relands the remaining bits of flutter#184501. In the common bits of the bridge,
read-only text fields now map to `Role::kTextField`. In the Windows
implementation `ENABLED_CHANGED` and `READONLY_CHANGED` are dispatched
as MSAA `kStateChanged` events and `AXPlatformNodeWin` now raises the
corresponding `UIA_IsEnabledPropertyId` change.

Issue: flutter#184559
pull Bot pushed a commit to AbhiShake1/flutter that referenced this pull request Aug 5, 2026
Relands flutter#184501, which was reverted in flutter#186492 because mapping read-only
text fields to Role::kTextField caused the macOS embedder to instantiate
a FlutterTextPlatformNode for them, producing detached accessibility
elements and test crashes.

The underlying macOS issue is now fixed by flutter#190330 and flutter#190353. This
relands the remaining bits of flutter#184501. In the common bits of the bridge,
read-only text fields now map to `Role::kTextField`. In the Windows
implementation `ENABLED_CHANGED` and `READONLY_CHANGED` are dispatched
as MSAA `kStateChanged` events and `AXPlatformNodeWin` now raises the
corresponding `UIA_IsEnabledPropertyId` change.

Fixes: flutter#184559


## Pre-launch Checklist

- [X] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [X] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Aug 10, 2026
…12406)

Manual roll Flutter from e52f01c920ad to b766512c65d8 (42 revisions)

Manual roll requested by stuartmorgan@google.com

flutter/flutter@e52f01c...b766512

2026-08-04 engine-flutter-autoroll@skia.org Roll Dart SDK from 2a799a2404e9 to 9859c0a39adb (4 revisions) (flutter/flutter#190521)
2026-08-04 154381524+flutteractionsbot@users.noreply.github.com Revert: iOS: Eliminate use of IOSContextNoop in platform view tests (flutter/flutter#190501)
2026-08-04 125822178+guszxtavo@users.noreply.github.com [Impeller] Enable ETC2/ASTC LDR/BC texture compression features at Vulkan device creation (flutter/flutter#189303)
2026-08-03 30870216+gaaclarke@users.noreply.github.com Remove openglessdf from impeller_unittests. (flutter/flutter#190469)
2026-08-03 1961493+harryterkelsen@users.noreply.github.com [web] Unify image decoding and codecs on CanvasKit and Skwasm (flutter/flutter#188573)
2026-08-03 chris@bracken.jp iOS: Eliminate use of IOSContextNoop in platform view tests (flutter/flutter#190419)
2026-08-03 evanwall@buffalo.edu Add path rendering benchmarks (flutter/flutter#188654)
2026-08-03 97480502+b-luk@users.noreply.github.com Add windows platform support for primitive_shape_test integration test (flutter/flutter#190464)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from 958c1c1921a1 to a08d918ebd6a (3 revisions) (flutter/flutter#190467)
2026-08-03 chris@bracken.jp tests: add --ios-runtime param (flutter/flutter#190414)
2026-08-03 chris@bracken.jp iOS: Remove the synchronous first-frame wait (flutter/flutter#190432)
2026-08-03 chris@bracken.jp iOS: Eliminate the Impeller/Skia backend selection params (flutter/flutter#190416)
2026-08-03 chris@bracken.jp iOS,macOS: Use @autoclosure in Logger (flutter/flutter#190417)
2026-08-03 chris@bracken.jp tools: Support FLUTTER_HOST_ARCH in update_dart_sdk scripts (flutter/flutter#190421)
2026-08-03 chris@bracken.jp iOS: Hardcode rendering API to Metal in tests (no-op) (flutter/flutter#190422)
2026-08-03 chris@bracken.jp a11y: Map disabled/read-only semantics to AX node restriction (flutter/flutter#190353)
2026-08-03 kevmoo@users.noreply.github.com [Infra] Replace defunct umbrella template with Wasm issue form (flutter/flutter#190471)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from abecb0dc02c1 to 958c1c1921a1 (4 revisions) (flutter/flutter#190459)
2026-08-03 engine-flutter-autoroll@skia.org Roll Dart SDK from 65b163be2485 to 2a799a2404e9 (3 revisions) (flutter/flutter#190454)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from 68efb3f2ad16 to abecb0dc02c1 (1 revision) (flutter/flutter#190443)
2026-08-03 engine-flutter-autoroll@skia.org Roll Packages from 5351d8c to ac87e65 (4 revisions) (flutter/flutter#190441)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from 5a761eb826c1 to 68efb3f2ad16 (1 revision) (flutter/flutter#190440)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from 4c9f8b4805e2 to 5a761eb826c1 (1 revision) (flutter/flutter#190437)
2026-08-03 ellie@edencrew.com [macOS] Resume app lifecycle on becomeActive to avoid frozen UI after occlusion (flutter/flutter#188772)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from 39cda9d6d7d2 to 4c9f8b4805e2 (6 revisions) (flutter/flutter#190426)
2026-08-03 engine-flutter-autoroll@skia.org Roll Skia from df13bfb5a54e to 39cda9d6d7d2 (2 revisions) (flutter/flutter#190425)
2026-08-02 chris@bracken.jp iOS: Serialise CADisplayLink access in VSyncClient tests (flutter/flutter#190335)
2026-08-02 engine-flutter-autoroll@skia.org Roll Skia from 32329e5643b5 to df13bfb5a54e (1 revision) (flutter/flutter#190394)
2026-08-02 bdero@google.com [Impeller] Skip binding dead-code-eliminated resources on Metal (flutter/flutter#190040)
2026-08-01 bdero@google.com [Flutter GPU] Raise Dart errors for invalid render pipelines and memoize per-draw pipeline state (flutter/flutter#189899)
2026-08-01 41930132+hellohuanlin@users.noreply.github.com Revert "Improve non rect platform view rendering  (#182662)" (flutter/flutter#190003)
2026-08-01 engine-flutter-autoroll@skia.org Roll Skia from ebf50520d720 to 32329e5643b5 (1 revision) (flutter/flutter#190389)
2026-08-01 engine-flutter-autoroll@skia.org Roll Skia from f73c4510d12d to ebf50520d720 (6 revisions) (flutter/flutter#190376)
2026-07-31 97480502+b-luk@users.noreply.github.com Primitive shape integration test (flutter/flutter#190368)
2026-07-31 97480502+b-luk@users.noreply.github.com Eliminate some early returns in uber_sdf.frag to fix broken UberSDF AA on Windows (flutter/flutter#190260)
2026-07-31 codefu@google.com chore: swiftshader mirrored + llvm16 (flutter/flutter#181225)
2026-07-31 1961493+harryterkelsen@users.noreply.github.com [web] Remove in-repo agent documentation (flutter/flutter#190326)
2026-07-31 30870216+gaaclarke@users.noreply.github.com [windows]: Uses offscreen MSAA when implicit msaa isn't available. (flutter/flutter#190256)
2026-07-31 srawlins@google.com flutter_tools: Use new FileSystemExtension from devtools (flutter/flutter#190360)
2026-07-31 engine-flutter-autoroll@skia.org Roll Dart SDK from c3acfc2479f6 to 65b163be2485 (1 revision) (flutter/flutter#190358)
2026-07-31 magder@google.com Use devicectl for screenshots on Xcode 27, remove idevicescreenshot artifact (flutter/flutter#189091)
2026-07-31 engine-flutter-autoroll@skia.org Roll Skia from 7ef86a5b0eb9 to f73c4510d12d (1 revision) (flutter/flutter#190352)

If this roll has caused a breakage, revert this CL and stop the roller
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a: accessibility Accessibility, e.g. VoiceOver or TalkBack. (aka a11y) a: desktop Running on desktop CICD Run CI/CD engine flutter/engine related. See also e: labels. platform-macos Building on or for macOS specifically team-macos Owned by the macOS platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants