[Web] Fix extra new line when inputAction is not newline for a multil… (#53453)
## Description
This PR prevents new line key event from being dispatched for a multiline text field when `TextField.textInputAction` is not `TextInputAction.newline`.
Since https://github.com/flutter/engine/pull/33428, web engine does not prevent new line key events.
In https://github.com/flutter/engine/pull/36893, I fixed a similar issue for single line text fields. At that time I was not sure if we want to fix it for multiline text fields. I checked again on non-web platforms (macos, iOS, Android) and the new line is not added if the input action is not `TextInputAction.newline`.
For a **multiline field**, the default text input action is `TextInputAction.newline`.
If the developer sets text input action to another value:
- before this PR, the action is performed and a new line is added.
- after this PR, the action is performed but no new line is added.
## Related Issue
Fixes https://github.com/flutter/flutter/issues/145051
## Tests
Adds 1 tests, updates 3 tests.
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 98b3400..f1c45b4 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
@@ -1508,10 +1508,11 @@
final DomKeyboardEvent event = e as DomKeyboardEvent;
if (event.keyCode == _kReturnKeyCode) {
onAction!(inputConfiguration.inputAction);
- // Prevent the browser from inserting a new line when it's not a multiline input.
- if (inputConfiguration.inputType is! MultilineInputType) {
- event.preventDefault();
+ if (inputConfiguration.inputType is MultilineInputType && inputConfiguration.inputAction == 'TextInputAction.newline' ) {
+ return;
}
+ // Prevent the browser from inserting a new line.
+ event.preventDefault();
}
}
}
diff --git a/lib/web_ui/test/engine/text_editing_test.dart b/lib/web_ui/test/engine/text_editing_test.dart
index 49b7622..bea5f02 100644
--- a/lib/web_ui/test/engine/text_editing_test.dart
+++ b/lib/web_ui/test/engine/text_editing_test.dart
@@ -494,7 +494,35 @@
// Input action is triggered!
expect(lastInputAction, 'TextInputAction.done');
- // And default behavior of keyboard event shouldn't have been prevented.
+ // And default behavior of keyboard event should have been prevented.
+ // Only TextInputAction.newline should not prevent default behavior
+ // for a multiline field.
+ expect(event.defaultPrevented, isTrue);
+ });
+
+ test('Does not prevent default behavior when TextInputAction.newline', () {
+ // Regression test for https://github.com/flutter/flutter/issues/145051.
+ final InputConfiguration config = InputConfiguration(
+ viewId: kImplicitViewId,
+ inputAction: 'TextInputAction.newline',
+ inputType: EngineInputType.multilineNone,
+ );
+ editingStrategy!.enable(
+ config,
+ onChange: trackEditingState,
+ onAction: trackInputAction,
+ );
+
+ // No input action so far.
+ expect(lastInputAction, isNull);
+
+ final DomKeyboardEvent event = dispatchKeyboardEvent(
+ editingStrategy!.domElement!,
+ 'keydown',
+ keyCode: _kReturnKeyCode,
+ );
+ expect(lastInputAction, 'TextInputAction.newline');
+ // And default behavior of keyboard event should't have been prevented.
expect(event.defaultPrevented, isFalse);
});
@@ -520,8 +548,10 @@
// Input action is triggered!
expect(lastInputAction, 'TextInputAction.done');
- // And default behavior of keyboard event shouldn't have been prevented.
- expect(event.defaultPrevented, isFalse);
+ // And default behavior of keyboard event should have been prevented.
+ // Only TextInputAction.newline should not prevent default behavior
+ // for a multiline field.
+ expect(event.defaultPrevented, isTrue);
});
test('Triggers input action and prevent new line key event for single line field', () {
@@ -2542,8 +2572,10 @@
spy.messages[0].methodArguments,
<dynamic>[clientId, 'TextInputAction.next'],
);
- // And default behavior of keyboard event shouldn't have been prevented.
- expect(event.defaultPrevented, isFalse);
+ // And default behavior of keyboard event should have been prevented.
+ // Only TextInputAction.newline should not prevent default behavior
+ // for a multiline field.
+ expect(event.defaultPrevented, isTrue);
});
test('inserts element in the correct view', () async {