diff options
| author | Andrey Loskutov | 2018-07-25 09:06:51 +0000 |
|---|---|---|
| committer | Andrey Loskutov | 2018-07-26 12:22:17 +0000 |
| commit | 6a0d54ebad802fd5044e617494cf7b1e7859edca (patch) | |
| tree | e4651d64580ce77f7af28cce6fa1533dff28f7cc | |
| parent | 89ac3bc4eeb48f4991673c64c4d0bbafe75f5a0a (diff) | |
| download | eclipse.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>
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; + } +} } |
