Re-enable SemanticsAction.focus matchers (#150990)

## Description

This re-enables the `SemanticsAction.focus` matchers so that they actually do something now instead of ignoring the action.

This was so that we could land the focus action changes without causing breakages in customer tests, and now that customer tests have been updated, we can land this PR turning it on again.

## Related Issues
 - Fixes https://github.com/flutter/flutter/issues/149842

## Related PRs
 - https://github.com/flutter/flutter/pull/149840

## Tests
 - Updates semantics tests to actually look for the focus action.
This commit is contained in:
Greg Spencer 2024-07-08 14:01:56 -07:00 committed by GitHub
parent f2be1260df
commit c082abe629
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 122 additions and 82 deletions

View File

@ -296,7 +296,7 @@ void main() {
TestSemantics.root(
children: <TestSemantics>[
TestSemantics.rootChild(
actions: SemanticsAction.tap.index,
actions: SemanticsAction.tap.index | SemanticsAction.focus.index,
label: 'ABC',
flags: <SemanticsFlag>[
SemanticsFlag.isButton,

View File

@ -251,7 +251,7 @@ void main() {
SemanticsFlag.isFocusable,
SemanticsFlag.isCheckStateMixed,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[SemanticsAction.focus, SemanticsAction.tap],
), hasLength(1));
await tester.pumpWidget(

View File

@ -148,7 +148,7 @@ void main() {
],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
],
),
);

View File

@ -534,8 +534,11 @@ void main() {
SemanticsFlag.hasEnabledState,
SemanticsFlag.isEnabled,
],
actions: <SemanticsAction>[SemanticsAction.tap,
SemanticsAction.didGainAccessibilityFocus,],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.didGainAccessibilityFocus,
],
textDirection: TextDirection.ltr,
),
],
@ -7971,6 +7974,7 @@ void main() {
isEnabled: true,
hasEnabledState: true,
hasTapAction: true,
hasFocusAction: true,
),
);
});
@ -10313,6 +10317,7 @@ void main() {
],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
if (defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.macOS)
SemanticsAction.didGainAccessibilityFocus,
// TODO(gspencergoog): also test for the presence of SemanticsAction.focus when

View File

@ -215,7 +215,7 @@ void main() {
hasEnabledState: true,
isEnabled: true,
hasTapAction: true,
hasFocusAction: true,
hasFocusAction: defaultTargetPlatform != TargetPlatform.iOS,
isFocusable: true,
));
handle.dispose();
@ -259,7 +259,7 @@ void main() {
hasEnabledState: true,
isEnabled: true,
hasTapAction: true,
hasFocusAction: true,
hasFocusAction: defaultTargetPlatform != TargetPlatform.iOS,
isFocusable: true,
));
handle.dispose();

View File

@ -322,7 +322,10 @@ void main() {
SemanticsFlag.isFocusable,
SemanticsFlag.isCheckStateMixed,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
), hasLength(1));
await tester.pumpWidget(
@ -346,7 +349,10 @@ void main() {
SemanticsFlag.isChecked,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
), hasLength(1));
await tester.pumpWidget(
@ -369,7 +375,10 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
), hasLength(1));
semantics.dispose();

View File

@ -1621,6 +1621,7 @@ void main() {
isFocused: true,
value: '01/15/2016',
hasTapAction: true,
hasFocusAction: true,
hasSetTextAction: true,
hasSetSelectionAction: true,
hasCopyAction: true,

View File

@ -182,7 +182,7 @@ void main() {
hasEnabledState: true,
isEnabled: true,
hasTapAction: true,
hasFocusAction: true,
hasFocusAction: defaultTargetPlatform != TargetPlatform.iOS,
isFocusable: true,
));
handle.dispose();
@ -240,7 +240,7 @@ void main() {
hasEnabledState: true,
isEnabled: true,
hasTapAction: true,
hasFocusAction: true,
hasFocusAction: defaultTargetPlatform != TargetPlatform.iOS,
isFocusable: true,
));
handle.dispose();

View File

@ -284,6 +284,7 @@ void main() {
isFocused: true,
value: '01/15/2016',
hasTapAction: true,
hasFocusAction: true,
hasSetTextAction: true,
hasSetSelectionAction: true,
hasCopyAction: true,

View File

@ -205,7 +205,7 @@ void main() {
),
),
));
final bool isApple = defaultTargetPlatform == TargetPlatform.iOS ||
final bool isCupertino = defaultTargetPlatform == TargetPlatform.iOS ||
defaultTargetPlatform == TargetPlatform.macOS;
expect(
semantics,
@ -217,11 +217,11 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
SemanticsFlag.isChecked,
if (isApple) SemanticsFlag.isSelected,
if (isCupertino) SemanticsFlag.isSelected,
],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
],
),
);

