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
446
test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java
Normal file
446
test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java
Normal file
|
|
@ -0,0 +1,446 @@
|
|||
/*
|
||||
* Copyright (c) 1999, 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.Canvas;
|
||||
import java.awt.Checkbox;
|
||||
import java.awt.Choice;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Font;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Insets;
|
||||
import java.awt.JobAttributes;
|
||||
import java.awt.Label;
|
||||
import java.awt.List;
|
||||
import java.awt.Menu;
|
||||
import java.awt.MenuBar;
|
||||
import java.awt.MenuItem;
|
||||
import java.awt.PageAttributes;
|
||||
import java.awt.Panel;
|
||||
import java.awt.PrintJob;
|
||||
import java.awt.Scrollbar;
|
||||
import java.awt.ScrollPane;
|
||||
import java.awt.TextArea;
|
||||
import java.awt.TextField;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.JobAttributes.DialogType;
|
||||
import java.awt.PageAttributes.OriginType;
|
||||
|
||||
import java.util.Enumeration;
|
||||
import java.util.Properties;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4247583
|
||||
* @key printer
|
||||
* @library /java/awt/regtesthelpers
|
||||
* @build PassFailJFrame
|
||||
* @summary Tests that the old Properties API still works
|
||||
* @run main/manual PrintCompatibilityTest
|
||||
*/
|
||||
|
||||
public class PrintCompatibilityTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
String INSTRUCTIONS = """
|
||||
A frame window will appear.
|
||||
Choose 'Print to Printer...' from the 'Print' menu. Make sure that you print
|
||||
to a printer, not a file. Examine the output and verify that the frame and all
|
||||
the components in it get printed properly.
|
||||
|
||||
Known problems:
|
||||
* The text in the second row of the menubar is not indented correctly.
|
||||
|
||||
You can also use the 'Print to Screen...' command for a quick manual check that
|
||||
printing works, but this is only for debugging purposes.""";
|
||||
|
||||
PassFailJFrame.builder()
|
||||
.title("PrintComponentTest Test Instructions")
|
||||
.instructions(INSTRUCTIONS)
|
||||
.rows((int) INSTRUCTIONS.lines().count() + 2)
|
||||
.columns(60)
|
||||
.testTimeOut(10)
|
||||
.testUI(new MainFrame())
|
||||
.logArea(8)
|
||||
.build()
|
||||
.awaitAndCheck();
|
||||
}
|
||||
}
|
||||
|
||||
class MainFrame extends Frame {
|
||||
private LWContainer lwc;
|
||||
|
||||
public MainFrame() {
|
||||
super("PrintCompatibilityTest");
|
||||
|
||||
setSize(800, 400);
|
||||
setLayout(new FlowLayout());
|
||||
|
||||
// peered components
|
||||
Button button = new Button("Button");
|
||||
button.setFont(new Font("Dialog", Font.PLAIN, 12));
|
||||
add(button);
|
||||
add(new TestCanvas());
|
||||
Checkbox cbox = new Checkbox("Checkbox", true);
|
||||
cbox.setFont(new Font("DialogInput", Font.PLAIN, 12));
|
||||
add(cbox);
|
||||
Choice choice = new Choice();
|
||||
choice.add("Choice 1");
|
||||
choice.add("Choice Two");
|
||||
choice.setFont(new Font("Monospaced", Font.PLAIN, 12));
|
||||
add(choice);
|
||||
Label label = new Label("Label");
|
||||
label.setFont(new Font("Serif", Font.PLAIN, 12));
|
||||
add(label);
|
||||
List list = new List();
|
||||
list.add("List 1");
|
||||
list.add("List Two");
|
||||
list.setFont(new Font("SansSerif", Font.PLAIN, 12));
|
||||
add(list);
|
||||
add(new Scrollbar(Scrollbar.VERTICAL) );
|
||||
add(new Scrollbar(Scrollbar.HORIZONTAL) );
|
||||
ScrollPane scrollpane = new ScrollPane();
|
||||
Button spButton = new Button("Button in a scrollpane");
|
||||
spButton.setFont(new Font("Monospaced", Font.PLAIN, 12));
|
||||
scrollpane.add(spButton);
|
||||
add(scrollpane);
|
||||
TextArea textarea = new TextArea("TextArea", 3, 30);
|
||||
textarea.setFont(new Font("Dialog", Font.ITALIC, 10));
|
||||
add(textarea);
|
||||
TextField textfield = new TextField("TextField");
|
||||
textfield.setFont(new Font("DialogInput", Font.ITALIC, 10));
|
||||
add(textfield);
|
||||
|
||||
// nested components
|
||||
Panel panel1 = new Panel();
|
||||
panel1.setLayout(new FlowLayout());
|
||||
panel1.setBackground(Color.red);
|
||||
this.add(panel1);
|
||||
|
||||
Button p1Button = new Button("level 2");
|
||||
p1Button.setFont(new Font("Monospaced", Font.ITALIC, 10));
|
||||
panel1.add(p1Button);
|
||||
|
||||
Panel panel2 = new Panel();
|
||||
panel2.setLayout(new FlowLayout());
|
||||
panel2.setBackground(Color.green);
|
||||
panel1.add(panel2);
|
||||
|
||||
Button p2Button = new Button("level 3");
|
||||
p2Button.setFont(new Font("Serif", Font.ITALIC, 10));
|
||||
panel2.add(p2Button);
|
||||
|
||||
|
||||
// lightweight components
|
||||
LWButton lwbutton = new LWButton("LWbutton");
|
||||
lwbutton.setFont(new Font("SansSerif", Font.ITALIC, 10));
|
||||
add(lwbutton);
|
||||
|
||||
lwc = new LWContainer("LWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainer");
|
||||
lwc.setFont(new Font("Monospaced", Font.ITALIC, 10));
|
||||
add(lwc);
|
||||
Button lwcButton1 = new Button("HW Button 1");
|
||||
Button lwcButton2 = new Button("HW Button 2");
|
||||
LWButton lwcButton3 = new LWButton("LW Button");
|
||||
lwcButton1.setFont(new Font("Dialog", Font.BOLD, 14));
|
||||
lwcButton2.setFont(new Font("DialogInput", Font.BOLD, 14));
|
||||
lwcButton3.setFont(new Font("Monospaced", Font.BOLD, 14));
|
||||
lwc.add(lwcButton1);
|
||||
lwc.add(lwcButton2);
|
||||
lwc.add(lwcButton3);
|
||||
|
||||
// overlapping components
|
||||
add(new ZOrderPanel());
|
||||
|
||||
///////////////////////
|
||||
|
||||
Menu menu = new Menu("Print");
|
||||
Menu menu2 = new Menu("File");
|
||||
Menu menu3 = new Menu("Edit");
|
||||
Menu menu4 = new Menu("ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLong");
|
||||
menu2.setFont(new Font("SansSerif", Font.BOLD, 20));
|
||||
menu2.setEnabled(false);
|
||||
menu3.setFont(new Font("Monospaced", Font.ITALIC, 18));
|
||||
menu3.setEnabled(false);
|
||||
menu4.setEnabled(false);
|
||||
MenuItem itemPrinter = new MenuItem("Print to Printer...");
|
||||
MenuItem itemScreen = new MenuItem("Print to Screen...");
|
||||
menu.add(itemPrinter);
|
||||
menu.add(itemScreen);
|
||||
MenuBar menuBar = new MenuBar();
|
||||
menuBar.add( menu );
|
||||
menuBar.add( menu2 );
|
||||
menuBar.add( menu3 );
|
||||
menuBar.add( menu4 );
|
||||
setMenuBar(menuBar);
|
||||
|
||||
itemPrinter.addActionListener( new ActionPrint() );
|
||||
itemScreen.addActionListener( new ActionPrintToScreen() );
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
static void printProps(Properties props)
|
||||
{
|
||||
Enumeration propNames = props.propertyNames();
|
||||
while (propNames.hasMoreElements()) {
|
||||
String propName = (String)propNames.nextElement();
|
||||
PassFailJFrame.log( propName + " = " + props.getProperty(propName));
|
||||
}
|
||||
}
|
||||
|
||||
class ActionPrint implements ActionListener {
|
||||
private final int ITERATIONS = 1;
|
||||
private Properties props = new Properties();
|
||||
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
PassFailJFrame.log("About to show print dialog...");
|
||||
printProps(props);
|
||||
PrintJob pj = getToolkit().getPrintJob(
|
||||
MainFrame.this, "Print test!", props);
|
||||
if (pj == null) {
|
||||
return;
|
||||
}
|
||||
Dimension d = pj.getPageDimension();
|
||||
PassFailJFrame.log("About to print...");
|
||||
PassFailJFrame.log("Dimensions: " + d);
|
||||
printProps(props);
|
||||
|
||||
// For xor mode set, there is a printing issue with number of copies to be print.
|
||||
// So, ITERATIONS are changed to 1 from 3.
|
||||
// So, for now the XOR related code is commented out.
|
||||
|
||||
//boolean xor = false;
|
||||
|
||||
for (int i = 0; i < ITERATIONS; i++) {
|
||||
Graphics g = pj.getGraphics();
|
||||
g.setColor(Color.red);
|
||||
//if (xor) {
|
||||
// g.setXORMode(Color.blue);
|
||||
//}
|
||||
g.translate(13, 13);
|
||||
printAll(g);
|
||||
g.dispose();
|
||||
//xor = (xor) ? false : true;
|
||||
}
|
||||
|
||||
// For xor mode set, LWC components don't get printed.
|
||||
// So, for now the code is commented out and separate bug
|
||||
// (JDK-8340495) is filed to handle it.
|
||||
|
||||
// one more page so that we can test printing a lightweight
|
||||
// at the top of the hierarchy (BugId 4212564)
|
||||
//Graphics g = pj.getGraphics();
|
||||
//g.setColor(Color.red);
|
||||
//g.translate(13, 13);
|
||||
//lwc.printAll(g);
|
||||
//g.dispose();
|
||||
// end 4212564
|
||||
|
||||
pj.end();
|
||||
}
|
||||
}
|
||||
|
||||
class ActionPrintToScreen implements ActionListener {
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
PrintFrame printFrame = new PrintFrame(MainFrame.this);
|
||||
printFrame.show();
|
||||
Graphics g = printFrame.getGraphics();
|
||||
g.setColor(Color.red);
|
||||
printAll(g);
|
||||
g.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
// Frame window that displays results of printing
|
||||
// main window to a screen Graphics-- useful for
|
||||
// quick testing of printing
|
||||
class PrintFrame extends Frame
|
||||
{
|
||||
private Component printComponent;
|
||||
public PrintFrame( Component c )
|
||||
{
|
||||
super("Print to Screen");
|
||||
printComponent = c ;
|
||||
addWindowListener( new WindowAdapter() {
|
||||
public void windowClosing(WindowEvent ev) {
|
||||
setVisible(false);
|
||||
dispose();
|
||||
}
|
||||
}
|
||||
);
|
||||
setSize(printComponent.getSize());
|
||||
setResizable(false);
|
||||
}
|
||||
|
||||
public void paint( Graphics g ) {
|
||||
printComponent.printAll(g);
|
||||
}
|
||||
}
|
||||
|
||||
class LWButton extends Component {
|
||||
String label;
|
||||
int width = 100;
|
||||
int height = 30;
|
||||
|
||||
public LWButton(String label) {
|
||||
super();
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
public void paint(Graphics g) {
|
||||
Dimension d = getSize();
|
||||
g.setColor(Color.orange);
|
||||
g.setFont(getFont());
|
||||
g.fillRect(0, 0, d.width, d.height);
|
||||
g.setColor(Color.black);
|
||||
int x = 5;
|
||||
int y = (d.height - 5);
|
||||
g.drawString(label, x, y);
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize()
|
||||
{
|
||||
return new Dimension(width, height);
|
||||
}
|
||||
}
|
||||
|
||||
class LWContainer extends Container {
|
||||
String label;
|
||||
int width = 300;
|
||||
int height = 100;
|
||||
|
||||
public LWContainer(String label) {
|
||||
super();
|
||||
this.label = label;
|
||||
setLayout(new FlowLayout());
|
||||
}
|
||||
|
||||
public void paint(Graphics g) {
|
||||
super.paint(g);
|
||||
Dimension d = getSize();
|
||||
g.setColor(Color.green);
|
||||
g.setFont(getFont());
|
||||
g.drawLine(0, 0, d.width - 1, 0);
|
||||
g.drawLine(d.width - 1, 0, d.width - 1, d.height - 1);
|
||||
g.drawLine(d.width - 1, d.height - 1, 0, d.height - 1);
|
||||
g.drawLine(0, d.height - 1, 0, 0);
|
||||
g.setColor(Color.black);
|
||||
int x = 5;
|
||||
int y = (d.height - 5);
|
||||
g.drawString(label, x, y);
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize()
|
||||
{
|
||||
return new Dimension(width, height);
|
||||
}
|
||||
}
|
||||
|
||||
class TestCanvas extends Canvas {
|
||||
int width = 100;
|
||||
int height = 100;
|
||||
|
||||
public void paint(Graphics g) {
|
||||
g.setColor(Color.blue);
|
||||
g.fillRoundRect(10, 10, 50, 50, 15, 30);
|
||||
g.setColor(Color.red);
|
||||
g.fillOval(70, 70, 25, 25);
|
||||
}
|
||||
public Dimension getPreferredSize() {
|
||||
return new Dimension(width, height);
|
||||
}
|
||||
}
|
||||
|
||||
class ZOrderPanel extends Panel
|
||||
{
|
||||
ZOrderPanel()
|
||||
{
|
||||
setLayout(null);
|
||||
|
||||
Component first, second, third, fourth;
|
||||
|
||||
setVisible(true);
|
||||
// add first component
|
||||
first = makeBox("Second", Color.blue,
|
||||
new Font("Serif", Font.BOLD, 14),
|
||||
-1);
|
||||
// insert on top
|
||||
second = makeBox("First", Color.yellow,
|
||||
new Font("SansSerif", Font.BOLD, 14),
|
||||
0);
|
||||
// put at the back
|
||||
fourth = makeBox("Fourth", Color.red,
|
||||
new Font("Monospaced", Font.BOLD, 14),
|
||||
2);
|
||||
// insert in last position
|
||||
third = makeBox("Third", Color.green,
|
||||
new Font("Dialog", Font.PLAIN, 12),
|
||||
3);
|
||||
// swap third and fourth to correct positions
|
||||
remove(third);
|
||||
add(third, 2);
|
||||
// re-validate so third and fourth peers change position
|
||||
validate();
|
||||
// now make things really interesting with a lightweight
|
||||
// component at the top of the z-order, that should print
|
||||
// _below_ the native guys to match the screen...
|
||||
add(new LWButton("LWButton"), 0);
|
||||
}
|
||||
|
||||
public Dimension preferredSize()
|
||||
{
|
||||
return new Dimension(260, 80);
|
||||
}
|
||||
|
||||
public void layout()
|
||||
{
|
||||
int i, n;
|
||||
Insets ins = getInsets();
|
||||
n = getComponentCount();
|
||||
for (i = n-1; i >= 0; i--) {
|
||||
Component p = getComponent(i);
|
||||
p.setBounds(ins.left + 40 * i, ins.top + 5 * i, 60, 60);
|
||||
}
|
||||
}
|
||||
|
||||
public Component makeBox(String s, Color c, Font f, int index)
|
||||
{
|
||||
Label l = new Label(s);
|
||||
l.setBackground(c);
|
||||
l.setAlignment(Label.RIGHT);
|
||||
l.setFont(f);
|
||||
add(l, index);
|
||||
validate();
|
||||
return l;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue