diff -r d64ae7c1d70f -r 2cd2d387fcd2 test/jdk/javax/swing/text/DefaultCaret/HidingSelection/HidingSelectionTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/javax/swing/text/DefaultCaret/HidingSelection/HidingSelectionTest.java Tue Oct 24 08:37:11 2017 -0700 @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2017, 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. + */ + +import javax.swing.*; +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.image.BufferedImage; + +/** + * @test + * @bug 8188081 + * @summary Text selection does not clear after focus is lost + * @run main HidingSelectionTest + */ + +public class HidingSelectionTest { + + private static JTextField field1; + private static JTextField field2; + private static JFrame frame; + private static Rectangle bounds; + private static JMenu menu; + private static JTextField anotherWindow; + private static Point menuLoc; + private static JFrame frame2; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame(); + field1 = new JTextField("field1 "); + field2 = new JTextField("field2 "); + field1.setEditable(false); + field2.setEditable(false); + frame.getContentPane().setLayout(new FlowLayout()); + frame.getContentPane().add(field1); + frame.getContentPane().add(field2); + JMenuBar menuBar = new JMenuBar(); + menu = new JMenu("menu"); + menu.add(new JMenuItem("item")); + menuBar.add(menu); + frame.setJMenuBar(menuBar); + frame.pack(); + frame.setVisible(true); + }); + + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(200); + SwingUtilities.invokeAndWait(() -> { + bounds = field2.getBounds(); + bounds.setLocation(field2.getLocationOnScreen()); + }); + BufferedImage nosel = robot.createScreenCapture(bounds); + + SwingUtilities.invokeAndWait(field2::requestFocus); + SwingUtilities.invokeAndWait(field2::selectAll); + robot.waitForIdle(); + robot.delay(200); + BufferedImage sel = robot.createScreenCapture(bounds); + + SwingUtilities.invokeAndWait(() -> { + menuLoc = menu.getLocationOnScreen(); + menuLoc.translate(10, 10); + }); + robot.mouseMove(menuLoc.x, menuLoc.y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(50); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(200); + if (!biEqual(robot.createScreenCapture(bounds), sel)) { + throw new RuntimeException("Test fails: menu hides selection"); + } + + SwingUtilities.invokeAndWait( + MenuSelectionManager.defaultManager()::clearSelectedPath); + SwingUtilities.invokeAndWait(field1::requestFocus); + robot.waitForIdle(); + robot.delay(200); + if (!biEqual(robot.createScreenCapture(bounds), nosel)) { + throw new RuntimeException( + "Test fails: focus lost doesn't hide selection"); + } + + SwingUtilities.invokeAndWait(field2::requestFocus); + robot.waitForIdle(); + SwingUtilities.invokeAndWait(() ->{ + frame2 = new JFrame(); + Point loc = frame.getLocationOnScreen(); + loc.translate(0, frame.getHeight()); + frame2.setLocation(loc); + anotherWindow = new JTextField("textField3"); + frame2.add(anotherWindow); + frame2.pack(); + frame2.setVisible(true); + }); + robot.waitForIdle(); + SwingUtilities.invokeAndWait(anotherWindow::requestFocus); + robot.waitForIdle(); + robot.delay(200); + if (biEqual(robot.createScreenCapture(bounds), nosel)) { + throw new RuntimeException( + "Test fails: switch window hides selection"); + } + + SwingUtilities.invokeAndWait(anotherWindow::selectAll); + robot.waitForIdle(); + robot.delay(200); + if (biEqual(robot.createScreenCapture(bounds), sel)) { + throw new RuntimeException( + "Test fails: selection ownership is lost selection is shown"); + } + + SwingUtilities.invokeLater(frame2::dispose); + SwingUtilities.invokeLater(frame::dispose); + } + + static boolean biEqual(BufferedImage i1, BufferedImage i2) { + if (i1.getWidth() == i2.getWidth() && + i1.getHeight() == i2.getHeight()) { + for (int x = 0; x < i1.getWidth(); x++) { + for (int y = 0; y < i1.getHeight(); y++) { + if (i1.getRGB(x, y) != i2.getRGB(x, y)) { + return false; + } + } + } + return true; + } + return false; + } +}