View File

@ -630,6 +630,8 @@ void main() {
final bool isDesktop = debugDefaultTargetPlatformOverride == TargetPlatform.macOS ||
debugDefaultTargetPlatformOverride == TargetPlatform.windows ||
debugDefaultTargetPlatformOverride == TargetPlatform.linux;
final bool isCupertino = debugDefaultTargetPlatformOverride == TargetPlatform.iOS ||
debugDefaultTargetPlatformOverride == TargetPlatform.macOS;
return TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
@ -662,7 +664,10 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
],
tooltip: 'Back',
textDirection: TextDirection.ltr,
),
@ -674,8 +679,7 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocused,
SemanticsFlag.isHeader,
if (debugDefaultTargetPlatformOverride != TargetPlatform.iOS &&
debugDefaultTargetPlatformOverride != TargetPlatform.macOS) SemanticsFlag.namesRoute,
if (!isCupertino) SemanticsFlag.namesRoute,
],
actions: <SemanticsAction>[
if (isDesktop)
@ -683,6 +687,7 @@ void main() {
if (isDesktop)
SemanticsAction.didLoseAccessibilityFocus,
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.setSelection,
SemanticsAction.setText,
SemanticsAction.paste,
@ -718,7 +723,10 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
],
label: 'Suggestions',
textDirection: TextDirection.ltr,
),
@ -783,6 +791,8 @@ void main() {
final bool isDesktop = debugDefaultTargetPlatformOverride == TargetPlatform.macOS ||
debugDefaultTargetPlatformOverride == TargetPlatform.windows ||
debugDefaultTargetPlatformOverride == TargetPlatform.linux;
final bool isCupertino = debugDefaultTargetPlatformOverride == TargetPlatform.iOS ||
debugDefaultTargetPlatformOverride == TargetPlatform.macOS;
return TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
@ -812,7 +822,10 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
],
tooltip: 'Back',
textDirection: TextDirection.ltr,
),
@ -824,8 +837,7 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocused,
SemanticsFlag.isHeader,
if (debugDefaultTargetPlatformOverride != TargetPlatform.iOS &&
debugDefaultTargetPlatformOverride != TargetPlatform.macOS) SemanticsFlag.namesRoute,
if (!isCupertino) SemanticsFlag.namesRoute,
],
actions: <SemanticsAction>[
if (isDesktop)
@ -833,6 +845,7 @@ void main() {
if (isDesktop)
SemanticsAction.didLoseAccessibilityFocus,
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.setSelection,
SemanticsAction.setText,
SemanticsAction.paste,
@ -856,7 +869,10 @@ void main() {
SemanticsFlag.isEnabled,
SemanticsFlag.isFocusable,
],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
],
label: 'Suggestions',
textDirection: TextDirection.ltr,
),

View File

