Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Loskutov2018-07-25 09:06:51 +0000
committerAndrey Loskutov2018-07-26 12:22:17 +0000
commit6a0d54ebad802fd5044e617494cf7b1e7859edca (patch)
treee4651d64580ce77f7af28cce6fa1533dff28f7cc
parent89ac3bc4eeb48f4991673c64c4d0bbafe75f5a0a (diff)
downloadeclipse.platform.swt-6a0d54ebad802fd5044e617494cf7b1e7859edca.tar.gz
eclipse.platform.swt-6a0d54ebad802fd5044e617494cf7b1e7859edca.tar.xz
eclipse.platform.swt-6a0d54ebad802fd5044e617494cf7b1e7859edca.zip
Bug 537364 - [GTK] DateTime instances leaks in the widgetTable after
disposal Only register/deregister handles if they are not already registered/deregistered. The test checks leaking widget handle in the widgetTable: after disposal, no traces of a widget should be found there. Change-Id: I678996b5004d348d6f1e24c9e8e5708e8c46bd9d Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java12
-rw-r--r--tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java29
2 files changed, 36 insertions, 5 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java
index bd68e8d79a..98b1bac10a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java
@@ -791,6 +791,9 @@ public int getMonth () {
@Override
String getNameText () {
+ if(calendar == null) {
+ return "";
+ }
if (isTime ()) {
return getHours () + ":" + getMinutes () + ":" + getSeconds ();
} else {
@@ -1846,8 +1849,8 @@ void updateControl() {
@Override
void register () {
super.register ();
- if (containerHandle != 0) display.addWidget (containerHandle, this);
- if (textEntryHandle != 0) display.addWidget (textEntryHandle, this);
+ if (containerHandle != 0 && containerHandle != handle) display.addWidget (containerHandle, this);
+ if (textEntryHandle != 0 && textEntryHandle != containerHandle) display.addWidget (textEntryHandle, this);
}
@Override
@@ -1858,9 +1861,8 @@ GdkRGBA defaultBackground () {
@Override
void deregister () {
super.deregister ();
- if (containerHandle != 0) display.removeWidget (containerHandle);
- if (fixedHandle != 0) display.removeWidget (fixedHandle);
- if (textEntryHandle != 0) display.removeWidget (textEntryHandle);
+ if (containerHandle != 0 && containerHandle != handle) display.removeWidget (containerHandle);
+ if (textEntryHandle != 0 && textEntryHandle != containerHandle) display.removeWidget (textEntryHandle);
}
int getArrow(long /*int*/ widget) {
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java
index fc5f543679..5fbf68c8aa 100644
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java
+++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java
@@ -17,12 +17,14 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import java.lang.reflect.Field;
import java.util.function.BooleanSupplier;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
@@ -57,14 +59,22 @@ public void tearDown() {
if (widget != null) {
assertEquals(disposedIntentionally, widget.isDisposed());
}
+ Display display = null;
if (!disposedIntentionally) {
assertFalse(shell.isDisposed());
+ display = shell.getDisplay();
}
shell.dispose();
if (widget != null) {
assertTrue(widget.isDisposed());
+ if(display != null) {
+ assertNotExists(getWidgetTable(display), widget);
+ }
}
assertTrue(shell.isDisposed());
+ if(display != null) {
+ assertNotExists(getWidgetTable(display), shell);
+ }
}
@Test
public void test_ConstructorLorg_eclipse_swt_widgets_WidgetI() {
@@ -226,5 +236,24 @@ protected void processEvents(int timeoutMs, BooleanSupplier condition) throws In
}
}
+protected void assertNotExists(Widget[] widgetTable, Widget w) {
+ for (Widget widget : widgetTable) {
+ if(widget == w) {
+ fail("Widget table leaks: " + w);
+ }
+ }
+}
+
+protected static Widget[] getWidgetTable(Display display) {
+ try {
+ Field field = Display.class.getDeclaredField("widgetTable");
+ field.setAccessible(true);
+ Widget[] widgetTable = (Widget[]) field.get(display);
+ return widgetTable;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+}
}

Back to the top