summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparentej <parentej@google.com>2017-01-19 16:44:19 +0000
committerparentej <parentej@google.com>2017-01-19 16:44:44 +0000
commit5774220cb6e4cb58fcaa80690cd6275054d2982c (patch)
treec1d1c0815973d96c16473f968bb9b1392265a0b1
parent29f84d38107e0c99c5b83bb333d0c6bbd83d2c0a (diff)
downloadswing-testing-5774220cb6e4cb58fcaa80690cd6275054d2982c.tar.gz
WindowChildrenFinder filtering windows ready for Garbage Collection
Window.getOwnedWindows() returns windows that it keeps inside a list of weak references. Windows that were never set visible or are already disposed should not be accounted for filtering. Test: Run WindowFilter_ignore_Test in a loop Change-Id: I6ffd2bd7066a52cf4db76f50acddc3b7913b9b1b
-rwxr-xr-x[-rw-r--r--]fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java15
-rwxr-xr-x[-rw-r--r--]fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java49
2 files changed, 46 insertions, 18 deletions
diff --git a/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java b/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java
index 633d7eb8..20c9a38b 100644..100755
--- a/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java
+++ b/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java
@@ -43,14 +43,17 @@ final class WindowChildrenFinder implements ChildrenFinderStrategy {
}
@RunsInCurrentThread
- private @Nonnull Collection<Component> ownedWindows(Window w) {
- return windows(w.getOwnedWindows());
- }
-
- private @Nonnull Collection<Component> windows(@Nonnull Component[] windows) {
+ private @Nonnull Collection<Component> ownedWindows(@Nonnull Window w) {
+ Component[] windows = w.getOwnedWindows();
if (isNullOrEmpty(windows)) {
return emptyList();
}
- return newArrayList(windows);
+ Collection<Component> windowsList = newArrayList();
+ for (Component c : windows) {
+ if (c.isDisplayable()) {
+ windowsList.add(c);
+ }
+ }
+ return windowsList;
}
}
diff --git a/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java b/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java
index d1450c59..46e6de24 100644..100755
--- a/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java
+++ b/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java
@@ -15,11 +15,10 @@
package org.fest.swing.hierarchy;
import static org.fest.assertions.Assertions.assertThat;
-import static org.fest.swing.edt.GuiActionRunner.execute;
import static org.fest.swing.test.builder.JButtons.button;
import static org.fest.swing.test.builder.JDialogs.dialog;
-import java.awt.Component;
+import java.awt.*;
import javax.swing.JDialog;
@@ -27,6 +26,7 @@ import org.fest.swing.annotation.RunsInEDT;
import org.fest.swing.edt.GuiTask;
import org.fest.swing.test.swing.TestDialog;
import org.fest.swing.test.swing.TestWindow;
+import org.junit.Assert;
import org.junit.Test;
/**
@@ -56,20 +56,45 @@ public class WindowFilter_ignore_Test extends WindowFilter_TestCase {
@Test
public void should_ignore_children_of_shared_invisible_Frame() {
- JDialog dialog = dialog().createNew();
- addToImplicitlyIgnoredMap(dialog);
- ignore(filter, dialog.getOwner());
- assertThat(allIgnored()).containsOnly(dialog);
+ JDialog dialog1 = dialog().createNew();
+ addToImplicitlyIgnoredMap(dialog1);
+
+ JDialog dialog2 = dialog().createNew();
+ addToImplicitlyIgnoredMap(dialog2);
+
+ try {
+ Window ownerWindow = dialog1.getOwner();
+ Assert.assertEquals(ownerWindow, dialog2.getOwner());
+
+ ignore(filter, ownerWindow);
+ assertThat(allIgnored()).isEmpty();
+
+ dialog1.setVisible(true);
+ dialog2.setVisible(true);
+
+ ignore(filter, ownerWindow);
+ assertThat(allIgnored()).containsOnly(dialog1, dialog2);
+
+ dialog1.dispose();
+ filter.ignored.clear();
+ ignore(filter, ownerWindow);
+ assertThat(allIgnored()).containsOnly(dialog2);
+
+ dialog2.dispose();
+ filter.ignored.clear();
+ ignore(filter, ownerWindow);
+ assertThat(allIgnored()).isEmpty();
+ }
+ finally {
+ dialog1.dispose();
+ dialog2.dispose();
+ }
+
assertThatNoComponentsAreImplicitlyIgnored();
}
@RunsInEDT
private static void ignore(final WindowFilter filter, final Component c) {
- execute(new GuiTask() {
- @Override
- protected void executeInEDT() {
- filter.ignore(c);
- }
- });
+ GuiTask.execute(() -> filter.ignore(c));
}
}