--- /dev/null 2015-08-04 03:20:55.977768079 -0700 +++ new/test/java/awt/EmbeddedFrame/EmbeddedFrameGrabTest/EmbeddedFrameGrabTest.java 2015-08-17 21:33:01.091850810 -0700 @@ -0,0 +1,284 @@ +/* +* Copyright (c) 2013, 2015, 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 6345002 + @summary grab problems with EmbeddedFrame + @requires (os.family == "windows") + @modules java.desktop/java.awt.peer + @modules java.desktop/sun.awt + @modules java.desktop/sun.awt.windows + @author Oleg.Semenov@sun.com area=EmbeddedFrame + @run main EmbeddedFrameGrabTest +*/ + +/** + * EmbeddedFrameGrabTest.java + * + * summary: grab problems with EmbeddedFrame + */ + +import java.awt.Frame; +import java.awt.peer.FramePeer; +import javax.swing.JComboBox; +import java.awt.Panel; +import java.awt.BorderLayout; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.Rectangle; +import java.awt.TextArea; +import java.awt.Dialog; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; + +import sun.awt.AWTAccessor; + +public class EmbeddedFrameGrabTest +{ + private static void init() + { + if (!System.getProperty("os.name").startsWith("Windows")) { + System.out.println("This is Windows only test."); + EmbeddedFrameGrabTest.pass(); + return; + } + + try { + final Frame frame = new Frame("AWT Frame"); + frame.pack(); + frame.setSize(200,200); + FramePeer frame_peer = AWTAccessor.getComponentAccessor().getPeer(frame); + System.out.println("frame's peer = " + frame_peer); + Class comp_peer_class = + Class.forName("sun.awt.windows.WComponentPeer"); + System.out.println("comp peer class = " + comp_peer_class); + Field hwnd_field = comp_peer_class.getDeclaredField("hwnd"); + hwnd_field.setAccessible(true); + System.out.println("hwnd_field =" + hwnd_field); + long hwnd = hwnd_field.getLong(frame_peer); + System.out.println("hwnd = " + hwnd); + + Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame"); + Constructor constructor = clazz.getConstructor (new Class [] {long.class}); + final Frame embedded_frame = + (Frame) constructor.newInstance (new Object[] {new Long(hwnd)});; + System.out.println("embedded_frame = " + embedded_frame); + final JComboBox combo = new JComboBox(new String[] { + "Item 1", "Item 2" + } ); + combo.setSelectedIndex(1); + final Panel p = new Panel(); + p.setLayout(new BorderLayout()); + embedded_frame.add(p,BorderLayout.CENTER); + embedded_frame.validate(); + p.add(combo); + p.validate(); + frame.setVisible(true); + Robot robot = new Robot(); + robot.delay(2000); + Rectangle clos = new Rectangle(combo.getLocationOnScreen(),combo.getSize()); + robot.mouseMove(clos.x+clos.width/2,clos.y+clos.height/2); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.delay(1000); + if (!combo.isPopupVisible()) { + throw new RuntimeException("Combobox popup is not visible!"); + } + robot.mouseMove(clos.x+clos.width/2,clos.y+clos.height+3); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.delay(1000); + if (combo.getSelectedIndex() != 0) { + throw new RuntimeException("Combobox selection has not changed!"); + } + embedded_frame.remove(p); + embedded_frame.dispose(); + frame.dispose(); + } catch (Throwable thr) { + thr.printStackTrace(); + EmbeddedFrameGrabTest.fail("TEST FAILED: " + thr); + } + EmbeddedFrameGrabTest.pass(); + + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + System.out.println( "The test passed." ); + System.out.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + System.out.println( "The test failed: " + whyFailed ); + System.out.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class EmbeddedFrameGrabTest + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + EmbeddedFrameGrabTest.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + EmbeddedFrameGrabTest.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ \ No newline at end of file