1/* 2 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/** 25 * @test InvalidPage.java 26 * @bug 4671634 6506286 27 * @summary Invalid page format can crash win32 JRE 28 * @author prr 29 * @run main/manual InvalidPage 30 */ 31 32import java.awt.*; 33import java.awt.event.*; 34import java.awt.print.*; 35 36public class InvalidPage extends Frame implements Printable { 37 38 PrinterJob pJob; 39 PageFormat pf; 40 41 public InvalidPage() { 42 super ("Validate Page Test"); 43 pJob = PrinterJob.getPrinterJob(); 44 pf = pJob.defaultPage(); 45 Paper p = pf.getPaper(); 46 p.setImageableArea(0,0,p.getWidth(), p.getHeight()); 47 pf.setPaper(p); 48 setLayout(new FlowLayout()); 49 Panel panel = new Panel(); 50 Button printButton = new Button ("Print"); 51 printButton.addActionListener(new ActionListener() { 52 public void actionPerformed (ActionEvent e) { 53 try { 54 if (pJob.printDialog()) { 55 pJob.setPrintable(InvalidPage.this, pf); 56 pJob.print(); 57 } 58 } catch (PrinterException pe ) { 59 } 60 } 61 }); 62 panel.add (printButton); 63 add(panel); 64 65 addWindowListener (new WindowAdapter() { 66 public void windowClosing (WindowEvent e) { 67 dispose(); 68 System.exit (0); 69 } 70 71 }); 72 setSize (200, 200); 73 setVisible (true); 74 } 75 76 public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { 77 78 if (pageIndex > 1) { 79 return Printable.NO_SUCH_PAGE; 80 } 81 82 Graphics2D g2d = (Graphics2D)graphics; 83 84 g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 85 g2d.drawString("ORIGIN", 30, 30); 86 g2d.drawString("X THIS WAY", 200, 50); 87 g2d.drawString("Y THIS WAY", 60 , 200); 88 g2d.drawRect(0,0,(int)pageFormat.getImageableWidth(), 89 (int)pageFormat.getImageableHeight()); 90 if (pageIndex == 0) { 91 g2d.setColor(Color.black); 92 } else { 93 g2d.setColor(new Color(0,0,0,128)); 94 } 95 g2d.drawRect(1,1,(int)pageFormat.getImageableWidth()-2, 96 (int)pageFormat.getImageableHeight()-2); 97 98 g2d.drawLine(0,0, 99 (int)pageFormat.getImageableWidth(), 100 (int)pageFormat.getImageableHeight()); 101 g2d.drawLine((int)pageFormat.getImageableWidth(),0, 102 0,(int)pageFormat.getImageableHeight()); 103 return Printable.PAGE_EXISTS; 104 } 105 106 public static void main( String[] args) { 107 String[] instructions = 108 { 109 "You must have a printer available to perform this test", 110 "Press the print button, which brings up a print dialog and", 111 "in the dialog select a printer and press the print button", 112 "in the dialog. Repeat for as many printers as you have installed", 113 "On solaris and linux just one printer is sufficient", 114 "Collect the output and examine it, each print job has two pages", 115 "of very similar output, except that the 2nd page of the job may", 116 "appear in a different colour, and the output near the edge of", 117 "the page may be clipped. This is OK. Hold up both pieces of paper", 118 "to the light and confirm that the lines and text (where present)", 119 "are positioned identically on both pages", 120 "The test fails if the JRE crashes, or if the output from the two", 121 "pages of a job is aligned differently" 122 }; 123 Sysout.createDialog( ); 124 Sysout.printInstructions( instructions ); 125 126 new InvalidPage(); 127 } 128 129} 130 131class Sysout { 132 private static TestDialog dialog; 133 134 public static void createDialogWithInstructions( String[] instructions ) 135 { 136 dialog = new TestDialog( new Frame(), "Instructions" ); 137 dialog.printInstructions( instructions ); 138 dialog.show(); 139 println( "Any messages for the tester will display here." ); 140 } 141 142 public static void createDialog( ) 143 { 144 dialog = new TestDialog( new Frame(), "Instructions" ); 145 String[] defInstr = { "Instructions will appear here. ", "" } ; 146 dialog.printInstructions( defInstr ); 147 dialog.show(); 148 println( "Any messages for the tester will display here." ); 149 } 150 151 152 public static void printInstructions( String[] instructions ) 153 { 154 dialog.printInstructions( instructions ); 155 } 156 157 158 public static void println( String messageIn ) 159 { 160 dialog.displayMessage( messageIn ); 161 } 162 163}// Sysout class 164 165/** 166 This is part of the standard test machinery. It provides a place for the 167 test instructions to be displayed, and a place for interactive messages 168 to the user to be displayed. 169 To have the test instructions displayed, see Sysout. 170 To have a message to the user be displayed, see Sysout. 171 Do not call anything in this dialog directly. 172 */ 173class TestDialog extends Dialog { 174 175 TextArea instructionsText; 176 TextArea messageText; 177 int maxStringLength = 80; 178 179 //DO NOT call this directly, go through Sysout 180 public TestDialog( Frame frame, String name ) 181 { 182 super( frame, name ); 183 int scrollBoth = TextArea.SCROLLBARS_BOTH; 184 instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); 185 add( "North", instructionsText ); 186 187 messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); 188 add("Center", messageText); 189 190 pack(); 191 192 show(); 193 }// TestDialog() 194 195 //DO NOT call this directly, go through Sysout 196 public void printInstructions( String[] instructions ) 197 { 198 //Clear out any current instructions 199 instructionsText.setText( "" ); 200 201 //Go down array of instruction strings 202 203 String printStr, remainingStr; 204 for( int i=0; i < instructions.length; i++ ) 205 { 206 //chop up each into pieces maxSringLength long 207 remainingStr = instructions[ i ]; 208 while( remainingStr.length() > 0 ) 209 { 210 //if longer than max then chop off first max chars to print 211 if( remainingStr.length() >= maxStringLength ) 212 { 213 //Try to chop on a word boundary 214 int posOfSpace = remainingStr. 215 lastIndexOf( ' ', maxStringLength - 1 ); 216 217 if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; 218 219 printStr = remainingStr.substring( 0, posOfSpace + 1 ); 220 remainingStr = remainingStr.substring( posOfSpace + 1 ); 221 } 222 //else just print 223 else 224 { 225 printStr = remainingStr; 226 remainingStr = ""; 227 } 228 229 instructionsText.append( printStr + "\n" ); 230 231 }// while 232 233 }// for 234 235 }//printInstructions() 236 237 //DO NOT call this directly, go through Sysout 238 public void displayMessage( String messageIn ) 239 { 240 messageText.append( messageIn + "\n" ); 241 } 242 243 }// TestDialog class 244