diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/tabs.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/tabs.dart index b1b95b394c6..9b6fccb6e1c 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/tabs.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/tabs.dart @@ -19,6 +19,7 @@ class SemanticTab extends SemanticRole { preferredLabelRepresentation: LabelRepresentation.ariaLabel, ) { setAriaRole('tab'); + addTappable(); } @override diff --git a/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart b/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart index a392eac49f7..92b8fc23905 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -4297,6 +4297,26 @@ void _testTabs() { expect(object.element.getAttribute('role'), 'tab'); }); + test('tab with tap action', () { + semantics() + ..debugOverrideTimestampFunction(() => _testTime) + ..semanticsEnabled = true; + + final SemanticsTester tester = SemanticsTester(owner()); + tester.updateNode( + id: 0, + role: ui.SemanticsRole.tab, + hasTap: true, + rect: const ui.Rect.fromLTRB(0, 0, 100, 50), + ); + tester.apply(); + + final SemanticsObject object = tester.getSemanticsObject(0); + expect(object.semanticRole?.kind, EngineSemanticsRole.tab); + expect(object.element.getAttribute('role'), 'tab'); + expect(object.element.hasAttribute('flt-tappable'), isTrue); + }); + test('nodes with tab panel role', () { semantics() ..debugOverrideTimestampFunction(() => _testTime)