diff --git a/packages/flutter/lib/src/rendering/editable.dart b/packages/flutter/lib/src/rendering/editable.dart index b93ab59ff45..c9376e19665 100644 --- a/packages/flutter/lib/src/rendering/editable.dart +++ b/packages/flutter/lib/src/rendering/editable.dart @@ -1383,6 +1383,7 @@ class RenderEditable extends RenderBox ..isMultiline = _isMultiline ..textDirection = textDirection ..isFocused = hasFocus + ..isFocusable = true ..isTextField = true ..isReadOnly = readOnly // This is the default for customer that uses RenderEditable directly. diff --git a/packages/flutter/test/cupertino/text_field_test.dart b/packages/flutter/test/cupertino/text_field_test.dart index 38a9c3fa217..db23f2782c4 100644 --- a/packages/flutter/test/cupertino/text_field_test.dart +++ b/packages/flutter/test/cupertino/text_field_test.dart @@ -574,6 +574,7 @@ void main() { inputType: ui.SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -7775,6 +7776,7 @@ void main() { ), matchesSemantics( isTextField: true, + isFocusable: true, isEnabled: true, hasEnabledState: true, hasTapAction: true, @@ -7801,7 +7803,12 @@ void main() { .descendant(of: find.byType(CupertinoTextField), matching: find.byType(Semantics)) .first, ), - matchesSemantics(hasEnabledState: true, isTextField: true, isReadOnly: true), + matchesSemantics( + hasEnabledState: true, + isTextField: true, + isFocusable: true, + isReadOnly: true, + ), ); }); @@ -10538,6 +10545,7 @@ void main() { inputType: ui.SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -10605,6 +10613,7 @@ void main() { inputType: ui.SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isReadOnly, ], diff --git a/packages/flutter/test/material/date_picker_test.dart b/packages/flutter/test/material/date_picker_test.dart index aca7e16bf8d..e81686dff56 100644 --- a/packages/flutter/test/material/date_picker_test.dart +++ b/packages/flutter/test/material/date_picker_test.dart @@ -1847,6 +1847,7 @@ void main() { isEnabled: true, hasEnabledState: true, isTextField: true, + isFocusable: true, isFocused: true, value: '01/15/2016', hasTapAction: true, diff --git a/packages/flutter/test/material/dropdown_menu_test.dart b/packages/flutter/test/material/dropdown_menu_test.dart index 33d44810e9e..5c7f73b7ba0 100644 --- a/packages/flutter/test/material/dropdown_menu_test.dart +++ b/packages/flutter/test/material/dropdown_menu_test.dart @@ -3805,6 +3805,7 @@ void main() { hasFocusAction: true, hasTapAction: true, isTextField: true, + isFocusable: true, hasEnabledState: true, isEnabled: true, label: 'Test', @@ -3819,6 +3820,7 @@ void main() { matchesSemantics( hasFocusAction: true, isTextField: true, + isFocusable: true, hasEnabledState: true, isEnabled: true, label: 'Test', @@ -4338,6 +4340,7 @@ void main() { inputType: SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isReadOnly, diff --git a/packages/flutter/test/material/input_date_picker_form_field_test.dart b/packages/flutter/test/material/input_date_picker_form_field_test.dart index 77de679e6fe..1765ef47954 100644 --- a/packages/flutter/test/material/input_date_picker_form_field_test.dart +++ b/packages/flutter/test/material/input_date_picker_form_field_test.dart @@ -294,6 +294,7 @@ void main() { matchesSemantics( label: 'Enter Date', isTextField: true, + isFocusable: true, hasEnabledState: true, isEnabled: true, isFocused: true, diff --git a/packages/flutter/test/material/search_test.dart b/packages/flutter/test/material/search_test.dart index ca00cfdbf23..64fc5a79725 100644 --- a/packages/flutter/test/material/search_test.dart +++ b/packages/flutter/test/material/search_test.dart @@ -708,6 +708,7 @@ void main() { SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, + SemanticsFlag.isFocusable, ], actions: [ if (isDesktop) SemanticsAction.didGainAccessibilityFocus, @@ -733,6 +734,7 @@ void main() { SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, + SemanticsFlag.isFocusable, SemanticsFlag.isHeader, if (!isCupertino) SemanticsFlag.namesRoute, ], @@ -911,6 +913,7 @@ void main() { SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, + SemanticsFlag.isFocusable, ], actions: [ if (isDesktop) SemanticsAction.didGainAccessibilityFocus, @@ -936,6 +939,7 @@ void main() { SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, + SemanticsFlag.isFocusable, SemanticsFlag.isHeader, if (!isCupertino) SemanticsFlag.namesRoute, ], diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index 3dc22210cc0..0061595456a 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -766,6 +766,7 @@ void main() { id: 4, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -2005,6 +2006,7 @@ void main() { id: 1, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -5661,6 +5663,7 @@ void main() { currentValueLength: 9, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -5702,6 +5705,7 @@ void main() { currentValueLength: 9, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -6988,6 +6992,7 @@ void main() { currentValueLength: 0, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -7404,6 +7409,7 @@ void main() { currentValueLength: 0, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -7428,6 +7434,7 @@ void main() { inputType: ui.SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -7458,6 +7465,7 @@ void main() { currentValueLength: 0, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isReadOnly, @@ -8437,6 +8445,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -8465,6 +8474,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -8502,6 +8512,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8542,6 +8553,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8581,6 +8593,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8612,6 +8625,7 @@ void main() { textDirection: TextDirection.ltr, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -8631,6 +8645,7 @@ void main() { inputType: ui.SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isObscured, @@ -8648,6 +8663,7 @@ void main() { textDirection: TextDirection.ltr, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -8697,6 +8713,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8737,6 +8754,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -8775,6 +8793,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8817,6 +8836,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8877,6 +8897,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8937,6 +8958,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -8981,6 +9003,7 @@ void main() { id: inputFieldId, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -9009,6 +9032,7 @@ void main() { id: inputFieldId, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -9069,6 +9093,7 @@ void main() { id: inputFieldId, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -9097,6 +9122,7 @@ void main() { id: inputFieldId, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -9262,6 +9288,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -9306,6 +9333,7 @@ void main() { ], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocused, @@ -9368,6 +9396,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -9423,6 +9452,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -18505,6 +18535,7 @@ void main() { currentValueLength: 0, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, ], @@ -18577,6 +18608,7 @@ void main() { currentValueLength: 0, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isReadOnly, ], diff --git a/packages/flutter/test/material/time_picker_test.dart b/packages/flutter/test/material/time_picker_test.dart index 47c7160e7a0..54c7afda964 100644 --- a/packages/flutter/test/material/time_picker_test.dart +++ b/packages/flutter/test/material/time_picker_test.dart @@ -1552,6 +1552,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isMultiline, @@ -1566,6 +1567,7 @@ void main() { actions: [SemanticsAction.tap, SemanticsAction.focus], flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isMultiline, diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index 62de1011f0c..9835bbd1ef3 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -4037,7 +4037,12 @@ void main() { ), ); - expect(semantics, includesNodeWith(flags: [SemanticsFlag.isTextField])); + expect( + semantics, + includesNodeWith( + flags: [SemanticsFlag.isTextField, SemanticsFlag.isFocusable], + ), + ); await tester.tap(find.byType(EditableText)); await tester.idle(); @@ -4045,7 +4050,13 @@ void main() { expect( semantics, - includesNodeWith(flags: [SemanticsFlag.isTextField, SemanticsFlag.isFocused]), + includesNodeWith( + flags: [ + SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, + SemanticsFlag.isFocused, + ], + ), ); semantics.dispose(); @@ -4074,7 +4085,12 @@ void main() { ), ); - expect(semantics, includesNodeWith(flags: [SemanticsFlag.isTextField])); + expect( + semantics, + includesNodeWith( + flags: [SemanticsFlag.isTextField, SemanticsFlag.isFocusable], + ), + ); await tester.pumpWidget( MediaQuery( @@ -4100,7 +4116,11 @@ void main() { expect( semantics, includesNodeWith( - flags: [SemanticsFlag.isTextField, SemanticsFlag.isMultiline], + flags: [ + SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, + SemanticsFlag.isMultiline, + ], ), ); @@ -4134,7 +4154,10 @@ void main() { expect( semantics, - includesNodeWith(flags: [SemanticsFlag.isTextField], value: value1), + includesNodeWith( + flags: [SemanticsFlag.isTextField, SemanticsFlag.isFocusable], + value: value1, + ), ); const String value2 = 'Changed the EditableText content'; @@ -4144,7 +4167,10 @@ void main() { expect( semantics, - includesNodeWith(flags: [SemanticsFlag.isTextField], value: value2), + includesNodeWith( + flags: [SemanticsFlag.isTextField, SemanticsFlag.isFocusable], + value: value2, + ), ); semantics.dispose(); @@ -4715,6 +4741,7 @@ void main() { TestSemantics( flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isObscured, ], value: expectedValue, @@ -4773,7 +4800,10 @@ void main() { flags: [SemanticsFlag.scopesRoute], children: [ TestSemantics( - flags: [SemanticsFlag.isTextField], + flags: [ + SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, + ], value: originalText, inputType: SemanticsInputType.text, textDirection: TextDirection.ltr, @@ -4826,6 +4856,7 @@ void main() { flags: [ SemanticsFlag.isTextField, SemanticsFlag.isObscured, + SemanticsFlag.isFocusable, SemanticsFlag.isFocused, ], actions: [ @@ -5078,6 +5109,7 @@ void main() { id: expectedNodeId, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isFocused, ], actions: [ @@ -5205,6 +5237,7 @@ void main() { id: expectedNodeId, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isFocused, ], actions: [ diff --git a/packages/flutter/test/widgets/form_test.dart b/packages/flutter/test/widgets/form_test.dart index a83f7c2117c..d44da5b8878 100644 --- a/packages/flutter/test/widgets/form_test.dart +++ b/packages/flutter/test/widgets/form_test.dart @@ -1634,7 +1634,11 @@ void main() { await pumpWidget(); expect( tester.getSemantics(find.byType(TextFormField).last), - containsSemantics(isTextField: true, validationResult: SemanticsValidationResult.valid), + containsSemantics( + isTextField: true, + isFocusable: true, + validationResult: SemanticsValidationResult.valid, + ), ); // Test invalid case @@ -1642,7 +1646,11 @@ void main() { await pumpWidget(); expect( tester.getSemantics(find.byType(TextFormField).last), - containsSemantics(isTextField: true, validationResult: SemanticsValidationResult.invalid), + containsSemantics( + isTextField: true, + isFocusable: true, + validationResult: SemanticsValidationResult.invalid, + ), ); }); } diff --git a/packages/flutter/test/widgets/selectable_text_test.dart b/packages/flutter/test/widgets/selectable_text_test.dart index 67d932eb2d0..eacb0c3a4e1 100644 --- a/packages/flutter/test/widgets/selectable_text_test.dart +++ b/packages/flutter/test/widgets/selectable_text_test.dart @@ -1512,6 +1512,7 @@ void main() { includesNodeWith( flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isReadOnly, SemanticsFlag.isMultiline, ], @@ -1543,6 +1544,7 @@ void main() { ), flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isReadOnly, SemanticsFlag.isMultiline, ], @@ -1579,6 +1581,7 @@ void main() { ), flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isReadOnly, SemanticsFlag.isMultiline, ], @@ -2170,6 +2173,7 @@ void main() { inputType: ui.SemanticsInputType.text, flags: [ SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isReadOnly, SemanticsFlag.isMultiline, ], @@ -2207,6 +2211,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2243,6 +2248,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2277,6 +2283,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2359,6 +2366,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, // SelectableText act like a text widget when enableInteractiveSelection // is false. It will not respond to any pointer event. @@ -2398,6 +2406,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, ], ), @@ -2435,6 +2444,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2472,6 +2482,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2620,6 +2631,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2675,6 +2687,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ], @@ -2715,6 +2728,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, ], actions: [SemanticsAction.longPress], @@ -2742,6 +2756,7 @@ void main() { flags: [ SemanticsFlag.isReadOnly, SemanticsFlag.isTextField, + SemanticsFlag.isFocusable, SemanticsFlag.isMultiline, SemanticsFlag.isFocused, ],