undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
This commit is contained in:
commit
0a580b313d
70422 changed files with 17213626 additions and 0 deletions
|
|
@ -0,0 +1,420 @@
|
|||
/*
|
||||
* Copyright (c) 2007, 2022, 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 6187066
|
||||
@summary Tests the Window.autoRequestFocus property for the Window.toFront() method.
|
||||
@library /java/awt/patchlib ../../regtesthelpers
|
||||
@build java.desktop/java.awt.Helper
|
||||
@build Util
|
||||
@run main AutoRequestFocusToFrontTest
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
|
||||
public class AutoRequestFocusToFrontTest {
|
||||
static boolean haveDelays;
|
||||
|
||||
static Frame auxFrame;
|
||||
static Frame frame;
|
||||
static Button frameButton;
|
||||
static Frame frame2;
|
||||
static Button frameButton2;
|
||||
static Frame frame3;
|
||||
static Button frameButton3;
|
||||
static Window window;
|
||||
static Button winButton;
|
||||
static Dialog dialog;
|
||||
static Button dlgButton;
|
||||
static Window ownedWindow;
|
||||
static Button ownWinButton;
|
||||
static Dialog ownedDialog;
|
||||
static Button ownDlgButton;
|
||||
static Dialog modalDialog;
|
||||
static Button modalDlgButton;
|
||||
|
||||
static String toolkitClassName;
|
||||
static Robot robot = Util.createRobot();
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
if (args.length != 0) {
|
||||
haveDelays = "delay".equals(args[0]) ? true : false;
|
||||
}
|
||||
|
||||
AutoRequestFocusToFrontTest app = new AutoRequestFocusToFrontTest();
|
||||
app.init();
|
||||
app.start();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
toolkitClassName = Toolkit.getDefaultToolkit().getClass().getName();
|
||||
}
|
||||
|
||||
static void recreateGUI() {
|
||||
if (auxFrame != null) {
|
||||
auxFrame.dispose();
|
||||
frame.dispose();
|
||||
frame2.dispose();
|
||||
frame3.dispose();
|
||||
window.dispose();
|
||||
dialog.dispose();
|
||||
ownedWindow.dispose();
|
||||
ownedDialog.dispose();
|
||||
modalDialog.dispose();
|
||||
}
|
||||
|
||||
auxFrame = new Frame("Auxiliary Frame");
|
||||
|
||||
frame = new Frame("Test Frame");
|
||||
frameButton = new Button("button");
|
||||
|
||||
frame2 = new Frame("Test Frame 2");
|
||||
frameButton2 = new Button("button");
|
||||
|
||||
frame3 = new Frame("Test Frame 3");
|
||||
frameButton3 = new Button("button");
|
||||
|
||||
window = new Window(null);
|
||||
winButton = new Button("button");
|
||||
dialog = new Dialog((Frame)null, "Test Dialog");
|
||||
dlgButton = new Button("button");
|
||||
|
||||
ownedWindow = new Window(frame);
|
||||
ownWinButton = new Button("button");
|
||||
|
||||
ownedDialog = new Dialog(frame2, "Test Owned Dialog");
|
||||
ownDlgButton = new Button("button");
|
||||
|
||||
modalDialog = new Dialog(frame3, "Test Modal Dialog");
|
||||
modalDlgButton = new Button("button");
|
||||
|
||||
auxFrame.setBounds(100, 100, 300, 300);
|
||||
|
||||
frame.setBounds(120, 120, 260, 260);
|
||||
frame.add(frameButton);
|
||||
|
||||
frame2.setBounds(120, 120, 260, 260);
|
||||
frame2.add(frameButton2);
|
||||
|
||||
frame3.setBounds(120, 120, 260, 260);
|
||||
frame3.add(frameButton3);
|
||||
|
||||
window.setBounds(120, 120, 260, 260);
|
||||
window.add(winButton);
|
||||
|
||||
dialog.setBounds(120, 120, 260, 260);
|
||||
dialog.add(dlgButton);
|
||||
|
||||
ownedWindow.setBounds(140, 140, 220, 220);
|
||||
ownedWindow.add(ownWinButton);
|
||||
|
||||
ownedDialog.setBounds(140, 140, 220, 220);
|
||||
ownedDialog.add(ownDlgButton);
|
||||
|
||||
modalDialog.setBounds(140, 140, 220, 220);
|
||||
modalDialog.add(modalDlgButton);
|
||||
modalDialog.setModal(true);
|
||||
}
|
||||
|
||||
public void start() {
|
||||
// 1. Simple Frame.
|
||||
//////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(frame, null, null);
|
||||
Test.test("Test stage 1 in progress", frameButton);
|
||||
|
||||
|
||||
// 2. Ownerless Window.
|
||||
//////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(window, null, null);
|
||||
Test.test("Test stage 2 in progress", winButton);
|
||||
|
||||
|
||||
// 3. Ownerless Dialog.
|
||||
//////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(dialog, null, null);
|
||||
Test.test("Test stage 3 in progress", dlgButton);
|
||||
|
||||
|
||||
// 4.1. Owner Frame (with owned Window).
|
||||
///////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(frame, null, new Window[] {ownedWindow, frame});
|
||||
Test.test("Test stage 4.1 in progress", ownWinButton);
|
||||
|
||||
|
||||
// 4.2. Owned Window (with owner Frame).
|
||||
///////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(ownedWindow, null, new Window[] {ownedWindow, frame});
|
||||
Test.test("Test stage 4.2 in progress", ownWinButton);
|
||||
|
||||
|
||||
// 5.1. Owner Frame (with owned Dialog).
|
||||
///////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(frame2, null, new Window[] {ownedDialog, frame2});
|
||||
Test.test("Test stage 5.1 in progress", ownDlgButton);
|
||||
|
||||
|
||||
// 5.2. Owned Dialog (with owner Frame).
|
||||
///////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(ownedDialog, null, new Window[] {ownedDialog, frame2});
|
||||
Test.test("Test stage 5.2 in progress", ownDlgButton);
|
||||
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// 6.1. Owned modal Dialog (with owner Frame).
|
||||
// Focused frame is excluded from modality.
|
||||
////////////////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
auxFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
|
||||
|
||||
Test.setWindows(modalDialog, modalDialog, new Window[] {modalDialog, frame3});
|
||||
Test.test("Test stage 6.1 in progress", modalDlgButton);
|
||||
|
||||
|
||||
// 6.2. Owner Frame (with owned modal Dialog).
|
||||
// Focused frame is excluded from modality.
|
||||
////////////////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
auxFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
|
||||
|
||||
Test.setWindows(frame3, modalDialog, new Window[] {modalDialog, frame3});
|
||||
Test.test("Test stage 6.2 in progress", modalDlgButton, true);
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// 7. Calling setVisible(true) for the shown Frame.
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
Test.setWindows(frame, null, null);
|
||||
Test.setTestSetVisible();
|
||||
Test.test("Test stage 7 in progress", frameButton);
|
||||
|
||||
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
static class Test {
|
||||
static Window testWindow; // a window to move to front with autoRequestFocus set
|
||||
static Window focusWindow; // a window to gain focus
|
||||
static Window[] showWindows; // windows to show, or null if only testWindow should be shown
|
||||
|
||||
static boolean testSetVisible;
|
||||
|
||||
static void setWindows(Window _testWindow, Window _focusWindow, Window[] _showWindows) {
|
||||
testWindow = _testWindow;
|
||||
focusWindow = _focusWindow;
|
||||
showWindows = _showWindows;
|
||||
}
|
||||
static void setTestSetVisible() {
|
||||
testSetVisible = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* @param msg notifies test stage number
|
||||
* @param testButton a button of the window (owner or owned) that is to be on the top of stack order
|
||||
* @param shouldFocusChange true for modal dialogs
|
||||
*/
|
||||
static void test(String msg, final Button testButton, boolean shouldFocusChange) {
|
||||
System.out.println(msg);
|
||||
|
||||
showWindows(testWindow, showWindows, true);
|
||||
|
||||
pause(100);
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
// Test that calling toFront() doesn't cause focus change
|
||||
// when 'autoRequestFocus' is false.
|
||||
/////////////////////////////////////////////////////////
|
||||
|
||||
Runnable action = new Runnable() {
|
||||
public void run() {
|
||||
testWindow.setAutoRequestFocus(false);
|
||||
if (testSetVisible) {
|
||||
setVisible(testWindow, true);
|
||||
} else {
|
||||
toFront(testWindow);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (shouldFocusChange) {
|
||||
action.run();
|
||||
Util.waitForIdle(robot);
|
||||
if (!focusWindow.isFocused()) {
|
||||
throw new TestFailedException("the window must gain focus on moving to front but it didn't!");
|
||||
}
|
||||
} else if (TestHelper.trackFocusChangeFor(action, robot)) {
|
||||
throw new TestFailedException("the window shouldn't gain focus on moving to front but it did!");
|
||||
}
|
||||
|
||||
pause(100);
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// Test that the window (or its owned window) is on top.
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
// The latest versions of Metacity (e.g. 2.16) have problems with moving a window to the front.
|
||||
if (Util.getWMID() != Util.METACITY_WM) {
|
||||
|
||||
boolean performed = Util.trackActionPerformed(testButton, new Runnable() {
|
||||
public void run() {
|
||||
Util.clickOnComp(testButton, robot);
|
||||
}
|
||||
}, 1000, false);
|
||||
|
||||
if (!performed) {
|
||||
// For the case when the robot failed to trigger ACTION_EVENT.
|
||||
System.out.println("(ACTION_EVENT was not generated. One more attemp.)");
|
||||
performed = Util.trackActionPerformed(testButton, new Runnable() {
|
||||
public void run() {
|
||||
Util.clickOnComp(testButton, robot);
|
||||
}
|
||||
}, 1000, false);
|
||||
if (!performed) {
|
||||
throw new TestFailedException("the window moved to front is not on the top!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
showWindows(testWindow, showWindows, false);
|
||||
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Test that calling toFront() focuses the window
|
||||
// when 'autoRequestFocus' is true.
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
// Skip this stage for unfocusable window
|
||||
if (!testWindow.isFocusableWindow()) {
|
||||
return;
|
||||
}
|
||||
|
||||
showWindows(testWindow, showWindows, true);
|
||||
|
||||
pause(100);
|
||||
|
||||
boolean gained = Util.trackWindowGainedFocus(testWindow, new Runnable() {
|
||||
public void run() {
|
||||
testWindow.setAutoRequestFocus(true);
|
||||
if (testSetVisible) {
|
||||
setVisible(testWindow, true);
|
||||
} else {
|
||||
toFront(testWindow);
|
||||
}
|
||||
}
|
||||
}, 1000, false);
|
||||
|
||||
// Either the window or its owned window must be focused
|
||||
if (!gained && !testButton.hasFocus()) {
|
||||
throw new TestFailedException("the window should gain focus automatically but it didn't!");
|
||||
}
|
||||
|
||||
showWindows(testWindow, showWindows, false);
|
||||
}
|
||||
|
||||
static void test(String msg, Button testButton) {
|
||||
test(msg, testButton, false);
|
||||
}
|
||||
|
||||
private static void showWindows(Window win, Window[] wins, final boolean visible) {
|
||||
pause(100);
|
||||
|
||||
if (wins == null) {
|
||||
wins = new Window[] {win}; // operate with 'win'
|
||||
}
|
||||
for (final Window w: wins) {
|
||||
if (visible) {
|
||||
if ((w instanceof Dialog) && ((Dialog)w).isModal()) {
|
||||
TestHelper.invokeLaterAndWait(new Runnable() {
|
||||
public void run() {
|
||||
w.setVisible(true);
|
||||
}
|
||||
}, robot);
|
||||
} else {
|
||||
setVisible(w, true);
|
||||
}
|
||||
} else {
|
||||
w.dispose();
|
||||
}
|
||||
}
|
||||
setVisible(auxFrame, visible);
|
||||
|
||||
if (visible) {
|
||||
if (!auxFrame.isFocused()) {
|
||||
Util.clickOnTitle(auxFrame, robot);
|
||||
Util.waitForIdle(robot);
|
||||
if (!auxFrame.isFocused()) {
|
||||
throw new Error("Test error: the frame couldn't be focused.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void setVisible(Window w, boolean b) {
|
||||
w.setVisible(b);
|
||||
try {
|
||||
Util.waitForIdle(robot);
|
||||
} catch (RuntimeException rte) { // InfiniteLoop
|
||||
rte.printStackTrace();
|
||||
}
|
||||
robot.delay(200);
|
||||
}
|
||||
|
||||
private static void toFront(Window w) {
|
||||
w.toFront();
|
||||
Util.waitForIdle(robot);
|
||||
robot.delay(200);
|
||||
}
|
||||
|
||||
private static void pause(int msec) {
|
||||
if (haveDelays) {
|
||||
robot.delay(msec);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TestFailedException extends RuntimeException {
|
||||
TestFailedException(String msg) {
|
||||
super("Test failed: " + msg);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue