Repository navigation
a11y: Map disabled/read-only semantics to AX node restriction - #190353
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
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
force-pushed
the
extract-axnode-restriction
branch
2 times, most recently
from
July 31, 2026 22:18
320162f to
9af819b
Compare
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
force-pushed
the
extract-axnode-restriction
branch
from
August 2, 2026 22:20
9af819b to
77db09c
Compare
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
10 tasks done
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
This was referenced Aug 4, 2026
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 ...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-assistbot 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.