--- old/java/awt/KeyboardFocusmanager/TypeAhead/EnqueueWithDialogTest/EnqueueWithDialogTest.java 2014-12-04 12:31:06.000000000 +0300 +++ new/java/awt/KeyboardFocusmanager/TypeAhead/EnqueueWithDialogTest/EnqueueWithDialogTest.java 2014-12-04 12:31:06.000000000 +0300 @@ -1,16 +1,39 @@ /* -test + * Copyright (c) 2003, 2014, 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 @bug 4799136 @summary Tests that type-ahead for dialog works and doesn't block program @author Dmitry.Cherepanov@SUN.COM area=awt.focus -@run applet EnqueueWithDialogTest.html +@run main EnqueueWithDialogTest */ -import java.applet.Applet; import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.awt.event.*; -import sun.awt.SunToolkit; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /* * The purpose of this test is check that the type-head @@ -22,15 +45,20 @@ * button from the dialog. */ -public class EnqueueWithDialogTest extends Applet +public class EnqueueWithDialogTest { static Frame f; static Button b; static Dialog d; - static Semaphore pressSema = new Semaphore(); - static Semaphore robotSema = new Semaphore(); + static CountDownLatch pressLatch = new CountDownLatch(1); + static CountDownLatch robotLatch = new CountDownLatch(1); static volatile boolean gotFocus = false; static Robot robot; + public static void main(String args[]) throws Exception { + EnqueueWithDialogTest test = new EnqueueWithDialogTest(); + test.init(); + test.start(); + } public void init() { Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { @@ -43,11 +71,13 @@ } }, AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK); - this.setLayout (new BorderLayout ()); f = new Frame("frame"); + f.setPreferredSize(new Dimension(100,100)); + f.setLocation(100,50); b = new Button("press"); d = new Dialog(f, "dialog", true); + d.setPreferredSize(new Dimension(70,70)); d.pack(); d.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { @@ -57,7 +87,7 @@ // Typed-ahead key events should only be accepted if // they arrive after FOCUS_GAINED if (gotFocus) { - pressSema.raise(); + pressLatch.countDown(); } } }); @@ -73,7 +103,7 @@ public void actionPerformed(ActionEvent e) { System.err.println(e.toString()+","+e.getWhen()); System.err.println("B pressed"); - robotSema.raise(); + robotLatch.countDown(); EventQueue.invokeLater(new Runnable() { public void run() { @@ -90,14 +120,11 @@ }//End init() - public void start () + public void start () throws Exception { - //Get things going. Request focus, set size, et cetera - setSize (200,200); - setVisible(true); - validate(); try { robot = new Robot(); + //robot.setAutoDelay(50); } catch (Exception e) { throw new RuntimeException("Can't create robot:" + e); } @@ -107,27 +134,27 @@ System.err.println("b is shown"); f.toFront(); moveMouseOver(f); - ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + robot.waitForIdle(); + robot.delay(100); makeFocused(b); - ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + robot.waitForIdle(); + robot.delay(100); System.err.println("b is focused"); robot.keyPress(KeyEvent.VK_SPACE); robot.keyRelease(KeyEvent.VK_SPACE); - try { - robotSema.doWait(1000); - } catch (InterruptedException ie) { - throw new RuntimeException("Interrupted!"); + System.err.println("space typed once"); + boolean ok = robotLatch.await(1, TimeUnit.SECONDS); + if(!ok) { + throw new RuntimeException("Was B button pressed?"); } + robot.keyPress(KeyEvent.VK_SPACE); robot.keyRelease(KeyEvent.VK_SPACE); - ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); - try { - pressSema.doWait(3000); - } catch (InterruptedException ie) { - throw new RuntimeException("Interrupted!"); - } - if (!pressSema.getState()) { + System.err.println("space typed twice"); + robot.delay(500); + ok = pressLatch.await(3, TimeUnit.SECONDS); + if(!ok) { throw new RuntimeException("Type-ahead doesn't work"); } @@ -209,142 +236,4 @@ return state; } } -}// class TestDialogTypeAhead - - -/**************************************************** - Standard Test Machinery - DO NOT modify anything below -- it's a standard - chunk of code whose purpose is to make user - interaction uniform, and thereby make it simpler - to read and understand someone else's test. - ****************************************************/ - -/** - This is part of the standard test machinery. - It creates a dialog (with the instructions), and is the interface - for sending text messages to the user. - To print the instructions, send an array of strings to Sysout.createDialog - WithInstructions method. Put one line of instructions per array entry. - To display a message for the tester to see, simply call Sysout.println - with the string to be displayed. - This mimics System.out.println but works within the test harness as well - as standalone. - */ - -class Sysout -{ - private static TestDialog dialog; - - public static void createDialogWithInstructions( String[] instructions ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - dialog.printInstructions( instructions ); - dialog.setVisible(true); - println( "Any messages for the tester will display here." ); - } - - public static void createDialog( ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - String[] defInstr = { "Instructions will appear here. ", "" } ; - dialog.printInstructions( defInstr ); - dialog.setVisible(true); - println( "Any messages for the tester will display here." ); - } - - - public static void printInstructions( String[] instructions ) - { - dialog.printInstructions( instructions ); - } - - - public static void println( String messageIn ) - { - dialog.displayMessage( messageIn ); - } - -}// Sysout class - -/** - This is part of the standard test machinery. It provides a place for the - test instructions to be displayed, and a place for interactive messages - to the user to be displayed. - To have the test instructions displayed, see Sysout. - To have a message to the user be displayed, see Sysout. - Do not call anything in this dialog directly. - */ -class TestDialog extends Dialog -{ - - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog( Frame frame, String name ) - { - super( frame, name ); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); - add( "North", instructionsText ); - - messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); - add("Center", messageText); - - pack(); - - show(); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions( String[] instructions ) - { - //Clear out any current instructions - instructionsText.setText( "" ); - - //Go down array of instruction strings - - String printStr, remainingStr; - for( int i=0; i < instructions.length; i++ ) - { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i ]; - while( remainingStr.length() > 0 ) - { - //if longer than max then chop off first max chars to print - if( remainingStr.length() >= maxStringLength ) - { - //Try to chop on a word boundary - int posOfSpace = remainingStr. - lastIndexOf( ' ', maxStringLength - 1 ); - - if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; - - printStr = remainingStr.substring( 0, posOfSpace + 1 ); - remainingStr = remainingStr.substring( posOfSpace + 1 ); - } - //else just print - else - { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append( printStr + "\n" ); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage( String messageIn ) - { - messageText.append( messageIn + "\n" ); - System.out.println(messageIn); - } - -}// TestDialog class +}