Skip to content

Commit 9f23391

Browse files
authored
[web] Changes to web keyboard selection shortcuts for more consistent behavior (#114264)
1 parent 45c3b02 commit 9f23391

File tree

2 files changed

+108
-7
lines changed

2 files changed

+108
-7
lines changed

packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,22 +402,16 @@ class DefaultTextEditingShortcuts extends StatelessWidget {
402402
SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): DoNothingAndStopPropagationTextIntent(),
403403
SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): DoNothingAndStopPropagationTextIntent(),
404404
SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): DoNothingAndStopPropagationTextIntent(),
405-
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
406405
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
407406
SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
408-
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(),
409407
SingleActivator(LogicalKeyboardKey.arrowDown, meta: true): DoNothingAndStopPropagationTextIntent(),
410408
SingleActivator(LogicalKeyboardKey.arrowLeft, meta: true): DoNothingAndStopPropagationTextIntent(),
411409
SingleActivator(LogicalKeyboardKey.arrowRight, meta: true): DoNothingAndStopPropagationTextIntent(),
412410
SingleActivator(LogicalKeyboardKey.arrowUp, meta: true): DoNothingAndStopPropagationTextIntent(),
413-
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
414411
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
415412
SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
416-
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(),
417-
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): DoNothingAndStopPropagationTextIntent(),
418413
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): DoNothingAndStopPropagationTextIntent(),
419414
SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): DoNothingAndStopPropagationTextIntent(),
420-
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): DoNothingAndStopPropagationTextIntent(),
421415
SingleActivator(LogicalKeyboardKey.pageUp, shift: true): DoNothingAndStopPropagationTextIntent(),
422416
SingleActivator(LogicalKeyboardKey.pageDown, shift: true): DoNothingAndStopPropagationTextIntent(),
423417
SingleActivator(LogicalKeyboardKey.end, shift: true): DoNothingAndStopPropagationTextIntent(),
@@ -445,6 +439,8 @@ class DefaultTextEditingShortcuts extends StatelessWidget {
445439
const SingleActivator(LogicalKeyboardKey.escape): const DoNothingAndStopPropagationTextIntent(),
446440
const SingleActivator(LogicalKeyboardKey.tab): const DoNothingAndStopPropagationTextIntent(),
447441
const SingleActivator(LogicalKeyboardKey.tab, shift: true): const DoNothingAndStopPropagationTextIntent(),
442+
const SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): const DoNothingAndStopPropagationTextIntent(),
443+
const SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): const DoNothingAndStopPropagationTextIntent(),
448444
};
449445

450446
static Map<ShortcutActivator, Intent> get _shortcuts {

packages/flutter/test/widgets/editable_text_shortcuts_test.dart

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ void main() {
6767
'0123456789ABCDEFGHIJ'
6868
'0123456789ABCDEFGHIJ'
6969
'0123456789ABCDEFGHIJ';
70+
71+
const String testVerticalText = '1\n2\n3\n4\n5\n6\n7\n8\n9';
7072
final TextEditingController controller = TextEditingController(text: testText);
7173

7274
final FocusNode focusNode = FocusNode();
@@ -2043,7 +2045,8 @@ void main() {
20432045
}, variant: appleOnly);
20442046
});
20452047

