Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/awt/Container/isRemoveNotifyNeeded/JInternalFrameTest.java
38828 views
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
26
@bug 6552803
27
@summary moveToFront shouldn't remove peers of HW components
28
@author anthony.petrov@...: area=awt.container
29
@library ../../regtesthelpers
30
@build Util
31
@run main JInternalFrameTest
32
*/
33
34
/**
35
* JInternalFrameTest.java
36
*
37
* summary: movtToFront invoked on the JInternalFrame shouldn't
38
* recreate peers of HW descendants of the JInternalFrame.
39
*/
40
41
import java.awt.*;
42
import java.awt.event.*;
43
import java.beans.PropertyVetoException;
44
import javax.swing.*;
45
import test.java.awt.regtesthelpers.Util;
46
47
public class JInternalFrameTest
48
{
49
// Indicates whether the removeNotify() was invoked on the HW Canvas
50
static volatile boolean isRemoveNotify = false;
51
52
// The HW Canvas class.
53
private static final class MyCanvas extends Canvas {
54
private final Color background;
55
public MyCanvas(Color background) {
56
this.background = background;
57
setPreferredSize(new Dimension(100, 100));
58
}
59
60
public void paint(Graphics g) {
61
g.setColor(background);
62
g.fillRect(0, 0, getWidth(), getHeight());
63
}
64
65
public void addNotify() {
66
super.addNotify();
67
System.err.println("addNotify() on " + background);
68
}
69
70
public void removeNotify() {
71
super.removeNotify();
72
isRemoveNotify = true;
73
System.err.println("removeNotify() on " + background);
74
Thread.dumpStack();
75
}
76
}
77
78
79
private static void init()
80
{
81
//*** Create instructions for the user here ***
82
83
String[] instructions =
84
{
85
"This is an AUTOMATIC test, simply wait until it is done.",
86
"The result (passed or failed) will be shown in the",
87
"message window below."
88
};
89
Sysout.createDialog( );
90
Sysout.printInstructions( instructions );
91
92
// We create a JFrame with two JInternalFrame.
93
// Each JInternalFrame contains a HW Canvas component.
94
JFrame jframe = new JFrame("mixing test");
95
JDesktopPane desktop = new JDesktopPane();
96
jframe.setContentPane(desktop);
97
JInternalFrame iframe1 = new JInternalFrame("iframe 1");
98
iframe1.setIconifiable(true);
99
iframe1.add(new MyCanvas(Color.RED));
100
iframe1.setBounds(10, 10, 100, 100);
101
iframe1.setVisible(true);
102
desktop.add(iframe1);
103
JInternalFrame iframe2 = new JInternalFrame("iframe 2");
104
iframe2.setIconifiable(true);
105
iframe2.add(new MyCanvas(Color.BLUE));
106
iframe2.setBounds(50, 50, 100, 100);
107
iframe2.setVisible(true);
108
desktop.add(iframe2);
109
110
jframe.setSize(300, 300);
111
jframe.setVisible(true);
112
113
// Wait until everything gets shown
114
Util.waitForIdle(null);
115
116
// Now cause a couple of z-order changing operations
117
iframe2.moveToFront();
118
Util.waitForIdle(null);
119
iframe1.moveToFront();
120
Util.waitForIdle(null);
121
iframe2.moveToFront();
122
123
// Wait until all the operations complete
124
Util.waitForIdle(null);
125
126
if (isRemoveNotify) {
127
fail("The removeNotify() was invoked on the HW Canvas");
128
}
129
JInternalFrameTest.pass();
130
131
}//End init()
132
133
134
135
/*****************************************************
136
* Standard Test Machinery Section
137
* DO NOT modify anything in this section -- it's a
138
* standard chunk of code which has all of the
139
* synchronisation necessary for the test harness.
140
* By keeping it the same in all tests, it is easier
141
* to read and understand someone else's test, as
142
* well as insuring that all tests behave correctly
143
* with the test harness.
144
* There is a section following this for test-
145
* classes
146
******************************************************/
147
private static boolean theTestPassed = false;
148
private static boolean testGeneratedInterrupt = false;
149
private static String failureMessage = "";
150
151
private static Thread mainThread = null;
152
153
private static int sleepTime = 300000;
154
155
// Not sure about what happens if multiple of this test are
156
// instantiated in the same VM. Being static (and using
157
// static vars), it aint gonna work. Not worrying about
158
// it for now.
159
public static void main( String args[] ) throws InterruptedException
160
{
161
mainThread = Thread.currentThread();
162
try
163
{
164
init();
165
}
166
catch( TestPassedException e )
167
{
168
//The test passed, so just return from main and harness will
169
// interepret this return as a pass
170
return;
171
}
172
//At this point, neither test pass nor test fail has been
173
// called -- either would have thrown an exception and ended the
174
// test, so we know we have multiple threads.
175
176
//Test involves other threads, so sleep and wait for them to
177
// called pass() or fail()
178
try
179
{
180
Thread.sleep( sleepTime );
181
//Timed out, so fail the test
182
throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
183
}
184
catch (InterruptedException e)
185
{
186
//The test harness may have interrupted the test. If so, rethrow the exception
187
// so that the harness gets it and deals with it.
188
if( ! testGeneratedInterrupt ) throw e;
189
190
//reset flag in case hit this code more than once for some reason (just safety)
191
testGeneratedInterrupt = false;
192
193
if ( theTestPassed == false )
194
{
195
throw new RuntimeException( failureMessage );
196
}
197
}
198
199
}//main
200
201
public static synchronized void setTimeoutTo( int seconds )
202
{
203
sleepTime = seconds * 1000;
204
}
205
206
public static synchronized void pass()
207
{
208
Sysout.println( "The test passed." );
209
Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
210
//first check if this is executing in main thread
211
if ( mainThread == Thread.currentThread() )
212
{
213
//Still in the main thread, so set the flag just for kicks,
214
// and throw a test passed exception which will be caught
215
// and end the test.
216
theTestPassed = true;
217
throw new TestPassedException();
218
}
219
theTestPassed = true;
220
testGeneratedInterrupt = true;
221
mainThread.interrupt();
222
}//pass()
223
224
public static synchronized void fail()
225
{
226
//test writer didn't specify why test failed, so give generic
227
fail( "it just plain failed! :-)" );
228
}
229
230
public static synchronized void fail( String whyFailed )
231
{
232
Sysout.println( "The test failed: " + whyFailed );
233
Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
234
//check if this called from main thread
235
if ( mainThread == Thread.currentThread() )
236
{
237
//If main thread, fail now 'cause not sleeping
238
throw new RuntimeException( whyFailed );
239
}
240
theTestPassed = false;
241
testGeneratedInterrupt = true;
242
failureMessage = whyFailed;
243
mainThread.interrupt();
244
}//fail()
245
246
}// class JInternalFrameTest
247
248
//This exception is used to exit from any level of call nesting
249
// when it's determined that the test has passed, and immediately
250
// end the test.
251
class TestPassedException extends RuntimeException
252
{
253
}
254
255
//*********** End Standard Test Machinery Section **********
256
257
258
//************ Begin classes defined for the test ****************
259
260
// if want to make listeners, here is the recommended place for them, then instantiate
261
// them in init()
262
263
/* Example of a class which may be written as part of a test
264
class NewClass implements anInterface
265
{
266
static int newVar = 0;
267
268
public void eventDispatched(AWTEvent e)
269
{
270
//Counting events to see if we get enough
271
eventCount++;
272
273
if( eventCount == 20 )
274
{
275
//got enough events, so pass
276
277
JInternalFrameTest.pass();
278
}
279
else if( tries == 20 )
280
{
281
//tried too many times without getting enough events so fail
282
283
JInternalFrameTest.fail();
284
}
285
286
}// eventDispatched()
287
288
}// NewClass class
289
290
*/
291
292
293
//************** End classes defined for the test *******************
294
295
296
297
298
/****************************************************
299
Standard Test Machinery
300
DO NOT modify anything below -- it's a standard
301
chunk of code whose purpose is to make user
302
interaction uniform, and thereby make it simpler
303
to read and understand someone else's test.
304
****************************************************/
305
306
/**
307
This is part of the standard test machinery.
308
It creates a dialog (with the instructions), and is the interface
309
for sending text messages to the user.
310
To print the instructions, send an array of strings to Sysout.createDialog
311
WithInstructions method. Put one line of instructions per array entry.
312
To display a message for the tester to see, simply call Sysout.println
313
with the string to be displayed.
314
This mimics System.out.println but works within the test harness as well
315
as standalone.
316
*/
317
318
class Sysout
319
{
320
private static TestDialog dialog;
321
322
public static void createDialogWithInstructions( String[] instructions )
323
{
324
dialog = new TestDialog( new Frame(), "Instructions" );
325
dialog.printInstructions( instructions );
326
dialog.setVisible(true);
327
println( "Any messages for the tester will display here." );
328
}
329
330
public static void createDialog( )
331
{
332
dialog = new TestDialog( new Frame(), "Instructions" );
333
String[] defInstr = { "Instructions will appear here. ", "" } ;
334
dialog.printInstructions( defInstr );
335
dialog.setVisible(true);
336
println( "Any messages for the tester will display here." );
337
}
338
339
340
public static void printInstructions( String[] instructions )
341
{
342
dialog.printInstructions( instructions );
343
}
344
345
346
public static void println( String messageIn )
347
{
348
dialog.displayMessage( messageIn );
349
System.out.println(messageIn);
350
}
351
352
}// Sysout class
353
354
/**
355
This is part of the standard test machinery. It provides a place for the
356
test instructions to be displayed, and a place for interactive messages
357
to the user to be displayed.
358
To have the test instructions displayed, see Sysout.
359
To have a message to the user be displayed, see Sysout.
360
Do not call anything in this dialog directly.
361
*/
362
class TestDialog extends Dialog
363
{
364
365
TextArea instructionsText;
366
TextArea messageText;
367
int maxStringLength = 80;
368
369
//DO NOT call this directly, go through Sysout
370
public TestDialog( Frame frame, String name )
371
{
372
super( frame, name );
373
int scrollBoth = TextArea.SCROLLBARS_BOTH;
374
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
375
add( "North", instructionsText );
376
377
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
378
add("Center", messageText);
379
380
pack();
381
382
setVisible(true);
383
}// TestDialog()
384
385
//DO NOT call this directly, go through Sysout
386
public void printInstructions( String[] instructions )
387
{
388
//Clear out any current instructions
389
instructionsText.setText( "" );
390
391
//Go down array of instruction strings
392
393
String printStr, remainingStr;
394
for( int i=0; i < instructions.length; i++ )
395
{
396
//chop up each into pieces maxSringLength long
397
remainingStr = instructions[ i ];
398
while( remainingStr.length() > 0 )
399
{
400
//if longer than max then chop off first max chars to print
401
if( remainingStr.length() >= maxStringLength )
402
{
403
//Try to chop on a word boundary
404
int posOfSpace = remainingStr.
405
lastIndexOf( ' ', maxStringLength - 1 );
406
407
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
408
409
printStr = remainingStr.substring( 0, posOfSpace + 1 );
410
remainingStr = remainingStr.substring( posOfSpace + 1 );
411
}
412
//else just print
413
else
414
{
415
printStr = remainingStr;
416
remainingStr = "";
417
}
418
419
instructionsText.append( printStr + "\n" );
420
421
}// while
422
423
}// for
424
425
}//printInstructions()
426
427
//DO NOT call this directly, go through Sysout
428
public void displayMessage( String messageIn )
429
{
430
messageText.append( messageIn + "\n" );
431
System.out.println(messageIn);
432
}
433
434
}// TestDialog class
435
436