# HG changeset patch # User arapte # Date 1462448665 -10800 # Node ID 8f8ed520c0787d23a2ca3117f09af80c966e349c # Parent 5a0c6a730a64673221aada564cdea0d6ae158f4c 6384991: TrayIcon ActionListener called at wrong time Reviewed-by: rchamyal, serb diff -r 5a0c6a730a64 -r 8f8ed520c078 jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java Thu May 05 01:30:23 2016 +0300 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java Thu May 05 14:44:25 2016 +0300 @@ -464,7 +464,7 @@ XToolkit.postEvent(XToolkit.targetToAppContext(e.getSource()), e); } public void mouseClicked(MouseEvent e) { - if ((e.getClickCount() > 1 || xtiPeer.balloon.isVisible()) && + if ((e.getClickCount() == 1 || xtiPeer.balloon.isVisible()) && e.getButton() == MouseEvent.BUTTON1) { ActionEvent aev = new ActionEvent(xtiPeer.target, ActionEvent.ACTION_PERFORMED, diff -r 5a0c6a730a64 -r 8f8ed520c078 jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java --- a/jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java Thu May 05 01:30:23 2016 +0300 +++ b/jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java Thu May 05 14:44:25 2016 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, 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 @@ -21,16 +21,19 @@ * questions. */ -import java.awt.*; -import java.awt.event.*; +import java.awt.EventQueue; +import java.awt.Point; +import java.awt.SystemTray; +import java.awt.TrayIcon; +import java.awt.event.InputEvent; import java.awt.image.BufferedImage; /* - * @test - * @summary Check if ActionEvent is triggered by a TrayIcon only when - * it is double clicked using mouse button 1 (or single clicked - * with button 3 (on Mac OS X)) - * @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com) + * @test 6384991 + * @summary Check if ActionEvent is triggered by a TrayIcon when + * it is double clicked with mouse button 1 on windows + * or single clicked with button 3 on Mac OS X + * or single clicked with button 1 on rest. * @library /java/awt/patchlib * @library ../../../../lib/testlibrary ../ * @build java.desktop/java.awt.Helper @@ -42,19 +45,17 @@ TrayIcon icon; ExtendedRobot robot; - boolean actionPerformed = false; Object actionLock = new Object(); static boolean isMacOS = false; - + static boolean isWinOS = false; + static boolean isOelOS = false; String caption = "Sample Icon"; - int[] buttonTypes = { InputEvent.BUTTON1_MASK, InputEvent.BUTTON2_MASK, InputEvent.BUTTON3_MASK }; - String[] buttonNames = { "BUTTON1", "BUTTON2", @@ -62,30 +63,31 @@ }; public static void main(String[] args) throws Exception { - if (! SystemTray.isSupported()) { - System.out.println("SystemTray not supported on the platform under test. " + - "Marking the test passed"); + if (!SystemTray.isSupported()) { + System.out.println("SystemTray not supported on the platform " + + "under test. Marking the test passed"); } else { - if (System.getProperty("os.name").toLowerCase().startsWith("mac")) { + String osName = System.getProperty("os.name").toLowerCase(); + if (osName.startsWith("mac")) { isMacOS = true; - } else if (SystemTrayIconHelper.isOel7()) { - System.out.println("OEL 7 doesn't support double click in " + - "systray. Skipped"); - return; + } else if (osName.startsWith("win")) { + isWinOS = true; + } else { + isOelOS = SystemTrayIconHelper.isOel7(); } new TrayIconMouseTest().doTest(); } } - TrayIconMouseTest() throws Exception{ + TrayIconMouseTest() throws Exception { robot = new ExtendedRobot(); EventQueue.invokeAndWait(this::initializeGUI); } void initializeGUI() { - SystemTray tray = SystemTray.getSystemTray(); - icon = new TrayIcon(new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB), caption); + icon = new TrayIcon( + new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB), caption); icon.addActionListener(event -> { actionPerformed = true; synchronized (actionLock) { @@ -103,31 +105,32 @@ } private void doTest() throws Exception { - Point iconPosition = SystemTrayIconHelper.getTrayIconLocation(icon); - if (iconPosition == null) + if (iconPosition == null) { throw new RuntimeException("Unable to find the icon location!"); - + } robot.mouseMove(iconPosition.x, iconPosition.y); robot.waitForIdle(); for (int i = 0; i < buttonTypes.length; i++) { actionPerformed = false; robot.click(buttonTypes[i]); - robot.waitForIdle(6000); - - if (isMacOS && actionPerformed && i == 2) { + robot.waitForIdle(); + delayIfRequired(); - }else if (isMacOS && i == 2) { - throw new RuntimeException("FAIL: ActionEvent NOT triggered when " + - buttonNames[i] + " is single clicked on Mac OS"); - }else if (actionPerformed) { - throw new RuntimeException("FAIL: ActionEvent triggered when " + - buttonNames[i] + " is single clicked"); + if (isMacOS && i == 2 && !actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent NOT triggered " + + "when " + buttonNames[i] + " is single clicked on Mac"); + } else if (isWinOS && actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent triggered " + + "when " + buttonNames[i] + " is single clicked"); + } else if (!isMacOS && !isWinOS && i == 0 && !actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent NOT triggered " + + "when " + buttonNames[i] + " is single clicked"); } } - if(!isMacOS) { + if (!isMacOS && !isOelOS) { for (int i = 0; i < buttonTypes.length; i++) { for (int j = 0; j < buttonTypes.length; j++) { if (j != i) { @@ -136,13 +139,22 @@ robot.mousePress(buttonTypes[j]); robot.mouseRelease(buttonTypes[j]); robot.mouseRelease(buttonTypes[i]); - robot.waitForIdle(); + delayIfRequired(); - if (actionPerformed) - throw new RuntimeException("FAIL: ActionEvent triggered when " + - buttonNames[i] + " and " + buttonNames[j] + - " is clicked and released"); + if (isWinOS) { + if (actionPerformed) { + throw new RuntimeException( + "FAIL: ActionEvent triggered when " + + buttonNames[i] + " & " + buttonNames[j] + + " is clicked and released"); + } + + } else if ((i == 0 || j == 0) && !actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent is " + + "NOT triggered when " + buttonNames[i] + " & " + + buttonNames[j] + " is pressed & released"); + } } } } @@ -150,31 +162,34 @@ for (int i = 0; i < buttonTypes.length; i++) { actionPerformed = false; robot.mousePress(buttonTypes[i]); - robot.delay(50); robot.mouseRelease(buttonTypes[i]); robot.delay(50); robot.mousePress(buttonTypes[i]); - robot.delay(50); robot.mouseRelease(buttonTypes[i]); + robot.waitForIdle(); + delayIfRequired(); if (i == 0) { - if (! actionPerformed) { - synchronized (actionLock) { - try { - actionLock.wait(6000); - } catch (Exception e) { - } - } + if (!actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent not " + + "triggered when " + buttonNames[i] + + " is double clicked"); } - if (! actionPerformed) - throw new RuntimeException("FAIL: ActionEvent not triggered when " + - buttonNames[i] + " is double clicked"); - } else { - robot.waitForIdle(); + } else if (actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent " + + "triggered when " + buttonNames[i] + + " is double clicked"); + } + } + } + } - if (actionPerformed) - throw new RuntimeException("FAIL: ActionEvent triggered when " + - buttonNames[i] + " is double clicked"); + public void delayIfRequired() { + if (!actionPerformed) { + synchronized (actionLock) { + try { + actionLock.wait(500); + } catch (Exception e) { } } }