< prev index next >

test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java

Print this page

        

@@ -21,43 +21,49 @@
  * questions.
  */
 
 /*
  @test
-  @bug 8007220
-  @summary Reference to the popup leaks after the TrayIcon is removed
-  @author Petr Pchelko
-  @library ../../../../lib/testlibrary/
-  @build ExtendedRobot
+  @bug 8007220 8039081
+  @summary Reference to the popup should not leak after the TrayIcon is 
+           removed from system tray.
   @run main/othervm -Xmx50m PopupMenuLeakTest
  */
 
-import java.awt.*;
-import javax.swing.SwingUtilities;
-
+import java.awt.Color;
+import java.awt.Frame;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.MenuItem;
+import java.awt.PopupMenu;
+import java.awt.RenderingHints;
+import java.awt.SystemTray;
+import java.awt.TrayIcon;
 import java.awt.image.BufferedImage;
+import javax.swing.SwingUtilities;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.concurrent.atomic.AtomicReference;
 
 public class PopupMenuLeakTest {
 
-    static final AtomicReference<WeakReference<TrayIcon>> iconWeakReference = new AtomicReference<>();
-    static final AtomicReference<WeakReference<PopupMenu>> popupWeakReference = new AtomicReference<>();
-    static ExtendedRobot robot;
+    static final AtomicReference<WeakReference<TrayIcon>> iconWeakReference
+            = new AtomicReference<>();
+    static final AtomicReference<WeakReference<PopupMenu>> popupWeakReference
+            = new AtomicReference<>();
+    static Frame popupMenuParentFrame;
 
     public static void main(String[] args) throws Exception {
-        robot = new ExtendedRobot();
         SwingUtilities.invokeAndWait(PopupMenuLeakTest::createSystemTrayIcon);
-        sleep();
-        // To make the test automatic we explicitly call addNotify on a popup to create the peer
+        // To automate the test, explicitly call addNotify on a popup
+        // to create the peer.
         SwingUtilities.invokeAndWait(PopupMenuLeakTest::addNotifyPopup);
-        sleep();
         SwingUtilities.invokeAndWait(PopupMenuLeakTest::removeIcon);
-        sleep();
-        assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected");
-        assertCollected(iconWeakReference.get(), "Failed, reference to tray icon not collected");
+        assertCollected(popupWeakReference.get(),
+                "Failed, reference to popup not collected");
+        assertCollected(iconWeakReference.get(),
+                "Failed, reference to tray icon not collected");
     }
 
     private static void addNotifyPopup() {
         PopupMenu menu = popupWeakReference.get().get();
         if (menu == null) {

@@ -70,22 +76,24 @@
         TrayIcon icon = iconWeakReference.get().get();
         if (icon == null) {
             throw new RuntimeException("Failed: TrayIcon collected too early");
         }
         SystemTray.getSystemTray().remove(icon);
+
+        PopupMenu menu = popupWeakReference.get().get();
+        popupMenuParentFrame.remove(menu);
+        popupMenuParentFrame.dispose();
     }
 
-    private static void assertCollected(WeakReference<?> reference, String message) {
+    private static void assertCollected(WeakReference<?> reference,
+            String message) {
         java.util.List<byte[]> bytes = new ArrayList<>();
-        for (int i = 0; i < 5; i ++) {
             try {
                 while (true) {
-                    bytes.add(new byte[1024]);
+                bytes.add(new byte[4096]);
                 }
             } catch (OutOfMemoryError err) {
-                bytes = new ArrayList<>();
-            }
         }
         if (reference.get() != null) {
             throw new RuntimeException(message);
         }
     }

@@ -93,32 +101,35 @@
     private static void createSystemTrayIcon() {
         final TrayIcon trayIcon = new TrayIcon(createTrayIconImage());
         trayIcon.setImageAutoSize(true);
 
         try {
-            // Add tray icon to system tray *before* adding popup menu to demonstrate buggy behaviour
+            // Add tray icon to system tray *before* adding popup menu.
             trayIcon.setPopupMenu(createTrayIconPopupMenu());
             SystemTray.getSystemTray().add(trayIcon);
             iconWeakReference.set(new WeakReference<>(trayIcon));
-            popupWeakReference.set(new WeakReference<>(trayIcon.getPopupMenu()));
-        } catch (final AWTException awte) {
-            awte.printStackTrace();
+            popupWeakReference.set(new WeakReference<>(
+                    trayIcon.getPopupMenu()));
+        } catch (final Exception ex) {
+            ex.printStackTrace();
         }
     }
 
     private static Image createTrayIconImage() {
-        /**
-         * Create a small image of a red circle to use as the icon for the tray icon
-         */
+        // Create a small red circle image to use as the icon for tray icon.
         int trayIconImageSize = 32;
-        final BufferedImage trayImage = new BufferedImage(trayIconImageSize, trayIconImageSize, BufferedImage.TYPE_INT_ARGB);
-        final Graphics2D trayImageGraphics = (Graphics2D) trayImage.getGraphics();
+        final BufferedImage trayImage = new BufferedImage(trayIconImageSize,
+                trayIconImageSize, BufferedImage.TYPE_INT_ARGB);
+        final Graphics2D trayImageGraphics
+                = (Graphics2D) trayImage.getGraphics();
 
-        trayImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        trayImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                RenderingHints.VALUE_ANTIALIAS_ON);
 
         trayImageGraphics.setColor(new Color(255, 255, 255, 0));
-        trayImageGraphics.fillRect(0, 0, trayImage.getWidth(), trayImage.getHeight());
+        trayImageGraphics.fillRect(0, 0, trayImage.getWidth(),
+                trayImage.getHeight());
 
         trayImageGraphics.setColor(Color.red);
 
         int trayIconImageInset = 4;
         trayImageGraphics.fillOval(trayIconImageInset,

@@ -135,15 +146,16 @@
 
         return trayImage;
     }
 
     private static PopupMenu createTrayIconPopupMenu() {
+        popupMenuParentFrame = new Frame();
+        popupMenuParentFrame.setVisible(true);
+
         final PopupMenu trayIconPopupMenu = new PopupMenu();
         final MenuItem popupMenuItem = new MenuItem("TEST!");
         trayIconPopupMenu.add(popupMenuItem);
-        return trayIconPopupMenu;
-    }
 
-    private static void sleep() {
-        robot.waitForIdle(100);
+        popupMenuParentFrame.add(trayIconPopupMenu);
+        return trayIconPopupMenu;
     }
 }
< prev index next >