Unverified Commit da489c33 authored by Nolan Scobie's avatar Nolan Scobie Committed by GitHub

Tweaking Material Chip a11y semantics to match buttons (#60141)

parent 3ce26910
...@@ -1944,9 +1944,10 @@ class _RawChipState extends State<RawChip> with TickerProviderStateMixin<RawChip ...@@ -1944,9 +1944,10 @@ class _RawChipState extends State<RawChip> with TickerProviderStateMixin<RawChip
), ),
); );
return Semantics( return Semantics(
button: widget.tapEnabled,
container: true, container: true,
selected: widget.selected, selected: widget.selected,
enabled: canTap ? widget.isEnabled : null, enabled: widget.tapEnabled ? canTap : null,
child: result, child: result,
); );
} }
......
...@@ -1624,6 +1624,10 @@ void main() { ...@@ -1624,6 +1624,10 @@ void main() {
TestSemantics( TestSemantics(
label: 'test', label: 'test',
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
],
), ),
], ],
), ),
...@@ -1662,6 +1666,10 @@ void main() { ...@@ -1662,6 +1666,10 @@ void main() {
TestSemantics( TestSemantics(
label: 'test', label: 'test',
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
],
children: <TestSemantics>[ children: <TestSemantics>[
TestSemantics( TestSemantics(
label: 'Delete', label: 'Delete',
...@@ -1712,6 +1720,7 @@ void main() { ...@@ -1712,6 +1720,7 @@ void main() {
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[ flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState, SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
SemanticsFlag.isEnabled, SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable, SemanticsFlag.isFocusable,
], ],
...@@ -1763,6 +1772,7 @@ void main() { ...@@ -1763,6 +1772,7 @@ void main() {
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[ flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState, SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
SemanticsFlag.isEnabled, SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable, SemanticsFlag.isFocusable,
], ],
...@@ -1808,6 +1818,7 @@ void main() { ...@@ -1808,6 +1818,7 @@ void main() {
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[ flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState, SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
SemanticsFlag.isEnabled, SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable, SemanticsFlag.isFocusable,
SemanticsFlag.isSelected, SemanticsFlag.isSelected,
...@@ -1853,7 +1864,10 @@ void main() { ...@@ -1853,7 +1864,10 @@ void main() {
TestSemantics( TestSemantics(
label: 'test', label: 'test',
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[], flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
],
actions: <SemanticsAction>[], actions: <SemanticsAction>[],
), ),
], ],
...@@ -1867,6 +1881,140 @@ void main() { ...@@ -1867,6 +1881,140 @@ void main() {
semanticsTester.dispose(); semanticsTester.dispose();
}); });
testWidgets('tapEnabled explicitly false', (WidgetTester tester) async {
final SemanticsTester semanticsTester = SemanticsTester(tester);
await tester.pumpWidget(const MaterialApp(
home: Material(
child: RawChip(
tapEnabled: false,
label: Text('test'),
),
),
));
expect(semanticsTester, hasSemantics(
TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
textDirection: TextDirection.ltr,
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
children: <TestSemantics>[
TestSemantics(
label: 'test',
textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[], // Must not be a button when tapping is disabled.
actions: <SemanticsAction>[],
),
],
),
],
),
],
),
],
), ignoreTransform: true, ignoreId: true, ignoreRect: true));
semanticsTester.dispose();
});
testWidgets('enabled when tapEnabled and canTap', (WidgetTester tester) async {
final SemanticsTester semanticsTester = SemanticsTester(tester);
// These settings make a Chip which can be tapped, both in general and at this moment.
await tester.pumpWidget(MaterialApp(
home: Material(
child: RawChip(
isEnabled: true,
tapEnabled: true,
onPressed: () {},
label: const Text('test'),
),
),
));
expect(semanticsTester, hasSemantics(
TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
textDirection: TextDirection.ltr,
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
children: <TestSemantics>[
TestSemantics(
label: 'test',
textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap],
),
],
),
],
),
],
),
],
), ignoreTransform: true, ignoreId: true, ignoreRect: true));
semanticsTester.dispose();
});
testWidgets('disabled when tapEnabled but not canTap', (WidgetTester tester) async {
final SemanticsTester semanticsTester = SemanticsTester(tester);
// These settings make a Chip which _could_ be tapped, but not currently (ensures `canTap == false`).
await tester.pumpWidget(const MaterialApp(
home: Material(
child: RawChip(
isEnabled: true,
tapEnabled: true,
label: Text('test'),
),
),
));
expect(semanticsTester, hasSemantics(
TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
textDirection: TextDirection.ltr,
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
children: <TestSemantics>[
TestSemantics(
label: 'test',
textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.hasEnabledState,
SemanticsFlag.isButton,
],
),
],
),
],
),
],
),
],
), ignoreTransform: true, ignoreId: true, ignoreRect: true));
semanticsTester.dispose();
});
}); });
testWidgets('can be tapped outside of chip delete icon', (WidgetTester tester) async { testWidgets('can be tapped outside of chip delete icon', (WidgetTester tester) async {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment