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,456 @@
|
|||
/*
|
||||
* 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.setVisible() method.
|
||||
@library ../../regtesthelpers
|
||||
@build Util
|
||||
@run main AutoRequestFocusSetVisibleTest
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
|
||||
public class AutoRequestFocusSetVisibleTest {
|
||||
static Frame focusedFrame;
|
||||
static Button focusOwner;
|
||||
static Frame frame;
|
||||
static Button frameButton;
|
||||
static Frame frame2;
|
||||
static Button frameButton2;
|
||||
static Window window;
|
||||
static Button winButton;
|
||||
static Window ownedWindow;
|
||||
static Button ownWinButton;
|
||||
static Dialog ownedDialog;
|
||||
static Button ownDlgButton;
|
||||
static Dialog dialog;
|
||||
static Button dlgButton;
|
||||
|
||||
static String toolkitClassName;
|
||||
static Robot robot = Util.createRobot();
|
||||
|
||||
public static void main(String[] args) {
|
||||
AutoRequestFocusSetVisibleTest app = new AutoRequestFocusSetVisibleTest();
|
||||
app.init();
|
||||
app.start();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
toolkitClassName = Toolkit.getDefaultToolkit().getClass().getName();
|
||||
}
|
||||
|
||||
void recreateGUI() {
|
||||
if (focusedFrame != null) {
|
||||
focusedFrame.dispose();
|
||||
frame.dispose();
|
||||
frame2.dispose();
|
||||
window.dispose();
|
||||
ownedWindow.dispose();
|
||||
ownedDialog.dispose();
|
||||
dialog.dispose();
|
||||
}
|
||||
|
||||
focusedFrame = new Frame("Base Frame");
|
||||
focusOwner = new Button("button");
|
||||
|
||||
frame = new Frame("Test Frame");
|
||||
frameButton = new Button("button");
|
||||
|
||||
frame2 = new Frame("Test Frame");
|
||||
frameButton2 = new Button("button");
|
||||
|
||||
window = new Window(focusedFrame);
|
||||
winButton = new Button("button");
|
||||
|
||||
ownedWindow = new Window(frame) {
|
||||
/*
|
||||
* When 'frame' is shown along with the 'ownedWindow'
|
||||
* (i.e. showWithParent==true) then it can appear
|
||||
* that the 'ownedWindow' is shown too early and
|
||||
* it can't be focused due to its owner can't be
|
||||
* yet activated. So, to avoid this race, we pospone
|
||||
* a little the showing of the 'ownedWindow'.
|
||||
*/
|
||||
public void show() {
|
||||
robot.delay(100);
|
||||
super.show();
|
||||
}
|
||||
};
|
||||
ownWinButton = new Button("button");
|
||||
|
||||
ownedDialog = new Dialog(frame2);
|
||||
ownDlgButton = new Button("button");
|
||||
|
||||
dialog = new Dialog(focusedFrame, "Test Dialog");
|
||||
dlgButton = new Button("button");
|
||||
|
||||
focusedFrame.add(focusOwner);
|
||||
focusedFrame.setBounds(100, 100, 300, 300);
|
||||
|
||||
frame.setBounds(140, 140, 220, 220);
|
||||
frame.add(frameButton);
|
||||
|
||||
frame2.setBounds(140, 140, 220, 220);
|
||||
frame2.add(frameButton2);
|
||||
|
||||
window.setBounds(140, 140, 220, 220);
|
||||
window.add(winButton);
|
||||
|
||||
ownedWindow.setBounds(180, 180, 140, 140);
|
||||
ownedWindow.add(ownWinButton);
|
||||
|
||||
ownedDialog.setBounds(180, 180, 140, 140);
|
||||
ownedDialog.add(ownDlgButton);
|
||||
|
||||
dialog.setBounds(140, 140, 220, 220);
|
||||
dialog.add(dlgButton);
|
||||
}
|
||||
|
||||
public void start() {
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// 1. Show Frame with owned modal Dialog without delay.
|
||||
// Check that the Dialog takes focus.
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
|
||||
System.out.println("Stage 1 in progress...");
|
||||
|
||||
dialog.setModal(true);
|
||||
dialog.setAutoRequestFocus(false);
|
||||
setVisible(focusedFrame, true);
|
||||
|
||||
TestHelper.invokeLaterAndWait(new Runnable() {
|
||||
public void run() {
|
||||
dialog.setVisible(true);
|
||||
}
|
||||
}, robot);
|
||||
|
||||
if (focusOwner.hasFocus()) {
|
||||
throw new TestFailedException("the modal dialog must gain focus but it didn't!");
|
||||
}
|
||||
setVisible(dialog, false);
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// 2. Show Frame, activate, auto hide, auto show.
|
||||
// Check that the Frame takes focus.
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
|
||||
System.out.println("Stage 2 in progress...");
|
||||
|
||||
setVisible(focusedFrame, false);
|
||||
|
||||
focusedFrame.setAutoRequestFocus(false);
|
||||
setVisible(focusedFrame, true);
|
||||
|
||||
Util.clickOnTitle(focusedFrame, robot);
|
||||
Util.waitForIdle(robot);
|
||||
|
||||
if (!focusedFrame.isFocused()) {
|
||||
throw new Error("Test error: the frame couldn't be focused.");
|
||||
}
|
||||
|
||||
focusedFrame.setExtendedState(Frame.ICONIFIED);
|
||||
Util.waitForIdle(robot);
|
||||
focusedFrame.setExtendedState(Frame.NORMAL);
|
||||
Util.waitForIdle(robot);
|
||||
|
||||
if (!focusedFrame.isFocused()) {
|
||||
throw new TestFailedException("the restored frame must gain focus but it didn't!");
|
||||
}
|
||||
|
||||
|
||||
////////////////////////
|
||||
// 3.1 Show Frame normal.
|
||||
////////////////////////
|
||||
|
||||
recreateGUI();
|
||||
|
||||
test("Stage 3.1 in progress...", frame, frameButton);
|
||||
|
||||
|
||||
// 3.2. Show Frame maximized both.
|
||||
/////////////////////////////////
|
||||
|
||||
if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
|
||||
System.out.println("Stage 3.2: Frame.MAXIMIZED_BOTH not supported. Skipping.");
|
||||
} else {
|
||||
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
|
||||
|
||||
test("Stage 3.2 in progress...", frame, frameButton);
|
||||
}
|
||||
|
||||
|
||||
// 3.3. Show Frame maximized vertically.
|
||||
///////////////////////////////////////
|
||||
|
||||
if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_VERT)) {
|
||||
System.out.println("Stage 3.3: Frame.MAXIMIZED_VERT not supported. Skipping.");
|
||||
} else {
|
||||
frame.setExtendedState(Frame.MAXIMIZED_VERT);
|
||||
|
||||
test("Stage 3.3 in progress...", frame, frameButton);
|
||||
}
|
||||
|
||||
|
||||
// 3.4. Show Frame maximized horizontally.
|
||||
/////////////////////////////////////////
|
||||
|
||||
if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_HORIZ)) {
|
||||
System.out.println("Stage 3.4: Frame.MAXIMIZED_HORIZ not supported. Skipping.");
|
||||
} else {
|
||||
frame.setExtendedState(Frame.MAXIMIZED_HORIZ);
|
||||
|
||||
test("Stage 3.4 in progress...", frame, frameButton);
|
||||
}
|
||||
|
||||
|
||||
// 3.5. Show Frame iconified.
|
||||
////////////////////////////
|
||||
|
||||
if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.ICONIFIED)) {
|
||||
System.out.println("Stage 3.5: Frame.ICONIFIED not supported. Skipping.");
|
||||
} else {
|
||||
frame.setExtendedState(Frame.ICONIFIED);
|
||||
|
||||
test("Stage 3.5 in progress...", frame, frameButton);
|
||||
}
|
||||
|
||||
|
||||
///////////////////
|
||||
// 4.1 Show Window.
|
||||
///////////////////
|
||||
recreateGUI();
|
||||
test("Stage 4.1 in progress...", window, winButton);
|
||||
|
||||
|
||||
// 4.2 Show Dialog.
|
||||
//////////////////
|
||||
|
||||
test("Stage 4.2 in progress...", dialog, dlgButton);
|
||||
|
||||
|
||||
// 4.3. Show modal Dialog.
|
||||
/////////////////////////
|
||||
|
||||
dialog.setModal(true);
|
||||
test("Stage 4.3 in progress...", dialog, dlgButton, true);
|
||||
|
||||
|
||||
///////////////////////////////////
|
||||
// 5.1 Show Frame with owned Window.
|
||||
///////////////////////////////////
|
||||
|
||||
// On Windows, an owned Window will not be focused on its showing
|
||||
// if the owner is not currently active.
|
||||
if ("sun.awt.windows.WToolkit".equals(toolkitClassName)) {
|
||||
System.out.println("Stage 5.1 - Skiping.");
|
||||
} else {
|
||||
setVisible(ownedWindow, true);
|
||||
setVisible(frame, false); // 'ownedWindow' will be shown along with the owner.
|
||||
|
||||
test("Stage 5.1 in progress...", frame, ownedWindow, ownWinButton, true);
|
||||
}
|
||||
|
||||
|
||||
// 5.2 Show Frame with owned Dialog.
|
||||
///////////////////////////////////
|
||||
|
||||
setVisible(ownedDialog, true);
|
||||
setVisible(frame2, false); // 'ownedDialog' will be shown along with the owner.
|
||||
|
||||
test("Stage 5.2 in progress...", frame2, ownedDialog, ownDlgButton, true);
|
||||
|
||||
|
||||
///////////////////////////////////
|
||||
// 6. Show unblocking modal Dialog.
|
||||
///////////////////////////////////
|
||||
|
||||
System.out.println("Stage 6 in progress...");
|
||||
|
||||
// ---
|
||||
// Testing the bug of activating invisible modal Dialog (awt_Window::SetAndActivateModalBlocker).
|
||||
// Having some window not excluded from modality, so that it would be blocked.
|
||||
Frame f = new Frame("Aux. Frame");
|
||||
f.setSize(100, 100);
|
||||
setVisible(f, true);
|
||||
// ---
|
||||
|
||||
setVisible(focusedFrame, true);
|
||||
if (!focusOwner.hasFocus()) {
|
||||
Util.clickOnComp(focusOwner, robot);
|
||||
Util.waitForIdle(robot);
|
||||
if (!focusOwner.hasFocus()) {
|
||||
throw new Error("Test error: the frame couldn't be focused.");
|
||||
}
|
||||
}
|
||||
|
||||
dialog.setModal(true);
|
||||
dialog.setAutoRequestFocus(false);
|
||||
focusedFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
|
||||
|
||||
TestHelper.invokeLaterAndWait(new Runnable() {
|
||||
public void run() {
|
||||
dialog.setVisible(true);
|
||||
}
|
||||
}, robot);
|
||||
|
||||
if (dialog.isFocused()) {
|
||||
throw new TestFailedException("the unblocking dialog shouldn't gain focus but it did!");
|
||||
}
|
||||
setVisible(dialog, false);
|
||||
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
/*
|
||||
* @param msg notifies test stage number
|
||||
* @param showWindow a window to show/test (if ownedWindow == null)
|
||||
* @param ownedWindow an owned window to show/test, or null if showWindow should be tested
|
||||
* @param clickButton a button of the window (owner or owned) expected to be on the top of stack order
|
||||
* @param shouldFocusChange true the test window should gain focus
|
||||
*/
|
||||
void test(String msg, final Window showWindow, Window ownedWindow, final Button clickButton, boolean shouldFocusChange) {
|
||||
Window testWindow = (ownedWindow == null ? showWindow : ownedWindow);
|
||||
|
||||
System.out.println(msg);
|
||||
|
||||
if (showWindow.isVisible()) {
|
||||
showWindow.dispose();
|
||||
Util.waitForIdle(robot);
|
||||
}
|
||||
if (!focusedFrame.isVisible()) {
|
||||
setVisible(focusedFrame, true);
|
||||
}
|
||||
if (!focusOwner.hasFocus()) {
|
||||
Util.clickOnComp(focusOwner, robot);
|
||||
Util.waitForIdle(robot);
|
||||
if (!focusOwner.hasFocus()) {
|
||||
throw new Error("Test error: the frame couldn't be focused.");
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
// Test focus change on showing the window
|
||||
//////////////////////////////////////////
|
||||
|
||||
final Runnable showAction = new Runnable() {
|
||||
public void run() {
|
||||
showWindow.setAutoRequestFocus(false);
|
||||
showWindow.setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
final Runnable trackerAction = new Runnable() {
|
||||
public void run() {
|
||||
if (showWindow instanceof Dialog && ((Dialog)showWindow).isModal()) {
|
||||
TestHelper.invokeLaterAndWait(showAction, robot);
|
||||
} else {
|
||||
showAction.run();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (shouldFocusChange) {
|
||||
trackerAction.run();
|
||||
Util.waitForIdle(robot);
|
||||
|
||||
if (!testWindow.isFocused()) {
|
||||
throw new TestFailedException("the window must gain focus but it didn't!");
|
||||
}
|
||||
|
||||
} else if (TestHelper.trackFocusChangeFor(trackerAction, robot)) {
|
||||
throw new TestFailedException("the window shouldn't gain focus but it did!");
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////
|
||||
// Test that the window was shown on the top.
|
||||
// Test that it can be focused.
|
||||
////////////////////////////////////////////
|
||||
|
||||
if (!(testWindow instanceof Frame) ||
|
||||
((Frame)testWindow).getExtendedState() != Frame.ICONIFIED)
|
||||
{
|
||||
boolean performed = Util.trackActionPerformed(clickButton, new Runnable() {
|
||||
public void run() {
|
||||
/*
|
||||
* If 'showWindow' is not on the top then
|
||||
* 'focusOwner' button completely overlaps 'clickButton'
|
||||
* and we won't catch the action.
|
||||
*/
|
||||
Util.clickOnComp(clickButton, robot);
|
||||
}
|
||||
}, 1000, false);
|
||||
|
||||
if (!performed) {
|
||||
// In case of loosing ACTION_PERFORMED, try once more.
|
||||
System.out.println("(ACTION_EVENT was not generated. One more attemp.)");
|
||||
performed = Util.trackActionPerformed(clickButton, new Runnable() {
|
||||
public void run() {
|
||||
Util.clickOnComp(clickButton, robot);
|
||||
}
|
||||
}, 1000, false);
|
||||
|
||||
if (!performed) {
|
||||
throw new TestFailedException("the window shown is not on the top!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
recreateGUI();
|
||||
}
|
||||
|
||||
void test(String msg, final Window showWindow, Button clickButton) {
|
||||
test(msg, showWindow, null, clickButton, false);
|
||||
}
|
||||
void test(String msg, final Window showWindow, Button clickButton, boolean shouldFocusChange) {
|
||||
test(msg, showWindow, null, clickButton, shouldFocusChange);
|
||||
}
|
||||
void test(String msg, final Window showWindow, Window ownedWindow, Button clickButton) {
|
||||
test(msg, showWindow, ownedWindow, clickButton, false);
|
||||
}
|
||||
|
||||
private static void setVisible(Window w, boolean b) {
|
||||
w.setVisible(b);
|
||||
try {
|
||||
Util.waitForIdle(robot);
|
||||
} catch (RuntimeException rte) { // InfiniteLoop
|
||||
rte.printStackTrace();
|
||||
}
|
||||
robot.delay(200);
|
||||
}
|
||||
}
|
||||
|
||||
class TestFailedException extends RuntimeException {
|
||||
TestFailedException(String msg) {
|
||||
super("Test failed: " + msg);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue