Skip to content

Commit

Permalink
8307078: Opensource and clean up five more AWT Focus related tests
Browse files Browse the repository at this point in the history
Backport-of: 6d6f726b74f7fcd3e7c37d50bd2476b3e921662b
  • Loading branch information
Andrew Lu authored and TheRealMDoerr committed Aug 24, 2023
1 parent cde3cd2 commit 094cd26
Show file tree
Hide file tree
Showing 5 changed files with 965 additions and 0 deletions.
154 changes: 154 additions & 0 deletions test/jdk/java/awt/Focus/FocusForRemovedComponentTest.java
@@ -0,0 +1,154 @@
/*
* Copyright (c) 2004, 2023, 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
@bug 4722671
@summary Accessibility problem in JRE Finder
@key headful
@run main FocusForRemovedComponentTest
*/

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Robot;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.InputEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.atomic.AtomicBoolean;

public class FocusForRemovedComponentTest
implements ActionListener {
static int ACTIVATION_TIMEOUT = 2000;
static long WAIT_TIMEOUT = 3000;
volatile Frame frame;
volatile Button btnFirst;
volatile Button btnSecond;
volatile Button btnThird;

public void start() throws InterruptedException, InvocationTargetException {
try {
EventQueue.invokeAndWait(() -> {
frame = new Frame("FocusForRemovedComponentTest");
btnFirst = new Button("First Button");
btnSecond = new Button("Second Button");
btnThird = new Button("Third Button");
frame.add(btnFirst, BorderLayout.NORTH);
frame.add(btnSecond, BorderLayout.CENTER);
btnFirst.addActionListener(this);
btnFirst.requestFocusInWindow();
frame.pack();
frame.setVisible(true);
});

try {
Robot robot = new Robot();
robot.delay(ACTIVATION_TIMEOUT);
int[] location = new int[2];
EventQueue.invokeAndWait(() -> {
Point button_location = btnFirst.getLocationOnScreen();
Dimension button_size = btnFirst.getSize();
location[0] = button_location.x + button_size.width / 2;
location[1] = button_location.y + button_size.height / 2;
});
robot.mouseMove(location[0], location[1]);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

Object monitor = new Object();
final MonitoredFocusListener monitorer = new MonitoredFocusListener(monitor);
AtomicBoolean isFocused = new AtomicBoolean(false);
synchronized (monitor) {
EventQueue.invokeAndWait(() -> {
btnThird.addFocusListener(monitorer);
isFocused.set(btnThird.isFocusOwner());
});

if (!isFocused.get()) {
monitor.wait(WAIT_TIMEOUT);
EventQueue.invokeAndWait(() -> {
isFocused.set(btnThird.isFocusOwner());
});
}
}

if (!isFocused.get()) {
throw new RuntimeException("TEST FAILED. The third button is not focus owner.");
} else {
System.out.println("TEST PASSED.");
}
} catch (AWTException e) {
e.printStackTrace();
throw new RuntimeException("Some AWTException occurred.");
} catch (InterruptedException e) {
e.printStackTrace();
throw new RuntimeException("Test was interrupted.");
}
} finally {
if (frame != null) {
EventQueue.invokeAndWait(frame::dispose);
}
}
}

public void actionPerformed(ActionEvent e) {
if (btnSecond.isVisible()) {
btnFirst.setEnabled(false);
frame.remove(btnSecond);
frame.add(btnThird, BorderLayout.CENTER);
btnThird.requestFocusInWindow();
btnFirst.setEnabled(true);
frame.validate();
frame.repaint();
}
}

public static void main(String[] args) throws InterruptedException,
InvocationTargetException {
FocusForRemovedComponentTest test = new FocusForRemovedComponentTest();
test.start();
}
}

class MonitoredFocusListener extends FocusAdapter {
Object monitor;

public MonitoredFocusListener(Object monitor) {
this.monitor = monitor;
}

public void focusGained(FocusEvent fe) {
synchronized (monitor) {
monitor.notify();
}
}
}
73 changes: 73 additions & 0 deletions test/jdk/java/awt/Focus/FocusTraversalPolicyIAE.java
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2005, 2023, 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
@bug 6225100
@summary FocusTraversalPolicy.getInitialComponent does not work as expected
@run main FocusTraversalPolicyIAE
*/

import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;

public class FocusTraversalPolicyIAE {
public static void main(String[] args) {
CustomFocusTraversalPolicy cftp = new CustomFocusTraversalPolicy();
try {
cftp.getInitialComponent(null);
throw new RuntimeException("Test failed. No exceptions thrown.");
} catch (IllegalArgumentException iae) {
System.out.println("Test passed.");
} catch (NullPointerException npe) {
throw new RuntimeException("Test failed. Unexpected NPE thrown: " + npe);
} catch (Exception e) {
throw new RuntimeException("Test failed. Unexpected exception thrown: " + e);
}
}
}

class CustomFocusTraversalPolicy extends FocusTraversalPolicy {
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent) {
return null;
}

public Component getComponentBefore(Container focusCycleRoot,
Component aComponent) {
return null;
}

public Component getDefaultComponent(Container focusCycleRoot) {
return null;
}

public Component getFirstComponent(Container focusCycleRoot) {
return null;
}

public Component getLastComponent(Container focusCycleRoot) {
return null;
}
}
144 changes: 144 additions & 0 deletions test/jdk/java/awt/Focus/InitialFocusTest.java
@@ -0,0 +1,144 @@
/*
* Copyright (c) 2002, 2023, 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
@bug 4150021
@summary if user requests focus on some component, it must become a focus owner after activation
@key headful
@run main InitialFocusTest
*/

import java.awt.AWTException;
import java.awt.Button;
import java.awt.DefaultKeyboardFocusManager;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.atomic.AtomicBoolean;

public class InitialFocusTest implements PropertyChangeListener {
//Declare things used in the test, like buttons and labels here
final static String FOCUSED_WINDOW_PROP = "focusedWindow";
final static int ACTION_TIMEOUT = 2000;

volatile Frame frame;
volatile Button btn1;
volatile Button btn2;

public void start() throws InterruptedException, InvocationTargetException {
DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().
addPropertyChangeListener(FOCUSED_WINDOW_PROP, this);
try {
EventQueue.invokeAndWait(() -> {
frame = new Frame("InitialFocusTest");
frame.setLayout(new FlowLayout());
btn1 = new Button("First Button");
frame.add(btn1);
btn2 = new Button("Second Button");
frame.add(btn2);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
});
try {
Robot robot = new Robot();
robot.delay(ACTION_TIMEOUT);
if (!activateFrame(frame, robot, ACTION_TIMEOUT)) {
throw new RuntimeException("Frame was not activated.");
}
robot.delay(ACTION_TIMEOUT);
AtomicBoolean isFocused = new AtomicBoolean(false);
EventQueue.invokeAndWait(() -> {
isFocused.set(frame.isFocused());
});
if (!isFocused.get()) {
throw new RuntimeException("Frame didn't become focused.");
}
EventQueue.invokeAndWait(() -> {
isFocused.set(btn2.isFocusOwner());
});
if (!isFocused.get()) {
throw new RuntimeException("Btn2 didn't receive focus.");
}
} catch (AWTException e) {
e.printStackTrace();
}
System.out.printf("Test passed.");
} finally {
if (frame != null) {
EventQueue.invokeAndWait(frame::dispose);
}
}
}

public void propertyChange(PropertyChangeEvent pce) {
if (FOCUSED_WINDOW_PROP.equals(pce.getPropertyName())) {
if (pce.getNewValue() == frame) {
System.out.println("requesting focus on btn2");
btn2.requestFocusInWindow();
}
}
}

boolean activateFrame(Frame frame, Robot robot, int timeout)
throws InterruptedException, InvocationTargetException {
AtomicBoolean isActive = new AtomicBoolean(false);
EventQueue.invokeAndWait(() -> {
isActive.set(frame.isActive());
});
if (!isActive.get()) {
int[] point = new int[2];
EventQueue.invokeAndWait(() -> {
Point origin = frame.getLocationOnScreen();
Dimension dim = frame.getSize();
Insets insets = frame.getInsets();
point[0] = origin.x + dim.width / 2;
point[1] = origin.y + insets.top / 2;
});
robot.mouseMove(point[0], point[1]);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
robot.waitForIdle();
robot.delay(timeout);
EventQueue.invokeAndWait(() -> {
isActive.set(frame.isActive());
});
}
return frame.isActive();
}

public static void main(String[] args) throws InterruptedException,
InvocationTargetException {
InitialFocusTest test = new InitialFocusTest();
test.start();
}
}

1 comment on commit 094cd26

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.