diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java index 3fa7f8b7679..ebd0a8c4eff 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java @@ -2435,7 +2435,11 @@ public void ensureCleanUpAddonCleansUp() { partStackForEditor.getChildren().add(editor); partStackForEditor.setSelectedElement(editor); - ContextInjectionFactory.make(CleanupAddon.class, appContext); + // Store the addon in the context so it isn't garbage collected before + // its event handlers fire. The DI framework holds injected objects + // only via WeakReference, so an addon discarded here can be collected + // before its asyncExec runs, silently invalidating the requestor. + appContext.set(CleanupAddon.class, ContextInjectionFactory.make(CleanupAddon.class, appContext)); contextRule.createAndRunWorkbench(window); @@ -2445,8 +2449,6 @@ public void ensureCleanUpAddonCleansUp() { assertTrue(partStackForPartBPartC.isToBeRendered(), " PartStack with children should be rendered"); partService.hidePart(partB); - // Drain pending events between hides so that the event queue is clean - // when the second hidePart queues CleanupAddon's asyncExec for visCount==0 contextRule.spinEventLoop(); partService.hidePart(partC); contextRule.spinEventLoop(); @@ -2494,7 +2496,8 @@ public void testBug332463() { partStackB.getChildren().add(partC); partStackB.setSelectedElement(partC); - ContextInjectionFactory.make(CleanupAddon.class, appContext); + // See ensureCleanUpAddonCleansUp for why the addon is stored in the context. + appContext.set(CleanupAddon.class, ContextInjectionFactory.make(CleanupAddon.class, appContext)); contextRule.createAndRunWorkbench(window); diff --git a/tests/org.eclipse.e4.ui.workbench.addons.swt.test/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddonTest.java b/tests/org.eclipse.e4.ui.workbench.addons.swt.test/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddonTest.java index a5322b94e4c..0ce7b35f3a3 100644 --- a/tests/org.eclipse.e4.ui.workbench.addons.swt.test/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddonTest.java +++ b/tests/org.eclipse.e4.ui.workbench.addons.swt.test/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddonTest.java @@ -164,7 +164,11 @@ private void prepareApplicationModel() { appContext.set(MAddon.class, cleanupAddon); ContextInjectionFactory.setDefault(appContext); - ContextInjectionFactory.make(CleanupAddon.class, appContext); + // Store the addon in the context so it isn't garbage collected before + // its event handlers fire. The DI framework holds injected objects + // only via WeakReference, so an addon discarded here can be collected + // before its asyncExec runs, silently invalidating the requestor. + appContext.set(CleanupAddon.class, ContextInjectionFactory.make(CleanupAddon.class, appContext)); appContext.set(IResourceUtilities.class, new ISWTResourceUtilities() {