From 9d1ee4bc4e121a91cb079d8ed9f67038ad169ce6 Mon Sep 17 00:00:00 2001 From: Alan Mantoux Date: Sun, 11 Aug 2024 18:52:22 +0200 Subject: [PATCH 1/2] Always keep natural order of selection boundaries when setting clipboard data --- packages/fleather/lib/src/widgets/editor.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fleather/lib/src/widgets/editor.dart b/packages/fleather/lib/src/widgets/editor.dart index 17374de9..729ceb36 100644 --- a/packages/fleather/lib/src/widgets/editor.dart +++ b/packages/fleather/lib/src/widgets/editor.dart @@ -1264,9 +1264,9 @@ class RawEditorState extends EditorState final TextSelection selection = textEditingValue.selection; widget.clipboardManager.setData(FleatherClipboardData( plainText: selection.textInside(textEditingValue.text), - delta: controller.document - .toDelta() - .slice(selection.baseOffset, selection.extentOffset), + delta: controller.document.toDelta().slice( + math.min(selection.baseOffset, selection.extentOffset), + math.max(selection.baseOffset, selection.extentOffset)), )); } From 4bdf00ad16beebdf7dedc3783125c317ddad4300 Mon Sep 17 00:00:00 2001 From: Alan Mantoux Date: Mon, 12 Aug 2024 09:49:40 +0200 Subject: [PATCH 2/2] Add tests --- .../fleather/test/widgets/editor_test.dart | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/fleather/test/widgets/editor_test.dart b/packages/fleather/test/widgets/editor_test.dart index 29272c54..144c2ddb 100644 --- a/packages/fleather/test/widgets/editor_test.dart +++ b/packages/fleather/test/widgets/editor_test.dart @@ -351,6 +351,35 @@ void main() { expect(sentData?.delta, Delta()..insert('t T')); }); + testWidgets( + 'Copy sends correct data to clipboard manager when selection extents are inverted', + (tester) async { + prepareClipboard(); + FleatherClipboardData? sentData; + final editor = EditorSandBox( + tester: tester, + document: ParchmentDocument.fromJson([ + {'insert': 'Test Text\n'} + ]), + autofocus: true, + clipboardManager: FleatherCustomClipboardManager( + getData: () => throw UnimplementedError(), + setData: (data) async => sentData = data, + ), + ); + await editor.pump(); + final RawEditorState state = + tester.state(find.byType(RawEditor)); + await editor.updateSelection(base: 6, extent: 3); + state.showToolbar(createIfNull: true); + await tester.pump(); + final finder = find.text('Copy'); + await tester.tap(finder); + await tester.pumpAndSettle(throttleDuration); + expect(sentData?.plainText, 't T'); + expect(sentData?.delta, Delta()..insert('t T')); + }); + testWidgets('Cut intent sends data to clipboard manager', (tester) async { prepareClipboard(); FleatherClipboardData? sentData;