From 9375377fa99e8faae8a573e9fe92b8712d33e82d Mon Sep 17 00:00:00 2001 From: Matthew Cliatt Date: Thu, 30 Jan 2020 09:36:41 -0800 Subject: [PATCH] Fix handling backspace on macos with text selection (#49760) Fixes #46150 by catching both the delete and backspace keys, rather than just the delete key. --- .../flutter/lib/src/rendering/editable.dart | 9 +++- .../test/widgets/editable_text_test.dart | 45 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/rendering/editable.dart b/packages/flutter/lib/src/rendering/editable.dart index 171bdc776e7..3ddf506ca55 100644 --- a/packages/flutter/lib/src/rendering/editable.dart +++ b/packages/flutter/lib/src/rendering/editable.dart @@ -431,12 +431,17 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin { LogicalKeyboardKey.arrowDown, }; + static final Set _deleteKeys = { + LogicalKeyboardKey.delete, + LogicalKeyboardKey.backspace, + }; + static final Set _shortcutKeys = { LogicalKeyboardKey.keyA, LogicalKeyboardKey.keyC, LogicalKeyboardKey.keyV, LogicalKeyboardKey.keyX, - LogicalKeyboardKey.delete, + ..._deleteKeys, }; static final Set _nonModifierKeys = { @@ -491,7 +496,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin { // _handleShortcuts depends on being started in the same stack invocation // as the _handleKeyEvent method _handleShortcuts(key); - } else if (key == LogicalKeyboardKey.delete) { + } else if (_deleteKeys.contains(key)) { _handleDelete(); } } diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index 40f7b05181c..439beb7a45a 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -3738,6 +3738,51 @@ void main() { reason: 'on $platform', ); expect(controller.text, isEmpty, reason: 'on $platform'); + + /// Paste and Select All + await sendKeys( + tester, + [ + LogicalKeyboardKey.keyV, + LogicalKeyboardKey.keyA, + ], + shortcutModifier: true, + platform: platform, + ); + + expect( + selection, + equals( + const TextSelection( + baseOffset: 0, + extentOffset: testText.length, + affinity: TextAffinity.downstream, + ), + ), + reason: 'on $platform', + ); + expect(controller.text, equals(testText), reason: 'on $platform'); + + // Backspace + await sendKeys( + tester, + [ + LogicalKeyboardKey.delete, + ], + platform: platform, + ); + expect( + selection, + equals( + const TextSelection( + baseOffset: 0, + extentOffset: 72, + affinity: TextAffinity.downstream, + ), + ), + reason: 'on $platform', + ); + expect(controller.text, isEmpty, reason: 'on $platform'); } testWidgets('keyboard text selection works as expected on linux', (WidgetTester tester) async {