From 973f8e2d83707eb386712f0547f51caedd38fc4d Mon Sep 17 00:00:00 2001 From: zhongliugo Date: Tue, 13 Oct 2026 20:40:49 +0000 Subject: [PATCH 1/3] [material_ui] Declare input purpose on a11y_assessments text fields --- .../lib/use_cases/text_field.dart | 8 +++++-- .../lib/use_cases/text_field_password.dart | 2 ++ .../test/text_field_password_test.dart | 11 ++++++++++ .../test/text_field_test.dart | 22 +++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field.dart b/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field.dart index 717574debd33..13c8f81f7c1b 100644 --- a/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field.dart +++ b/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field.dart @@ -37,11 +37,13 @@ class _MainWidget extends StatelessWidget { label: 'Input field with suffix @gmail.com', child: const TextField( key: Key('enabled text field'), - maxLines: null, + keyboardType: TextInputType.emailAddress, + autofillHints: [AutofillHints.email], decoration: InputDecoration( labelText: 'Email', suffixText: '@gmail.com', hintText: 'Enter your email', + hintMaxLines: 5, ), ), ), @@ -49,11 +51,13 @@ class _MainWidget extends StatelessWidget { label: 'Input field with suffix @gmail.com', child: TextField( key: const Key('disabled text field'), - maxLines: null, + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], decoration: const InputDecoration( labelText: 'Email', suffixText: '@gmail.com', hintText: 'Enter your email', + hintMaxLines: 5, ), enabled: false, controller: TextEditingController(text: 'xyz'), diff --git a/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field_password.dart b/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field_password.dart index d1e07f5d0de2..9ee4fa65b3a8 100644 --- a/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field_password.dart +++ b/packages/material_ui/test_apps/a11y_assessments/lib/use_cases/text_field_password.dart @@ -35,11 +35,13 @@ class _MainWidget extends StatelessWidget { children: const [ TextField( key: Key('enabled password'), + autofillHints: [AutofillHints.password], decoration: InputDecoration(labelText: 'Password'), obscureText: true, ), TextField( key: Key('disabled password'), + autofillHints: [AutofillHints.password], decoration: InputDecoration(labelText: 'Password'), enabled: false, obscureText: true, diff --git a/packages/material_ui/test_apps/a11y_assessments/test/text_field_password_test.dart b/packages/material_ui/test_apps/a11y_assessments/test/text_field_password_test.dart index b5e82e7e8981..8d408af09da1 100644 --- a/packages/material_ui/test_apps/a11y_assessments/test/text_field_password_test.dart +++ b/packages/material_ui/test_apps/a11y_assessments/test/text_field_password_test.dart @@ -56,4 +56,15 @@ void main() { await tester.pumpAndSettle(); expect(findHeadingLevelOnes, findsOne); }); + + testWidgets('password fields expose their input purpose', (WidgetTester tester) async { + await pumpsUseCase(tester, TextFieldPasswordUseCase()); + + for (final key in [const Key('enabled password'), const Key('disabled password')]) { + final EditableText editableText = tester.widget( + find.descendant(of: find.byKey(key), matching: find.byType(EditableText)), + ); + expect(editableText.autofillHints, contains(AutofillHints.password)); + } + }); } diff --git a/packages/material_ui/test_apps/a11y_assessments/test/text_field_test.dart b/packages/material_ui/test_apps/a11y_assessments/test/text_field_test.dart index 686cbdff9c93..de9485f17652 100644 --- a/packages/material_ui/test_apps/a11y_assessments/test/text_field_test.dart +++ b/packages/material_ui/test_apps/a11y_assessments/test/text_field_test.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:ui' show SemanticsInputType; + import 'package:a11y_assessments/use_cases/text_field.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; @@ -71,4 +73,24 @@ void main() { await tester.pumpAndSettle(); expect(findHeadingLevelOnes, findsOne); }); + + testWidgets('email text fields expose their input purpose', (WidgetTester tester) async { + await pumpsUseCase(tester, TextFieldUseCase()); + await tester.pumpAndSettle(); + + for (final key in [const Key('enabled text field'), const Key('disabled text field')]) { + final Finder finder = find.byKey(key); + // On web, a single-line field with the email input type renders an + // . A multiline field renders a