Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[web] Changes to web keyboard selection shortcuts for more consistent behavior #114264

Merged
merged 8 commits into from Nov 2, 2022
Expand Up @@ -402,22 +402,16 @@ class DefaultTextEditingShortcuts extends StatelessWidget {
SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
htoor3 marked this conversation as resolved.
Show resolved Hide resolved
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowDown, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowLeft, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowRight, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowUp, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.pageUp, shift: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.pageDown, shift: true): DoNothingAndStopPropagationTextIntent(),
SingleActivator(LogicalKeyboardKey.end, shift: true): DoNothingAndStopPropagationTextIntent(),
Expand Down
111 changes: 110 additions & 1 deletion packages/flutter/test/widgets/editable_text_shortcuts_test.dart
Expand Up @@ -67,6 +67,8 @@ void main() {
'0123456789ABCDEFGHIJ'
'0123456789ABCDEFGHIJ'
'0123456789ABCDEFGHIJ';

const String testVerticalText = '1\n2\n3\n4\n5\n6\n7\n8\n9';
final TextEditingController controller = TextEditingController(text: testText);

final FocusNode focusNode = FocusNode();
Expand Down Expand Up @@ -2043,7 +2045,8 @@ void main() {
}, variant: appleOnly);
});

testWidgets('vertical movement', (WidgetTester tester) async {
testWidgets('vertical movement outside of selection',
(WidgetTester tester) async {
controller.text = testText;
controller.selection = const TextSelection.collapsed(
offset: 0,
Expand All @@ -2052,6 +2055,10 @@ void main() {
await tester.pumpWidget(buildEditableText());

for (final SingleActivator activator in allModifierVariants(LogicalKeyboardKey.arrowDown)) {
// skip when activator uses a shift shortcut since web accepts that case
htoor3 marked this conversation as resolved.
Show resolved Hide resolved
if (activator.shift) {
continue;
}
htoor3 marked this conversation as resolved.
Show resolved Hide resolved
await sendKeyCombination(tester, activator);
await tester.pump();

Expand Down Expand Up @@ -2201,4 +2208,106 @@ void main() {
}, variant: appleOnly);

}, skip: !kIsWeb);// [intended] specific tests target web.

group('Web does accept', () {
group('desktop platforms', () {
htoor3 marked this conversation as resolved.
Show resolved Hide resolved
const SingleActivator selectUp =
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true);

const SingleActivator selectDown =
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true);
htoor3 marked this conversation as resolved.
Show resolved Hide resolved

testWidgets('select up', (WidgetTester tester) async {
controller.text = testVerticalText;
controller.selection = const TextSelection.collapsed(
offset: 5,
);

await tester.pumpWidget(buildEditableText());
await sendKeyCombination(tester, selectUp);
await tester.pump();

expect(controller.text, testVerticalText);
expect(
controller.selection,
const TextSelection(
baseOffset: 5,
extentOffset: 3), // selection extends upwards from 5
reason: selectUp.toString(),
);
}, variant: TargetPlatformVariant.desktop());
htoor3 marked this conversation as resolved.
Show resolved Hide resolved

testWidgets('select down', (WidgetTester tester) async {
controller.text = testVerticalText;
controller.selection = const TextSelection.collapsed(
offset: 5,
);

await tester.pumpWidget(buildEditableText());
await sendKeyCombination(tester, selectDown);
await tester.pump();

expect(controller.text, testVerticalText);
expect(
controller.selection,
const TextSelection(
baseOffset: 5,
extentOffset: 7), // selection extends downwards from 5
reason: selectDown.toString(),
);
}, variant: TargetPlatformVariant.desktop());

testWidgets('select all up', (WidgetTester tester) async {
final bool isMacOS = defaultTargetPlatform == TargetPlatform.macOS;
final SingleActivator selectAllUp = isMacOS
? const SingleActivator(LogicalKeyboardKey.arrowUp,
shift: true, meta: true)
: const SingleActivator(LogicalKeyboardKey.arrowUp,
shift: true, alt: true);
controller.text = testVerticalText;
controller.selection = const TextSelection.collapsed(
offset: 5,
);

await tester.pumpWidget(buildEditableText());
await sendKeyCombination(tester, selectAllUp);
await tester.pump();

expect(controller.text, testVerticalText);
expect(
controller.selection,
const TextSelection(
baseOffset: 5,
extentOffset: 0), // selection extends all the way up
reason: selectAllUp.toString(),
);
}, variant: TargetPlatformVariant.desktop());

testWidgets('select all down', (WidgetTester tester) async {
final bool isMacOS = defaultTargetPlatform == TargetPlatform.macOS;
final SingleActivator selectAllDown = isMacOS
? const SingleActivator(LogicalKeyboardKey.arrowDown,
shift: true, meta: true)
: const SingleActivator(LogicalKeyboardKey.arrowDown,
shift: true, alt: true);
controller.text = testVerticalText;
controller.selection = const TextSelection.collapsed(
offset: 5,
);

await tester.pumpWidget(buildEditableText());
await sendKeyCombination(tester, selectAllDown);
await tester.pump();

expect(controller.text, testVerticalText);
expect(
controller.selection,
const TextSelection(
baseOffset: 5,
extentOffset: 17), // selection extends all the way down
reason: selectAllDown.toString(),
);
}, variant: TargetPlatformVariant.desktop());
});
}, skip: !kIsWeb); // [intended] specific tests target web.
}