8354646: java.awt.TextField allows to identify the spaces in a password when double clicked at the starting and end of the text

Reviewed-by: aivanov, kizune, tr, psadhukhan
This commit is contained in:
jeremy 2025-06-12 16:11:35 +00:00 committed by Alexander Zuev
parent 3c53057fa6
commit 8d33ea7395
5 changed files with 115 additions and 39 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -91,23 +91,4 @@ public class BasicPasswordFieldUI extends BasicTextFieldUI {
public View create(Element elem) {
return new PasswordView(elem);
}
/**
* Create the action map for Password Field. This map provides
* same actions for double mouse click and
* and for triple mouse click (see bug 4231444).
*/
ActionMap createActionMap() {
ActionMap map = super.createActionMap();
if (map.get(DefaultEditorKit.selectWordAction) != null) {
Action a = map.get(DefaultEditorKit.selectLineAction);
if (a != null) {
map.remove(DefaultEditorKit.selectWordAction);
map.put(DefaultEditorKit.selectWordAction, a);
}
}
return map;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -647,6 +647,22 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory {
TransferHandler.getCopyAction());
map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
TransferHandler.getPasteAction());
if (getComponent() instanceof JPasswordField) {
// Edit the action map for Password Field. This map provides
// same actions for double mouse click and
// and for triple mouse click (see bugs 4231444, 8354646).
if (map.get(DefaultEditorKit.selectWordAction) != null) {
map.remove(DefaultEditorKit.selectWordAction);
Action a = map.get(DefaultEditorKit.selectLineAction);
if (a != null) {
map.put(DefaultEditorKit.selectWordAction, a);
}
}
}
return map;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -108,19 +108,4 @@ public class SynthPasswordFieldUI extends SynthTextFieldUI {
int y, int w, int h) {
context.getPainter().paintPasswordFieldBorder(context, g, x, y, w, h);
}
/**
* {@inheritDoc}
*/
@Override
protected void installKeyboardActions() {
super.installKeyboardActions();
ActionMap map = SwingUtilities.getUIActionMap(getComponent());
if (map != null && map.get(DefaultEditorKit.selectWordAction) != null) {
Action a = map.get(DefaultEditorKit.selectLineAction);
if (a != null) {
map.put(DefaultEditorKit.selectWordAction, a);
}
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -30,7 +30,7 @@ import jdk.test.lib.Platform;
/*
* @test
* @bug 6191897
* @bug 6191897 8354646
* @summary Verifies that ctrl+left/right does not move word-by-word in a TextField
* with echo character set
* @library /java/awt/regtesthelpers /test/lib

View File

@ -0,0 +1,94 @@
/*
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @key headful
* @bug 4231444 8354646
* @summary Password fields' ActionMap needs to replace
* DefaultEditorKit.selectWordAction with
* DefaultEditorKit.selectLineAction.
*
* @run main PasswordSelectionWordTest
*/
import javax.swing.Action;
import javax.swing.JPasswordField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.basic.BasicTextUI;
import javax.swing.text.DefaultEditorKit;
import java.awt.event.ActionEvent;
public class PasswordSelectionWordTest {
public static void main(String[] args) throws Exception {
for (UIManager.LookAndFeelInfo laf :
UIManager.getInstalledLookAndFeels()) {
System.out.println("Testing LAF: " + laf.getClassName());
SwingUtilities.invokeAndWait(() -> {
if (setLookAndFeel(laf)) {
runTest();
}
});
}
}
private static boolean setLookAndFeel(UIManager.LookAndFeelInfo laf) {
try {
UIManager.setLookAndFeel(laf.getClassName());
return true;
} catch (UnsupportedLookAndFeelException e) {
System.err.println("Skipping unsupported look and feel:");
e.printStackTrace();
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void runTest() {
String str = "one two three";
JPasswordField field = new JPasswordField(str);
if (!(field.getUI() instanceof BasicTextUI)) {
throw new RuntimeException("Unexpected condition: JPasswordField UI was " + field.getUI());
}
System.out.println("Testing " + field.getUI());
// do something (anything) to initialize the Views:
field.setSize(100, 100);
field.addNotify();
Action action = field.getActionMap().get(
DefaultEditorKit.selectWordAction);
action.actionPerformed(new ActionEvent(field, 0, ""));
int selectionStart = field.getSelectionStart();
int selectionEnd = field.getSelectionEnd();
System.out.println("selectionStart = " + selectionStart);
System.out.println("selectionEnd = " + selectionEnd);
if (selectionStart != 0 || selectionEnd != str.length()) {
throw new RuntimeException("selectionStart = " + selectionStart +
" and selectionEnd = " + selectionEnd);
}
}
}