diff --git a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart index b131a08fa153fa3379cb9d578d1d13e1208d1db9..d2a7eb0c6cf232704d86188d2230cfd4d2c34e4f 100644 --- a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart +++ b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart @@ -373,7 +373,11 @@ class AutofillInfo { /// The current text and selection state of a text field. @visibleForTesting class EditingState { - EditingState({this.text, this.baseOffset = 0, this.extentOffset = 0}); + EditingState({this.text, int? baseOffset, int? extentOffset}) : + // Don't allow negative numbers. Pick the smallest selection index for base. + baseOffset = math.max(0, math.min(baseOffset ?? 0, extentOffset ?? 0)), + // Don't allow negative numbers. Pick the greatest selection index for extent. + extentOffset = math.max(0, math.max(baseOffset ?? 0, extentOffset ?? 0)); /// Creates an [EditingState] instance using values from an editing state Map /// coming from Flutter. @@ -401,9 +405,10 @@ class EditingState { final String? text = flutterEditingState['text']; return EditingState( - text: text, - baseOffset: math.max(0, selectionBase), - extentOffset: math.max(0, selectionExtent)); + text: text, + baseOffset: selectionBase, + extentOffset: selectionExtent, + ); } /// Creates an [EditingState] instance using values from the editing element diff --git a/lib/web_ui/test/text_editing_test.dart b/lib/web_ui/test/text_editing_test.dart index efcf24df89585d7882cf2a487240c82e66bd111e..d573b1dbcacacc7f33d96681127bacf4a72d8ee5 100644 --- a/lib/web_ui/test/text_editing_test.dart +++ b/lib/web_ui/test/text_editing_test.dart @@ -2095,6 +2095,24 @@ void testMain() { ); }); + test('Fix flipped base and extent offsets', () { + expect( + EditingState(baseOffset: 10, extentOffset: 4), + EditingState(baseOffset: 4, extentOffset: 10), + ); + + expect( + EditingState.fromFrameworkMessage({ + 'selectionBase': 10, + 'selectionExtent': 4, + }), + EditingState.fromFrameworkMessage({ + 'selectionBase': 4, + 'selectionExtent': 10, + }), + ); + }); + test('Configure input element from the editing state', () { final InputElement input = document.getElementsByTagName('input')[0]; _editingState =