2046-
testWidgets('vertical movement', (WidgetTester tester) async {
2048+
testWidgets('vertical movement outside of selection',
2049+
(WidgetTester tester) async {
20472050
controller.text = testText;
20482051
controller.selection = const TextSelection.collapsed(
20492052
offset: 0,
@@ -2052,6 +2055,10 @@ void main() {
20522055
await tester.pumpWidget(buildEditableText());
20532056

20542057
for (final SingleActivator activator in allModifierVariants(LogicalKeyboardKey.arrowDown)) {
2058+
// Skip for the shift shortcut since web accepts it.
2059+
if (activator.shift) {
2060+
continue;
2061+
}
20552062
await sendKeyCombination(tester, activator);
20562063
await tester.pump();
20572064

@@ -2201,4 +2208,102 @@ void main() {
22012208
}, variant: appleOnly);
22022209

22032210
}, skip: !kIsWeb);// [intended] specific tests target web.
2211+
2212+
group('Web does accept', () {
2213+
testWidgets('select up', (WidgetTester tester) async {
2214+
const SingleActivator selectUp =
2215+
SingleActivator(LogicalKeyboardKey.arrowUp, shift: true);
2216+
controller.text = testVerticalText;
2217+
controller.selection = const TextSelection.collapsed(
2218+
offset: 5,
2219+
);
2220+
2221+
await tester.pumpWidget(buildEditableText());
2222+
await sendKeyCombination(tester, selectUp);
2223+
await tester.pump();
2224+
2225+
expect(controller.text, testVerticalText);
2226+
expect(
2227+
controller.selection,
2228+
const TextSelection(
2229+
baseOffset: 5,
2230+
extentOffset: 3), // selection extends upwards from 5
2231+
reason: selectUp.toString(),
2232+
);
2233+
}, variant: TargetPlatformVariant.desktop());
2234+
2235+
testWidgets('select down', (WidgetTester tester) async {
2236+
const SingleActivator selectDown =
2237+
SingleActivator(LogicalKeyboardKey.arrowDown, shift: true);
2238+
controller.text = testVerticalText;
2239+
controller.selection = const TextSelection.collapsed(
2240+
offset: 5,
2241+
);
2242+
2243+
await tester.pumpWidget(buildEditableText());
2244+
await sendKeyCombination(tester, selectDown);
2245+
await tester.pump();
2246+
2247+
expect(controller.text, testVerticalText);
2248+
expect(
2249+
controller.selection,
2250+
const TextSelection(
2251+
baseOffset: 5,
2252+
extentOffset: 7), // selection extends downwards from 5
2253+
reason: selectDown.toString(),
2254+
);
2255+
}, variant: TargetPlatformVariant.desktop());
2256+
2257+
testWidgets('select all up', (WidgetTester tester) async {
2258+
final bool isMacOS = defaultTargetPlatform == TargetPlatform.macOS;
2259+
final SingleActivator selectAllUp = isMacOS
2260+
? const SingleActivator(LogicalKeyboardKey.arrowUp,
2261+
shift: true, meta: true)
2262+
: const SingleActivator(LogicalKeyboardKey.arrowUp,
2263+
shift: true, alt: true);
2264+
controller.text = testVerticalText;
2265+
controller.selection = const TextSelection.collapsed(
2266+
offset: 5,
2267+
);
2268+
2269+
await tester.pumpWidget(buildEditableText());
2270+
await sendKeyCombination(tester, selectAllUp);
2271+
await tester.pump();
2272+
2273+
expect(controller.text, testVerticalText);
2274+
expect(
2275+
controller.selection,
2276+
const TextSelection(
2277+
baseOffset: 5,
2278+
extentOffset: 0), // selection extends all the way up
2279+
reason: selectAllUp.toString(),
2280+
);
2281+
}, variant: TargetPlatformVariant.desktop());
2282+
2283+
testWidgets('select all down', (WidgetTester tester) async {
2284+
final bool isMacOS = defaultTargetPlatform == TargetPlatform.macOS;
2285+
final SingleActivator selectAllDown = isMacOS
2286+
? const SingleActivator(LogicalKeyboardKey.arrowDown,
2287+
shift: true, meta: true)
2288+
: const SingleActivator(LogicalKeyboardKey.arrowDown,
2289+
shift: true, alt: true);
2290+
controller.text = testVerticalText;
2291+
controller.selection = const TextSelection.collapsed(
2292+
offset: 5,
2293+
);
2294+
2295+
await tester.pumpWidget(buildEditableText());
2296+
await sendKeyCombination(tester, selectAllDown);
2297+
await tester.pump();
2298+
2299+
expect(controller.text, testVerticalText);
2300+
expect(
2301+
controller.selection,
2302+
const TextSelection(
2303+
baseOffset: 5,
2304+
extentOffset: 17), // selection extends all the way down
2305+
reason: selectAllDown.toString(),
2306+
);
2307+
}, variant: TargetPlatformVariant.desktop());
2308+
}, skip: !kIsWeb); // [intended] specific tests target web.
22042309
}

0 commit comments

Comments
 (0)