diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 62070f6847..b19c2eab27 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1425,7 +1425,8 @@ namespace Avalonia.Controls } else { - bool hasWholeWordModifiers = modifiers.HasAllFlags(keymap.WholeWordTextActionModifiers); + // It's not secure to rely on password field content when moving. + bool hasWholeWordModifiers = modifiers.HasAllFlags(keymap.WholeWordTextActionModifiers) && !IsPasswordBox; switch (e.Key) { case Key.Left: diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index d6b24b627f..7aacaca174 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -129,6 +129,27 @@ namespace Avalonia.Controls.UnitTests TextBox.TextProperty.GetMetadata(typeof(TextBox)).DefaultBindingMode); } + [Fact] + public void TextBox_Ignore_Word_Move_In_Password_Field() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + PasswordChar = '*', + Text = "passw0rd" + }; + + target.ApplyTemplate(); + target.Measure(Size.Infinity); + target.CaretIndex = 8; + RaiseKeyEvent(target, Key.Left, KeyModifiers.Control); + + Assert.Equal(7, target.CaretIndex); + } + } + [Fact] public void CaretIndex_Can_Moved_To_Position_After_The_End_Of_Text_With_Arrow_Key() {