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
324
test/jdk/java/awt/Frame/FrameStateTest/FrameStateTest.java
Normal file
324
test/jdk/java/awt/Frame/FrameStateTest/FrameStateTest.java
Normal file
|
|
@ -0,0 +1,324 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2024, 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 java.awt.Button;
|
||||
import java.awt.Checkbox;
|
||||
import java.awt.CheckboxGroup;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Frame;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.event.WindowListener;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Arrays;
|
||||
import java.util.Deque;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.Timer;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4157271
|
||||
* @summary Checks that when a Frame is created it honors the state it
|
||||
* was set to. The bug was that if setState(Frame.ICONIFIED) was
|
||||
* called before setVisible(true) the Frame would be shown in NORMAL
|
||||
* state instead of ICONIFIED.
|
||||
* @library /java/awt/regtesthelpers
|
||||
* @build PassFailJFrame
|
||||
* @run main/manual FrameStateTest
|
||||
*/
|
||||
|
||||
public class FrameStateTest implements ActionListener {
|
||||
|
||||
private static final String INSTRUCTIONS = """
|
||||
<html><body><p>
|
||||
This test checks that when setState(Frame.ICONIFIED) is called before
|
||||
setVisible(true) the Frame is shown in the proper iconified state.
|
||||
The problem was that it did not honor the initial iconic state, but
|
||||
instead was shown in the NORMAL state.
|
||||
</p><hr/>
|
||||
Steps to try to reproduce this problem:
|
||||
<p>
|
||||
Select the different options for the Frame:
|
||||
<ul>
|
||||
<li><i>{Normal, Non-resizable}</i></li>
|
||||
<li><i>{Normal, Resizable}</i></li>
|
||||
<li><i>{Iconified, Resizable}</i></li>
|
||||
<li><i>{Iconified, Non-resizable}</i></li>
|
||||
</ul>
|
||||
After choosing the Frame's state click the
|
||||
Create Frame button.<br>
|
||||
After the Frame (Frame State Test (Window2)) comes up make sure the
|
||||
proper behavior occurred (Frame shown in proper state).<br>
|
||||
Click the Dispose button to close the Frame.<br>
|
||||
</p><hr/><p>
|
||||
|
||||
Do the above steps for all the different Frame state combinations
|
||||
available.<br>
|
||||
For "Hide, Iconify and Show" case, the frame is hidden then iconified
|
||||
hence Window2 is not seen on-screen when shown as the frame is still
|
||||
in the ICONIFIED state. Window2 is visible on-screen when it is restored
|
||||
to NORMAL state as observed with "Hide, Iconify, Show and Restore" case.
|
||||
<br><br>
|
||||
|
||||
If you observe the proper behavior for all the combinations,
|
||||
press PASS else FAIL.<br>
|
||||
</p><p>
|
||||
Note: In Frame State Test (Window2) you can also chose the different
|
||||
buttons to see different Frame behavior.<br>An example of a problem that
|
||||
has been seen, with the Frame non-resizable you can not iconify the Frame.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
""";
|
||||
|
||||
public static final int DELAY = 1000;
|
||||
|
||||
Button btnCreate = new Button("Create Frame");
|
||||
Button btnDispose = new Button("Dispose Frame");
|
||||
CheckboxGroup cbgState = new CheckboxGroup();
|
||||
CheckboxGroup cbgResize = new CheckboxGroup();
|
||||
Checkbox cbIconState = new Checkbox("Frame State ICONIFIED", cbgState, true);
|
||||
Checkbox cbNormState = new Checkbox("Frame State NORMAL", cbgState, false);
|
||||
Checkbox cbNonResize = new Checkbox("Frame Non-Resizable", cbgResize, false);
|
||||
Checkbox cbResize = new Checkbox("Frame Resizable", cbgResize, true);
|
||||
|
||||
CreateFrame icontst;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
PassFailJFrame
|
||||
.builder()
|
||||
.title("Frame State and Size Test Instructions")
|
||||
.instructions(INSTRUCTIONS)
|
||||
.testTimeOut(10)
|
||||
.rows(27)
|
||||
.columns(70)
|
||||
.logArea(6)
|
||||
.splitUIBottom(() -> new FrameStateTest().createPanel())
|
||||
.build()
|
||||
.awaitAndCheck();
|
||||
}
|
||||
|
||||
public JPanel createPanel() {
|
||||
JPanel panel = new JPanel();
|
||||
panel.setLayout(new GridLayout(0, 3));
|
||||
btnDispose.setEnabled(false);
|
||||
|
||||
panel.add(cbIconState);
|
||||
panel.add(cbResize);
|
||||
panel.add(btnCreate);
|
||||
panel.add(cbNormState);
|
||||
panel.add(cbNonResize);
|
||||
panel.add(btnDispose);
|
||||
|
||||
btnDispose.addActionListener(this);
|
||||
btnCreate.addActionListener(this);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
if (evt.getSource() == btnCreate) {
|
||||
btnCreate.setEnabled(false);
|
||||
btnDispose.setEnabled(true);
|
||||
icontst = new CreateFrame(cbIconState.getState(), cbResize.getState());
|
||||
icontst.setVisible(true);
|
||||
} else if (evt.getSource() == btnDispose) {
|
||||
btnCreate.setEnabled(true);
|
||||
btnDispose.setEnabled(false);
|
||||
icontst.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
static class CreateFrame extends Frame
|
||||
implements ActionListener, WindowListener {
|
||||
|
||||
Button b1, b2, b3, b4, b5, b6, b7;
|
||||
boolean isResizable;
|
||||
String name = "Frame State Test";
|
||||
|
||||
CreateFrame(boolean iconified, boolean resizable) {
|
||||
setTitle("Test Window (Window 2)");
|
||||
|
||||
isResizable = resizable;
|
||||
|
||||
PassFailJFrame.log("CREATING FRAME - Initially " +
|
||||
((iconified) ? "ICONIFIED" : "NORMAL (NON-ICONIFIED)") + " and " +
|
||||
((isResizable) ? "RESIZABLE" : "NON-RESIZABLE"));
|
||||
|
||||
setLayout(new FlowLayout());
|
||||
add(b1 = new Button("Resizable"));
|
||||
add(b2 = new Button("Resize"));
|
||||
add(b3 = new Button("Iconify"));
|
||||
add(b4 = new Button("Iconify and Restore"));
|
||||
add(b5 = new Button("Hide and Show"));
|
||||
add(b6 = new Button("Hide, Iconify and Show"));
|
||||
add(b7 = new Button("Hide, Iconify, Show and Restore"));
|
||||
b1.addActionListener(this);
|
||||
b2.addActionListener(this);
|
||||
b3.addActionListener(this);
|
||||
b4.addActionListener(this);
|
||||
b5.addActionListener(this);
|
||||
b6.addActionListener(this);
|
||||
b7.addActionListener(this);
|
||||
addWindowListener(this);
|
||||
|
||||
setBounds(100, 2, 300, 200);
|
||||
setState(iconified ? Frame.ICONIFIED : Frame.NORMAL);
|
||||
setResizable(isResizable);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls all runnables on EDT with a {@code DELAY} delay before each run.
|
||||
* @param runnables to run
|
||||
*/
|
||||
private static void delayedActions(Runnable... runnables) {
|
||||
setTimer(new ArrayDeque<>(Arrays.asList(runnables)));
|
||||
}
|
||||
|
||||
private static void setTimer(Deque<Runnable> deque) {
|
||||
if (deque == null || deque.isEmpty()) return;
|
||||
|
||||
Timer timer = new Timer(DELAY, e -> {
|
||||
deque.pop().run();
|
||||
setTimer(deque);
|
||||
});
|
||||
timer.setRepeats(false);
|
||||
timer.start();
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (e.getSource() == b2) {
|
||||
Rectangle r = this.getBounds();
|
||||
r.width += 10;
|
||||
stateLog(" - button pressed - setting bounds on Frame to: " + r);
|
||||
setBounds(r);
|
||||
validate();
|
||||
} else if (e.getSource() == b1) {
|
||||
isResizable = !isResizable;
|
||||
stateLog(" - button pressed - setting Resizable to: " + isResizable);
|
||||
((Frame) (b1.getParent())).setResizable(isResizable);
|
||||
} else if (e.getSource() == b3) {
|
||||
stateLog(" - button pressed - setting Iconic: ");
|
||||
((Frame) (b1.getParent())).setState(Frame.ICONIFIED);
|
||||
stateLog();
|
||||
} else if (e.getSource() == b4) {
|
||||
stateLog(" - button pressed - setting Iconic: ");
|
||||
((Frame) (b1.getParent())).setState(Frame.ICONIFIED);
|
||||
stateLog();
|
||||
delayedActions(() -> {
|
||||
stateLog(" - now restoring: ");
|
||||
((Frame) (b1.getParent())).setState(Frame.NORMAL);
|
||||
stateLog();
|
||||
});
|
||||
} else if (e.getSource() == b5) {
|
||||
stateLog(" - button pressed - hiding : ");
|
||||
b1.getParent().setVisible(false);
|
||||
stateLog();
|
||||
delayedActions(() -> {
|
||||
stateLog(" - now reshowing: ");
|
||||
b1.getParent().setVisible(true);
|
||||
stateLog();
|
||||
});
|
||||
} else if (e.getSource() == b6) {
|
||||
stateLog(" - button pressed - hiding : ");
|
||||
b1.getParent().setVisible(false);
|
||||
stateLog();
|
||||
delayedActions(
|
||||
() -> {
|
||||
stateLog(" - setting Iconic: ");
|
||||
((Frame) (b1.getParent())).setState(Frame.ICONIFIED);
|
||||
},
|
||||
() -> {
|
||||
stateLog(" - now reshowing: ");
|
||||
b1.getParent().setVisible(true);
|
||||
stateLog();
|
||||
}
|
||||
);
|
||||
} else if (e.getSource() == b7) {
|
||||
stateLog(" - button pressed - hiding : ");
|
||||
b1.getParent().setVisible(false);
|
||||
stateLog();
|
||||
|
||||
delayedActions(
|
||||
() -> {
|
||||
stateLog(" - setting Iconic: ");
|
||||
((Frame) (b1.getParent())).setState(Frame.ICONIFIED);
|
||||
},
|
||||
() -> {
|
||||
stateLog(" - now reshowing: ");
|
||||
b1.getParent().setVisible(true);
|
||||
stateLog();
|
||||
},
|
||||
() -> {
|
||||
stateLog(" - now restoring: ");
|
||||
((Frame) (b1.getParent())).setState(Frame.NORMAL);
|
||||
stateLog();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public void windowActivated(WindowEvent e) {
|
||||
stateLog("Activated");
|
||||
}
|
||||
|
||||
public void windowClosed(WindowEvent e) {
|
||||
stateLog("Closed");
|
||||
}
|
||||
|
||||
public void windowClosing(WindowEvent e) {
|
||||
((Window) (e.getSource())).dispose();
|
||||
stateLog("Closing");
|
||||
}
|
||||
|
||||
public void windowDeactivated(WindowEvent e) {
|
||||
stateLog("Deactivated");
|
||||
}
|
||||
|
||||
public void windowDeiconified(WindowEvent e) {
|
||||
stateLog("Deiconified");
|
||||
}
|
||||
|
||||
public void windowIconified(WindowEvent e) {
|
||||
stateLog("Iconified");
|
||||
}
|
||||
|
||||
public void windowOpened(WindowEvent e) {
|
||||
stateLog("Opened");
|
||||
}
|
||||
|
||||
public void stateLog(String message) {
|
||||
PassFailJFrame
|
||||
.log("[Current State = %d] %s %s".formatted(getState(), name, message));
|
||||
}
|
||||
|
||||
public void stateLog() {
|
||||
PassFailJFrame.log("[Current State = " + getState() + "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue