src/java.desktop/share/classes/java/awt/Robot.java

Print this page

        

@@ -32,13 +32,16 @@
 import java.awt.image.DirectColorModel;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.awt.peer.RobotPeer;
 import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+
 import sun.awt.AWTPermissions;
 import sun.awt.ComponentFactory;
 import sun.awt.SunToolkit;
+import sun.awt.OSInfo;
 import sun.awt.image.SunWritableRaster;
 
 /**
  * This class is used to generate native system input events
  * for the purposes of test automation, self-running demos, and

@@ -548,31 +551,21 @@
             throw new IllegalArgumentException("Delay must be to 0 to 60,000ms");
         }
     }
 
     /**
-     * Waits until all events currently on the event queue have been processed.
+     * Waits until all events currently on the event queue have been processed and tries
+     * to synchronize with the native windowing sub-system.
      * @throws  IllegalThreadStateException if called on the AWT event dispatching thread
      */
     public synchronized void waitForIdle() {
         checkNotDispatchThread();
-        // post a dummy event to the queue so we know when
-        // all the events before it have been processed
-        try {
             SunToolkit.flushPendingEvents();
-            EventQueue.invokeAndWait( new Runnable() {
-                                            public void run() {
-                                                // dummy implementation
-                                            }
-                                        } );
-        } catch(InterruptedException ite) {
-            System.err.println("Robot.waitForIdle, non-fatal exception caught:");
-            ite.printStackTrace();
-        } catch(InvocationTargetException ine) {
-            System.err.println("Robot.waitForIdle, non-fatal exception caught:");
-            ine.printStackTrace();
-        }
+
+        // 7185258: realSync() call blocks all DnD tests on OS X
+        if (AccessController.doPrivileged(OSInfo.getOSTypeAction()) != OSInfo.OSType.MACOSX)
+            ((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
     }
 
     private void checkNotDispatchThread() {
         if (EventQueue.isDispatchThread()) {
             throw new IllegalThreadStateException("Cannot call method from the event dispatcher thread");