From: <gda...@us...> - 2015-01-19 10:59:28
|
Revision: 2869 http://sourceforge.net/p/abbot/svn/2869 Author: gdavison Date: 2015-01-19 10:59:20 +0000 (Mon, 19 Jan 2015) Log Message: ----------- There are some specific issues with focus being stuck with a non-visible component in JDK8 that this fix attempts to work around: 1. active, now waits for window to become active 2. focus, now tries to detect the stuck focus condition and show the component in question to clear focus 3. Better reporting for currnet focus to help detect focus issues 4. Client property to make it possible to define a custom popup component. Modified Paths: -------------- abbot/trunk/projects/jdeveloper/Abbot.jws abbot/trunk/projects/jdeveloper/Library/Library.jpr abbot/trunk/projects/jdeveloper/Tests/Tests.jpr abbot/trunk/src/abbot/i18n/abbot.properties abbot/trunk/src/abbot/tester/FailedException.java abbot/trunk/src/abbot/tester/Robot.java abbot/trunk/src/abbot/util/AWT.java Modified: abbot/trunk/projects/jdeveloper/Abbot.jws =================================================================== --- abbot/trunk/projects/jdeveloper/Abbot.jws 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/projects/jdeveloper/Abbot.jws 2015-01-19 10:59:20 UTC (rev 2869) @@ -7,14 +7,16 @@ <hash n="component-versions"> <value n="oracle.adf.share.dt.migration.jps.JaznCredStoreMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.adf.share.dt.migration.wsm.PolicyAttachmentMigratorHelper" v="12.1.2.0.0"/> + <value n="oracle.adfdt.controller.adfc.source.migration.SavePointDataSourceForWLSMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.model.ide.security.extension.AdfSecurityMigrator" v="11.1.1.1.0.13"/> - <value n="oracle.ide.model.Project" v="11.1.1.1.0;12.1.1.0.0;12.1.2.0.0;12.1.3.0.0"/> + <value n="oracle.ide.model.Project" v="11.1.1.1.0;12.1.1.0.0;12.1.2.0.0;12.1.3.0.0;12.2.1.0.0"/> <value n="oracle.jbo.dt.jdevx.deployment.JbdProjectMigrator" v="11.1.2.0.0"/> + <value n="oracle.jdeveloper.maven.migrator.POMNodeMigrator" v="12.2.1.0.0"/> <value n="oracle.jdevimpl.appresources.ApplicationSrcDirMigrator" v="11.1.2.0.0"/> <value n="oracle.jdevimpl.deploy.migrators.AbramsDeploymentMigrator" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.deploy.migrators.AbramsJeeDeploymentMigrator" v="12.1.2.0.0"/> <value n="oracle.jdevimpl.deploy.migrators.JeeDeploymentMigrator" v="12.1.2.0.0"/> - <value n="oracle.jdevimpl.xml.oc4j.jps.JpsConfigMigratorHelper" v="11.1.1.1.0.1"/> + <value n="oracle.jdevimpl.xml.oc4j.jps.JpsConfigMigratorHelper" v="11.1.1.1.0.1;12.1.4.0.0"/> <value n="oracle.jdevimpl.xml.wl.WeblogicMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.mds.internal.dt.deploy.base.MarMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.mds.internal.dt.ide.migrator.MDSConfigMigratorHelper" v="11.1.1.0.5313"/> Modified: abbot/trunk/projects/jdeveloper/Library/Library.jpr =================================================================== --- abbot/trunk/projects/jdeveloper/Library/Library.jpr 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/projects/jdeveloper/Library/Library.jpr 2015-01-19 10:59:20 UTC (rev 2869) @@ -6,27 +6,33 @@ <value n="oracle.adfdt.controller.jsf2.diagram.migrate.JsfNodeMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.adfdt.controller.migrate.TrinidadDatabindingsProjectMigrator" v="11.1.2.0.0"/> <value n="oracle.adfdtinternal.dvt.datapresdt.migration.DVTDataMapMigrator" v="11.1.1.1.0.3"/> + <value n="oracle.adfdtinternal.dvt.datapresdt.migration.DVTWebAppConfigurationMigrator" v="12.1.3.0.0"/> <value n="oracle.adfdtinternal.model.ide.migration.ProjectMigrator" v="11.1.1.1.0.11.1.1"/> + <value n="oracle.adfdtinternal.model.ide.placeholderdc.migrator.PlaceholderProjectMigrator" v="12.1.4.0.0"/> <value n="oracle.adfdtinternal.model.ide.security.wizard.FormPageMigrator" v="11.1.1.0.0"/> <value n="oracle.adfdtinternal.model.ide.security.wizard.JpsFilterMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.model.ide.xmled.migration.ADFNodeMigrator" v="11.1.1.1.0.5"/> <value n="oracle.adfdtinternal.model.ide.xmled.migration.PageDefinitionParameterValueMigrator" v="11.1.1.1.0.5"/> + <value n="oracle.adfdtinternal.model.ide.xmled.migration.RestDataControlMigrator" v="12.1.4.0.0"/> <value n="oracle.adfdtinternal.model.ide.xmled.migration.WebXmlMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.view.common.migration.wizards.MigrationHelper" v="11.1.1.1.0.3"/> <value n="oracle.adfdtinternal.view.rich.binding.migration.JarResourceMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.view.rich.migration.ComponentIdNodeMigratorHelper" v="11.1.1.1.0.01"/> <value n="oracle.adfdtinternal.view.rich.migration.FacesLibraryVersionMigrator" v="11.1.1.1.0.1"/> <value n="oracle.adfdtinternal.view.rich.migration.LibraryVersionMigrator" v="11.1.1.1.0.1"/> - <value n="oracle.ide.model.Project" v="12.1.1.0.0;12.1.2.0.0;12.1.3.0.0"/> + <value n="oracle.ide.model.Project" v="12.1.1.0.0;12.1.2.0.0;12.1.3.0.0;12.2.1.0.0"/> <value n="oracle.ide.model.ResourcePathsMigrator" v="11.1.1.1.0"/> - <value n="oracle.ideimpl.model.TechnologyScopeUpdateMigrator" v="11.1.2.0.0.4;11.1.2.0.0.5"/> + <value n="oracle.ideimpl.model.TechnologyScopeUpdateMigrator" v="11.1.2.0.0.4;11.1.2.0.0.5;11.1.2.0.0.6"/> + <value n="oracle.jbo.dt.jclient.migrator.JCProjectMigrator" v="11.1.1.1.0"/> <value n="oracle.jbo.dt.jdevx.deployment.JbdProjectMigrator" v="11.1.2.0.0"/> + <value n="oracle.jbo.dt.jdevx.ui.appnav.APAdfConfigMigrator" v="11.1.2.0.0"/> <value n="oracle.jbo.dt.jdevx.ui.appnav.APProjectMigrator" v="11.1.1.0.1.5"/> <value n="oracle.jbo.dt.migrate.ResourceBundlePathMigrator" v="11.1.1.0.1.5"/> <value n="oracle.jbo.dt.migration.ServiceInterfaceMigrator" v="11.1.1.1.0"/> <value n="oracle.jdeveloper.dbmodeler.Migration" v="12.1.1.0.0"/> <value n="oracle.jdeveloper.ejb.EjbMigrator" v="11.1.1.1.0"/> <value n="oracle.jdeveloper.library.ProjectLibraryMigrator" v="11.1.1.1.0"/> + <value n="oracle.jdeveloper.maven.migrator.POMNodeMigrator" v="12.2.1.0.0"/> <value n="oracle.jdeveloper.model.OutputDirectoryMigrator" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.deploy.DeploymentProfilesMigrator" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.deploy.jps.JpsDataMigrator" v="11.1.1.1.0"/> @@ -35,13 +41,20 @@ <value n="oracle.jdevimpl.jsp.JspMigrator" v="11.1.1"/> <value n="oracle.jdevimpl.offlinedb.migration.OfflineDBProjectMigrator" v="11.1.1.1.0;12.1.1.0.0"/> <value n="oracle.jdevimpl.offlinedb.migration.OfflinePlSqlMigrator" v="11.1.1.1.0"/> + <value n="oracle.jdevimpl.offlinedb.migration.SXMLOfflineDBProjectMigrator" v="12.1.4.0.0"/> <value n="oracle.jdevimpl.resourcebundle.XliffAddin$XliffMigratorHelper" v="11.1.1.1.0"/> - <value n="oracle.jdevimpl.webapp.jsp.libraries.JspLibraryMigrator" v="11.1.1.1.4"/> + <value n="oracle.jdevimpl.webapp.facelets.libraries.FaceletsLibraryMigrator" v="12.2.1.0.0"/> + <value n="oracle.jdevimpl.webapp.jsp.libraries.JspLibraryMigrator" v="11.1.1.1.4;12.1.4.0.0"/> <value n="oracle.jdevimpl.webapp.jsp.taglibraries.trinidad.migration.TrinidadLibraryVersionMigrator" v="11.1.1.1.0.1"/> <value n="oracle.jdevimpl.webapp.WebAppContentSetNodeMigratorHelper" v="11.1.1"/> - <value n="oracle.jdevimpl.webapp.WebAppProjectNodeMigratorHelper" v="11.1.2.0.0;12.1.2.0.0"/> + <value n="oracle.jdevimpl.webapp.WebAppProjectNodeMigratorHelper" v="11.1.2.0.0;12.1.2.0.0;12.2.1.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestAppClassMigrator" v="12.1.3.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestJerseyLibMigrator" v="12.1.3.0.0"/> <value n="oracle.jdevimpl.webservices.rest.migration.RestLibraryMigrator" v="12.1.1.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestOwsmPolicyMigrator" v="12.1.3.0.0"/> <value n="oracle.jdevimpl.webservices.rest.migration.RestPathMigrator" v="11.1.2.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestWebAppMigrator" v="12.1.3.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestWeblogicWebAppMigrator" v="12.1.3.0.0"/> <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.xml.wl.WeblogicMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.modeler.bmmigrate.management.Migration" v="11.1.1.1.0"/> Modified: abbot/trunk/projects/jdeveloper/Tests/Tests.jpr =================================================================== --- abbot/trunk/projects/jdeveloper/Tests/Tests.jpr 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/projects/jdeveloper/Tests/Tests.jpr 2015-01-19 10:59:20 UTC (rev 2869) @@ -6,27 +6,33 @@ <value n="oracle.adfdt.controller.jsf2.diagram.migrate.JsfNodeMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.adfdt.controller.migrate.TrinidadDatabindingsProjectMigrator" v="11.1.2.0.0"/> <value n="oracle.adfdtinternal.dvt.datapresdt.migration.DVTDataMapMigrator" v="11.1.1.1.0.3"/> + <value n="oracle.adfdtinternal.dvt.datapresdt.migration.DVTWebAppConfigurationMigrator" v="12.1.3.0.0"/> <value n="oracle.adfdtinternal.model.ide.migration.ProjectMigrator" v="11.1.1.1.0.11.1.1"/> + <value n="oracle.adfdtinternal.model.ide.placeholderdc.migrator.PlaceholderProjectMigrator" v="12.1.4.0.0"/> <value n="oracle.adfdtinternal.model.ide.security.wizard.FormPageMigrator" v="11.1.1.0.0"/> <value n="oracle.adfdtinternal.model.ide.security.wizard.JpsFilterMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.model.ide.xmled.migration.ADFNodeMigrator" v="11.1.1.1.0.5"/> <value n="oracle.adfdtinternal.model.ide.xmled.migration.PageDefinitionParameterValueMigrator" v="11.1.1.1.0.5"/> + <value n="oracle.adfdtinternal.model.ide.xmled.migration.RestDataControlMigrator" v="12.1.4.0.0"/> <value n="oracle.adfdtinternal.model.ide.xmled.migration.WebXmlMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.view.common.migration.wizards.MigrationHelper" v="11.1.1.1.0.3"/> <value n="oracle.adfdtinternal.view.rich.binding.migration.JarResourceMigrator" v="11.1.1.1.0"/> <value n="oracle.adfdtinternal.view.rich.migration.ComponentIdNodeMigratorHelper" v="11.1.1.1.0.01"/> <value n="oracle.adfdtinternal.view.rich.migration.FacesLibraryVersionMigrator" v="11.1.1.1.0.1"/> <value n="oracle.adfdtinternal.view.rich.migration.LibraryVersionMigrator" v="11.1.1.1.0.1"/> - <value n="oracle.ide.model.Project" v="12.1.1.0.0;12.1.2.0.0;12.1.3.0.0"/> + <value n="oracle.ide.model.Project" v="12.1.1.0.0;12.1.2.0.0;12.1.3.0.0;12.2.1.0.0"/> <value n="oracle.ide.model.ResourcePathsMigrator" v="11.1.1.1.0"/> - <value n="oracle.ideimpl.model.TechnologyScopeUpdateMigrator" v="11.1.2.0.0.4;11.1.2.0.0.5"/> + <value n="oracle.ideimpl.model.TechnologyScopeUpdateMigrator" v="11.1.2.0.0.4;11.1.2.0.0.5;11.1.2.0.0.6"/> + <value n="oracle.jbo.dt.jclient.migrator.JCProjectMigrator" v="11.1.1.1.0"/> <value n="oracle.jbo.dt.jdevx.deployment.JbdProjectMigrator" v="11.1.2.0.0"/> + <value n="oracle.jbo.dt.jdevx.ui.appnav.APAdfConfigMigrator" v="11.1.2.0.0"/> <value n="oracle.jbo.dt.jdevx.ui.appnav.APProjectMigrator" v="11.1.1.0.1.5"/> <value n="oracle.jbo.dt.migrate.ResourceBundlePathMigrator" v="11.1.1.0.1.5"/> <value n="oracle.jbo.dt.migration.ServiceInterfaceMigrator" v="11.1.1.1.0"/> <value n="oracle.jdeveloper.dbmodeler.Migration" v="12.1.1.0.0"/> <value n="oracle.jdeveloper.ejb.EjbMigrator" v="11.1.1.1.0"/> <value n="oracle.jdeveloper.library.ProjectLibraryMigrator" v="11.1.1.1.0"/> + <value n="oracle.jdeveloper.maven.migrator.POMNodeMigrator" v="12.2.1.0.0"/> <value n="oracle.jdeveloper.model.OutputDirectoryMigrator" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.deploy.DeploymentProfilesMigrator" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.deploy.jps.JpsDataMigrator" v="11.1.1.1.0"/> @@ -35,13 +41,20 @@ <value n="oracle.jdevimpl.jsp.JspMigrator" v="11.1.1"/> <value n="oracle.jdevimpl.offlinedb.migration.OfflineDBProjectMigrator" v="11.1.1.1.0;12.1.1.0.0"/> <value n="oracle.jdevimpl.offlinedb.migration.OfflinePlSqlMigrator" v="11.1.1.1.0"/> + <value n="oracle.jdevimpl.offlinedb.migration.SXMLOfflineDBProjectMigrator" v="12.1.4.0.0"/> <value n="oracle.jdevimpl.resourcebundle.XliffAddin$XliffMigratorHelper" v="11.1.1.1.0"/> - <value n="oracle.jdevimpl.webapp.jsp.libraries.JspLibraryMigrator" v="11.1.1.1.4"/> + <value n="oracle.jdevimpl.webapp.facelets.libraries.FaceletsLibraryMigrator" v="12.2.1.0.0"/> + <value n="oracle.jdevimpl.webapp.jsp.libraries.JspLibraryMigrator" v="11.1.1.1.4;12.1.4.0.0"/> <value n="oracle.jdevimpl.webapp.jsp.taglibraries.trinidad.migration.TrinidadLibraryVersionMigrator" v="11.1.1.1.0.1"/> <value n="oracle.jdevimpl.webapp.WebAppContentSetNodeMigratorHelper" v="11.1.1"/> - <value n="oracle.jdevimpl.webapp.WebAppProjectNodeMigratorHelper" v="11.1.2.0.0;12.1.2.0.0"/> + <value n="oracle.jdevimpl.webapp.WebAppProjectNodeMigratorHelper" v="11.1.2.0.0;12.1.2.0.0;12.2.1.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestAppClassMigrator" v="12.1.3.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestJerseyLibMigrator" v="12.1.3.0.0"/> <value n="oracle.jdevimpl.webservices.rest.migration.RestLibraryMigrator" v="12.1.1.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestOwsmPolicyMigrator" v="12.1.3.0.0"/> <value n="oracle.jdevimpl.webservices.rest.migration.RestPathMigrator" v="11.1.2.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestWebAppMigrator" v="12.1.3.0.0"/> + <value n="oracle.jdevimpl.webservices.rest.migration.RestWeblogicWebAppMigrator" v="12.1.3.0.0"/> <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.jdevimpl.xml.wl.WeblogicMigratorHelper" v="11.1.1.1.0"/> <value n="oracle.modeler.bmmigrate.management.Migration" v="11.1.1.1.0"/> Modified: abbot/trunk/src/abbot/i18n/abbot.properties =================================================================== --- abbot/trunk/src/abbot/i18n/abbot.properties 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/src/abbot/i18n/abbot.properties 2015-01-19 10:59:20 UTC (rev 2869) @@ -156,6 +156,7 @@ tester.Robot.no_accessible_action=No accessible actions available for {0} tester.Robot.popup_missing=No popup responded to {0} at {1} tester.Robot.focus_failed=Focus change to ''{0}'' failed +tester.Robot.activate_failed=Activate window for ''{0}'' failed tester.Robot.no_menu_bar=No MenuBar found on ''{0}'' tester.Robot.no_menu_item=No MenuItem ''{0}'' found on ''{1}'' tester.Robot.no_popup_menu_item=No MenuItem ''{0}'' found on any PopupMenu on ''{1}'' Modified: abbot/trunk/src/abbot/tester/FailedException.java =================================================================== --- abbot/trunk/src/abbot/tester/FailedException.java 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/src/abbot/tester/FailedException.java 2015-01-19 10:59:20 UTC (rev 2869) @@ -1,5 +1,6 @@ package abbot.tester; +import java.awt.Component; import java.awt.Frame; import java.awt.KeyboardFocusManager; @@ -12,6 +13,9 @@ import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; +import java.util.ArrayList; +import java.util.List; + /** * An exception to note that a process has failed in Abbot and we want to presever * the system state. @@ -83,8 +87,15 @@ KeyboardFocusManager currentManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); - ps.printf("Focus owner %s\nFocus root %s\n", currentManager.getFocusOwner(), - currentManager.getCurrentFocusCycleRoot()); + Component next = currentManager.getFocusOwner(); + List<Component> tree = new ArrayList<Component>(); + + while (next!=null) { + tree.add(0, next); + next = next.getParent(); + } + + ps.printf("Focus owner %s\nFocus root %s\n", tree, currentManager.getCurrentFocusCycleRoot()); ps.println("\n\n[[[Dumping Windows]]] \n\n"); Modified: abbot/trunk/src/abbot/tester/Robot.java =================================================================== --- abbot/trunk/src/abbot/tester/Robot.java 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/src/abbot/tester/Robot.java 2015-01-19 10:59:20 UTC (rev 2869) @@ -35,6 +35,7 @@ import java.awt.Frame; import java.awt.GraphicsDevice; import java.awt.Insets; +import java.awt.KeyboardFocusManager; import java.awt.Label; import java.awt.MenuBar; import java.awt.MenuComponent; @@ -55,6 +56,7 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.PaintEvent; +import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; @@ -79,6 +81,7 @@ import javax.accessibility.AccessibleIcon; import javax.swing.AbstractButton; +import javax.swing.FocusManager; import javax.swing.JComponent; import javax.swing.JInternalFrame; import javax.swing.JLabel; @@ -519,13 +522,16 @@ focused = true; } public void focusLost(FocusEvent f) { + if (focused) { + Log.warn("FFF gained focus and lost again"); + } focused = false; } } /** Move keyboard focus to the given component. */ public void focus(final Component comp, boolean wait) { - + if (comp instanceof Window) { Window focusedWindow = AWT.getFocusedWindow(); @@ -539,8 +545,63 @@ return; } + // Check to see if the currentOwner is in fact visibiel + if (currentOwner != null && !AWT.getWindow(currentOwner).isVisible()) { + Log.warn("FFF Current focued component is not visible\n" + currentOwner.toString()); + Log.warn("FFF Going to attempt a hard reset of the focus owner"); + invokeAndWait(comp, new Runnable() { + public void run() { + KeyboardFocusManager kfm = FocusManager.getCurrentKeyboardFocusManager(); + kfm.clearGlobalFocusOwner(); + } + }); + waitForIdle(); + + // Do we still have a problem? + + Component ownerAfterRest = AWT.getFocusOwner(); + if (ownerAfterRest != null && ownerAfterRest == currentOwner) { + Log.warn("FFF Focus owner hasn't changed, going to force window show and hide"); + final Window parent = AWT.getWindow(ownerAfterRest); + Log.warn("FFF window " + parent); + + invokeAndWait(comp, new Runnable() { + public void run() { + parent.setVisible(true); + } + }); + + waitForIdle(); + + invokeAndWait(comp, new Runnable() { + public void run() { + KeyboardFocusManager kfm = FocusManager.getCurrentKeyboardFocusManager(); + kfm.clearGlobalFocusOwner(); + } + }); + + waitForIdle(); + + invokeAndWait(comp, new Runnable() { + public void run() { + parent.setVisible(false); + parent.dispose(); + } + }); + + waitForIdle(); + + + if (AWT.getFocusOwner() == currentOwner) { + Log.warn("FFF Nothing I do seems to make a diffenc, still stuck with previous state"); + } + + } + } + + Log.debug("Focus change"); @@ -971,7 +1032,7 @@ private static <E extends Throwable> void throwAny(Throwable e) throws E { throw (E)e; } - + /** * Wait for an idle AWT event queue. Note that this is different from * the implementation of <code>java.awt.Robot.waitForIdle()</code>, which @@ -2026,13 +2087,90 @@ /** Activate the given window. */ public void activate(final Window win) { - // ACTIVATE means window gets keyboard focus. - invokeAndWait(win, new Runnable() { - // FIXME figure out why two are sometimes needed - public void run() { win.toFront(); win.toFront(); } - }); - // For pointer-focus systems - mouseMove(win); + + Window originalActiveWindow = KeyboardFocusManager.getCurrentKeyboardFocusManager(). + getActiveWindow(); + if (win==originalActiveWindow) { + return; + } + else if (originalActiveWindow.getParent() == win && AWT.isHeavyweightPopup(originalActiveWindow)) { + return; // If we have a popup window on the current window + + } + + class ActivateWatcher extends WindowAdapter { + volatile boolean active; + + public ActivateWatcher() { + active = callAndWait(win, new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return win.isActive(); + } + }); + } + + @Override + public void windowActivated(WindowEvent e) { + } + } + final ActivateWatcher aw = new ActivateWatcher(); + + + try { + // Add listener to check we have an active window + invokeAndWait(win, new Runnable() { + public void run() { + // FIXME figure out why two are sometimes needed + win.addWindowListener(aw); + } + }); + + // ACTIVATE means window gets keyboard focus. + invokeAndWait(win, new Runnable() { + // FIXME figure out why two are sometimes needed + public void run() { + win.toFront(); + win.toFront(); + } + }); + + + // Check this window becomes active + try { + wait(new ConditionEDTDecorator(win, new Condition() { + + @Override + public boolean test() { + return aw.active; + } + }), componentDelay); + } catch (WaitTimedOutException wte) { + + Window active = KeyboardFocusManager.getCurrentKeyboardFocusManager(). + getActiveWindow(); + + String msg = Strings.get("tester.Robot.activate_failed", new Object[] { toString(win) }); + throw new ActionFailedException(msg, wte); + } + + waitForIdle(); + + + // For pointer-focus systems + mouseMove(win); + + } finally { + // remove listener to check we have an active window + invokeAndWait(win, new Runnable() { + public void run() { + + win.removeWindowListener(aw); + } + }); + + } + } protected Point getCloseLocation(Container c) { Modified: abbot/trunk/src/abbot/util/AWT.java =================================================================== --- abbot/trunk/src/abbot/util/AWT.java 2014-10-08 15:00:23 UTC (rev 2868) +++ abbot/trunk/src/abbot/util/AWT.java 2015-01-19 10:59:20 UTC (rev 2869) @@ -671,18 +671,25 @@ component (usually a Window). */ public static boolean isHeavyweightPopup(Component c) { - if (c instanceof Window - && !(c instanceof Dialog) - && !(c instanceof Frame)) { - String name = getName(c); - String cname = c.getClass().getName(); - return ("###overrideRedirect###".equals(name) - || "###focusableSwingPopup###".equals(name) - // These classes are known to be heavyweight popups - // javax.swing.DefaultPopupFactory$WindowPopup (1.3) - || cname.indexOf("PopupFactory$WindowPopup") != -1 - // javax.swing.Popup.HeavyWeightWindow (1.4) - || cname.indexOf("HeavyWeightWindow") != -1); + if (c instanceof Window) { + + if (!(c instanceof Dialog) && !(c instanceof Frame)) { + String name = getName(c); + String cname = c.getClass().getName(); + return ("###overrideRedirect###".equals(name) + || "###focusableSwingPopup###".equals(name) + // These classes are known to be heavyweight popups + // javax.swing.DefaultPopupFactory$WindowPopup (1.3) + || cname.indexOf("PopupFactory$WindowPopup") != -1 + // javax.swing.Popup.HeavyWeightWindow (1.4) + || cname.indexOf("HeavyWeightWindow") != -1); + } + + if (c instanceof Window && c instanceof RootPaneContainer && + ((RootPaneContainer)c).getRootPane().getClientProperty("abbot.customPopup")!=null) + { + return true; + } } return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |