From d4607aa5cb9cafa4eeafc4966072b795e23a1bb6 Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Tue, 15 Aug 2023 14:26:49 +0200 Subject: [PATCH] Reset editing delta state when replacing editing state (flutter/engine#44595) Fixes https://github.com/flutter/flutter/issues/131023 Likely needs a test. *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].* ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide] and the [C++, Objective-C, Java style guides]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I added new tests to check the change I am making or feature I am adding, or Hixie said the PR is test-exempt. See [testing the engine] for instructions on writing and running engine tests. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I signed the [CLA]. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview [Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene [Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style [testing the engine]: https://github.com/flutter/flutter/wiki/Testing-the-engine [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/wiki/Chat --- .../src/engine/text_editing/text_editing.dart | 4 ++-- .../web_ui/test/engine/text_editing_test.dart | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/text_editing.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/text_editing.dart index c3281967720..8286a511d6e 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/text_editing.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/text_editing.dart @@ -1393,9 +1393,9 @@ abstract class DefaultTextEditingStrategy with CompositionAwareMixin implements lastEditingState = newEditingState; _editingDeltaState = newTextEditingDeltaState; onChange!(lastEditingState, _editingDeltaState); - // Flush delta after it has been sent to framework. - _editingDeltaState = null; } + // Flush delta state. + _editingDeltaState = null; } void handleBeforeInput(DomEvent event) { diff --git a/engine/src/flutter/lib/web_ui/test/engine/text_editing_test.dart b/engine/src/flutter/lib/web_ui/test/engine/text_editing_test.dart index 2bc1b071035..3ba4ca7ec2d 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/text_editing_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/text_editing_test.dart @@ -2793,6 +2793,26 @@ Future testMain() async { expect(textEditingDeltaState.composingOffset, -1); expect(textEditingDeltaState.composingExtent, -1); }); + + test('Delta state is cleared after setting editing state', (){ + editingStrategy!.enable( + multilineConfig, + onChange: trackEditingState, + onAction: trackInputAction, + ); + final DomHTMLInputElement input = editingStrategy!.domElement! as DomHTMLInputElement; + input.value = 'foo bar'; + input.dispatchEvent(createDomEvent('Event', 'input')); + expect( + lastEditingState, + EditingState(text: 'foo bar', baseOffset: 7, extentOffset: 7), + ); + expect(editingStrategy!.editingDeltaState.oldText, 'foo bar'); + + editingStrategy!.setEditingState(EditingState(text: 'foo bar baz', baseOffset: 11, extentOffset: 11)); + input.dispatchEvent(createDomEvent('Event', 'input')); + expect(editingStrategy?.editingDeltaState.oldText, 'foo bar baz'); + }); }); group('text editing styles', () {