From 1cfd4bf44a620d496e9ea7b3e306e727429f65a2 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 18 Jun 2021 21:19:02 +0200 Subject: [PATCH] Web: add support for TextInputType.none (flutter/engine#26573) --- .../lib/src/engine/text_editing/input_type.dart | 16 +++++++++++++++- .../src/engine/text_editing/text_editing.dart | 4 ++++ .../lib/web_ui/test/text_editing_test.dart | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/input_type.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/input_type.dart index b053a5c1791..4f401b58124 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/input_type.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/input_type.dart @@ -25,12 +25,17 @@ abstract class EngineInputType { return url; case 'TextInputType.multiline': return multiline; + case 'TextInputType.none': + return none; case 'TextInputType.text': default: return text; } } + /// No text input. + static const NoTextInputType none = NoTextInputType(); + /// Single-line text input type. static const TextInputType text = TextInputType(); @@ -76,12 +81,21 @@ abstract class EngineInputType { // Only apply `inputmode` in mobile browsers so that the right virtual // keyboard shows up. if (operatingSystem == OperatingSystem.iOs || - operatingSystem == OperatingSystem.android) { + operatingSystem == OperatingSystem.android || + inputmodeAttribute == EngineInputType.none.inputmodeAttribute) { domElement.setAttribute('inputmode', inputmodeAttribute!); } } } +/// No text input. +class NoTextInputType extends EngineInputType { + const NoTextInputType(); + + @override + final String inputmodeAttribute = 'none'; +} + /// Single-line text input type. class TextInputType extends EngineInputType { const TextInputType(); 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 f394efbd34c..b065fe6166a 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 @@ -860,6 +860,10 @@ abstract class DefaultTextEditingStrategy implements TextEditingStrategy { activeDomElement.setAttribute('type', 'password'); } + if (config.inputType == EngineInputType.none) { + activeDomElement.setAttribute('inputmode', 'none'); + } + config.autofill?.applyToDomElement(activeDomElement, focusedElement: true); final String autocorrectValue = config.autocorrect ? 'on' : 'off'; diff --git a/engine/src/flutter/lib/web_ui/test/text_editing_test.dart b/engine/src/flutter/lib/web_ui/test/text_editing_test.dart index 44db0a3dc53..e7360b8a3b5 100644 --- a/engine/src/flutter/lib/web_ui/test/text_editing_test.dart +++ b/engine/src/flutter/lib/web_ui/test/text_editing_test.dart @@ -1580,6 +1580,9 @@ void testMain() { showKeyboard(inputType: 'url'); expect(getEditingInputMode(), 'url'); + showKeyboard(inputType: 'none'); + expect(getEditingInputMode(), 'none'); + hideKeyboard(); }); @@ -1612,6 +1615,9 @@ void testMain() { showKeyboard(inputType: 'url'); expect(getEditingInputMode(), 'url'); + showKeyboard(inputType: 'none'); + expect(getEditingInputMode(), 'none'); + hideKeyboard(); } });