@ -1454,7 +1454,10 @@ void main() {
TestSemantics(
id: 4,
flags: <SemanticsFlag>[SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, SemanticsFlag.isSlider],
actions: <SemanticsAction>[SemanticsAction.focus, SemanticsAction.increase, SemanticsAction.decrease],
actions: <SemanticsAction>[
if (defaultTargetPlatform != TargetPlatform.iOS) SemanticsAction.focus,
SemanticsAction.increase, SemanticsAction.decrease,
],
value: '50%',
increasedValue: '60%',
decreasedValue: '40%',

View File

@ -749,6 +749,7 @@ void main() {
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.didGainAccessibilityFocus,
SemanticsAction.didLoseAccessibilityFocus,
],
@ -2042,6 +2043,7 @@ void main() {
],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.setSelection,
SemanticsAction.paste,
@ -5576,6 +5578,7 @@ void main() {
value: 'some text',
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8410,6 +8413,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8431,6 +8435,7 @@ void main() {
value: 'Guten Tag',
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8453,6 +8458,7 @@ void main() {
textSelection: const TextSelection.collapsed(offset: 9),
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
SemanticsAction.setSelection,
@ -8481,6 +8487,7 @@ void main() {
value: 'Guten Tag',
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorForwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
@ -8512,6 +8519,7 @@ void main() {
value: 'Schönen Feierabend',
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorForwardByCharacter,
SemanticsAction.moveCursorForwardByWord,
SemanticsAction.setSelection,
@ -8543,7 +8551,10 @@ void main() {
expect(
semantics,
includesNodeWith(
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8560,7 +8571,10 @@ void main() {
expect(
semantics,
includesNodeWith(
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8577,7 +8591,10 @@ void main() {
expect(
semantics,
includesNodeWith(
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
textDirection: TextDirection.ltr,
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8616,6 +8633,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.setText,
// Absent the following because enableInteractiveSelection: false
// SemanticsAction.moveCursorBackwardByCharacter,
@ -8659,6 +8677,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -8682,6 +8701,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
SemanticsAction.setSelection,
@ -8710,6 +8730,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorForwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
@ -8765,6 +8786,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
SemanticsAction.setSelection,
@ -8813,6 +8835,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
SemanticsAction.setSelection,
@ -8862,7 +8885,7 @@ void main() {
TestSemantics(
id: inputFieldId,
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
value: textInTextField,
textDirection: TextDirection.ltr,
),
@ -8887,6 +8910,7 @@ void main() {
],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
SemanticsAction.setSelection,
@ -8937,7 +8961,7 @@ void main() {
TestSemantics(
id: inputFieldId,
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
value: textInTextField,
textDirection: TextDirection.ltr,
),
@ -8962,6 +8986,7 @@ void main() {
],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.moveCursorBackwardByCharacter,
SemanticsAction.moveCursorBackwardByWord,
SemanticsAction.setSelection,
@ -9135,6 +9160,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -9169,6 +9195,7 @@ void main() {
textSelection: const TextSelection(baseOffset: 0, extentOffset: 0),
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
SemanticsAction.setSelection,
SemanticsAction.setText,
SemanticsAction.paste,
@ -9231,6 +9258,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -9280,6 +9308,7 @@ void main() {
textDirection: TextDirection.ltr,
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
@ -18392,8 +18421,7 @@ void main() {
SemanticsAction.didGainAccessibilityFocus,
if (defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.linux)
SemanticsAction.didLoseAccessibilityFocus,
// TODO(gspencergoog): also test for the presence of SemanticsAction.focus when
// this iOS issue is addressed: https://github.com/flutter/flutter/issues/150030
SemanticsAction.focus
],
),
],

View File

@ -1250,7 +1250,10 @@ void main() {
semantics,
includesNodeWith(
label: amString,
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isButton,
SemanticsFlag.isChecked,
@ -1264,7 +1267,10 @@ void main() {
semantics,
includesNodeWith(
label: pmString,
actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.focus],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isButton,
SemanticsFlag.isInMutuallyExclusiveGroup,
@ -1342,7 +1348,10 @@ void main() {
includesNodeWith(
label: 'Hour',
value: '07',
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
SemanticsFlag.hasEnabledState,
@ -1356,7 +1365,10 @@ void main() {
includesNodeWith(
label: 'Minute',
value: '00',
actions: <SemanticsAction>[SemanticsAction.tap],
actions: <SemanticsAction>[
SemanticsAction.tap,
SemanticsAction.focus,
],
flags: <SemanticsFlag>[
SemanticsFlag.isTextField,
SemanticsFlag.hasEnabledState,

View File

@ -269,10 +269,7 @@ class TestSemantics {
final int actionsBitmask = actions is int
? actions as int
: (actions as List<SemanticsAction>).fold<int>(0, (int bitmask, SemanticsAction action) => bitmask | action.index);
// TODO(gspencergoog): Remove focus filter once customer tests have been
// updated with the proper actions information for focus.
// https://github.com/flutter/flutter/issues/149842
if ((actionsBitmask & ~SemanticsAction.focus.index) != (nodeData.actions & ~SemanticsAction.focus.index)) {
if (actionsBitmask != nodeData.actions) {
return fail('expected node id $id to have actions $actions but found actions ${nodeData.actions}.');
}
@ -528,14 +525,8 @@ class SemanticsTester {
}
if (actions != null) {
// TODO(gspencergoog): Remove focus filter once customer tests have been
// updated with the proper actions information for focus.
// https://github.com/flutter/flutter/issues/149842
final List<SemanticsAction> nonFocusActions = actions.where(
(SemanticsAction action) => action != SemanticsAction.focus
).toList();
final int expectedActions = nonFocusActions.fold<int>(0, (int value, SemanticsAction action) => value | action.index);
final int actualActions = node.getSemanticsData().actions & ~SemanticsAction.focus.index;
final int expectedActions = actions.fold<int>(0, (int value, SemanticsAction action) => value | action.index);
final int actualActions = node.getSemanticsData().actions;
if (expectedActions != actualActions) {
return false;
}
@ -657,14 +648,11 @@ class SemanticsTester {
static String _actionsToSemanticsActionExpression(dynamic actions) {
Iterable<SemanticsAction> list;
// TODO(gspencergoog): Remove focus filter once customer tests have been
// updated with the proper actions information for focus.
// https://github.com/flutter/flutter/issues/149842
if (actions is int) {
list = SemanticsAction.values
.where((SemanticsAction action) => action != SemanticsAction.focus && (action.index & actions) != 0);
.where((SemanticsAction action) => (action.index & actions) != 0);
} else {
list = (actions as List<SemanticsAction>).where((SemanticsAction action) => action != SemanticsAction.focus);
list = actions as List<SemanticsAction>;
}
return '<SemanticsAction>[${list.join(', ')}]';
}
@ -887,10 +875,7 @@ class _IncludesNodeWith extends Matcher {
if (value != null) 'value "$value"',
if (hint != null) 'hint "$hint"',
if (textDirection != null) ' (${textDirection!.name})',
// TODO(gspencergoog): Remove focus filter once customer tests have been
// updated with the proper actions information for focus.
// https://github.com/flutter/flutter/issues/149842
if (actions != null) 'actions "${actions!.where((SemanticsAction action) => action != SemanticsAction.focus).join(', ')}"',
if (actions != null) 'actions "${actions!.join(', ')}"',
if (flags != null) 'flags "${flags!.join(', ')}"',
if (tags != null) 'tags "${tags!.join(', ')}"',
if (scrollPosition != null) 'scrollPosition "$scrollPosition"',

View File

@ -2266,10 +2266,6 @@ class _MatchesSemanticsData extends Matcher {
required bool? isExpanded,
// Actions
required bool? hasTapAction,
// TODO(gspencergoog): Once this has landed, and customer tests have been
// updated, remove the ignore below.
// https://github.com/flutter/flutter/issues/149842
// ignore: avoid_unused_constructor_parameters
required bool? hasFocusAction,
required bool? hasLongPressAction,
required bool? hasScrollLeftAction,
@ -2329,9 +2325,7 @@ class _MatchesSemanticsData extends Matcher {
},
actions = <SemanticsAction, bool>{
if (hasTapAction != null) SemanticsAction.tap: hasTapAction,
// TODO(gspencergoog): Once this has landed, and customer tests have
// been updated, add a line here that adds handling for
// hasFocusAction. https://github.com/flutter/flutter/issues/149842
if (hasFocusAction != null) SemanticsAction.focus: hasFocusAction,
if (hasLongPressAction != null) SemanticsAction.longPress: hasLongPressAction,
if (hasScrollLeftAction != null) SemanticsAction.scrollLeft: hasScrollLeftAction,
if (hasScrollRightAction != null) SemanticsAction.scrollRight: hasScrollRightAction,
@ -2429,19 +2423,12 @@ class _MatchesSemanticsData extends Matcher {
if (tooltip != null) {
description.add(' with tooltip: $tooltip');
}
// TODO(gspencergoog): Remove filter once customer tests have been updated
// with the proper actions information for focus.
// https://github.com/flutter/flutter/issues/149842
final Map<ui.SemanticsAction, bool> nonFocusActions =
Map<ui.SemanticsAction, bool>.fromEntries(actions.entries.where(
(MapEntry<ui.SemanticsAction, bool> e) => e.key != SemanticsAction.focus
));
if (nonFocusActions.isNotEmpty) {
final List<SemanticsAction> expectedActions = nonFocusActions.entries
if (actions.isNotEmpty) {
final List<SemanticsAction> expectedActions = actions.entries
.where((MapEntry<ui.SemanticsAction, bool> e) => e.value)
.map((MapEntry<ui.SemanticsAction, bool> e) => e.key)
.toList();
final List<SemanticsAction> notExpectedActions = nonFocusActions.entries
final List<SemanticsAction> notExpectedActions = actions.entries
.where((MapEntry<ui.SemanticsAction, bool> e) => !e.value)
.map((MapEntry<ui.SemanticsAction, bool> e) => e.key)
.toList();
@ -2620,17 +2607,10 @@ class _MatchesSemanticsData extends Matcher {
if (maxValueLength != null && maxValueLength != data.maxValueLength) {
return failWithDescription(matchState, 'maxValueLength was: ${data.maxValueLength}');
}
// TODO(gspencergoog): Remove filter once customer tests have been updated
// with the proper actions information for focus.
// https://github.com/flutter/flutter/issues/149842
final Map<ui.SemanticsAction, bool> nonFocusActions =
Map<ui.SemanticsAction, bool>.fromEntries(actions.entries.where(
(MapEntry<ui.SemanticsAction, bool> e) => e.key != SemanticsAction.focus
));
if (nonFocusActions.isNotEmpty) {
if (actions.isNotEmpty) {
final List<SemanticsAction> unexpectedActions = <SemanticsAction>[];
final List<SemanticsAction> missingActions = <SemanticsAction>[];
for (final MapEntry<ui.SemanticsAction, bool> actionEntry in nonFocusActions.entries) {
for (final MapEntry<ui.SemanticsAction, bool> actionEntry in actions.entries) {
final ui.SemanticsAction action = actionEntry.key;
final bool actionExpected = actionEntry.value;
final bool actionPresent = (action.index & data.actions) == action.index;