Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 334577

Summary: Child windows of perspectives/windows needs to be unrendered as a part of the element's unrendering process
Product: [Eclipse Project] e4 Reporter: Remy Suen <remy.suen>
Component: UIAssignee: Remy Suen <remy.suen>
Status: VERIFIED FIXED QA Contact: Eric Moffatt <emoffatt>
Severity: normal    
Priority: P3    
Version: 1.0   
Target Milestone: 4.1 M5   
Hardware: All   
OS: All   
Whiteboard:
Attachments:
Description Flags
PartRenderingEngine patch v1 none

Description Remy Suen CLA 2011-01-17 15:04:34 EST
1. Window > Show View > Error Log
2. Detach the 'Error Log' file.
3. Shutdown Eclipse.


org.eclipse.e4.core.di.InjectionException: java.lang.NullPointerException
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:59)
	at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:75)
	at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:88)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:326)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:343)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.activate(EclipseContext.java:596)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.activateBranch(EclipseContext.java:601)
	at org.eclipse.e4.ui.internal.workbench.PartActivationHistory.activate(PartActivationHistory.java:52)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:506)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:479)
	at org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer.activate(AbstractPartRenderer.java:105)
	at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer$3.handleEvent(ContributedPartRenderer.java:210)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1058)
	at org.eclipse.swt.widgets.Shell.setActiveControl(Shell.java:1447)
	at org.eclipse.swt.widgets.Control.sendFocusEvent(Control.java:2740)
	at org.eclipse.swt.widgets.Widget.wmSetFocus(Widget.java:2477)
	at org.eclipse.swt.widgets.Control.WM_SETFOCUS(Control.java:4950)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4373)
	at org.eclipse.swt.widgets.Text.windowProc(Text.java:2243)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4909)
	at org.eclipse.swt.internal.win32.OS.SetFocus(Native Method)
	at org.eclipse.swt.widgets.Control.forceFocus(Control.java:1056)
	at org.eclipse.swt.widgets.Control.setFocus(Control.java:3103)
	at org.eclipse.ui.internal.views.log.LogView.setFocus(LogView.java:1079)
	at org.eclipse.ui.internal.views.log.LogView.onTextShellDispose(LogView.java:1315)
	at org.eclipse.ui.internal.views.log.LogView$28.widgetDisposed(LogView.java:1308)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:123)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1058)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:808)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446)
	at org.eclipse.swt.widgets.Decorations.dispose(Decorations.java:447)
	at org.eclipse.swt.widgets.Shell.dispose(Shell.java:714)
	at org.eclipse.ui.internal.views.log.LogView.dispose(LogView.java:621)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.invalidate(CompatibilityPart.java:120)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.destroy(CompatibilityPart.java:231)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
	at java.lang.reflect.Method.invoke(Method.java:600)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:52)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:828)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:808)
	at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:355)
	at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:112)
	at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:63)
	at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:88)
	at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.doHandleInvalid(TrackableComputationExt.java:53)
	at org.eclipse.e4.core.internal.contexts.Computation.handleInvalid(Computation.java:53)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:177)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:165)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:165)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:690)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:671)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:613)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:608)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:593)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:646)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:613)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:608)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:593)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:646)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:613)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:608)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:593)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:646)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:613)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:608)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:593)
	at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1556)
	at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1255)
	at org.eclipse.ui.internal.WorkbenchWindow.access$9(WorkbenchWindow.java:1234)
	at org.eclipse.ui.internal.WorkbenchWindow$6.run(WorkbenchWindow.java:1281)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1279)
	at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1044)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1038)
	at org.eclipse.ui.internal.Workbench.access$12(Workbench.java:950)
	at org.eclipse.ui.internal.Workbench$15.run(Workbench.java:1119)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.Workbench.close(Workbench.java:1117)
	at org.eclipse.ui.internal.Workbench.close(Workbench.java:1090)
	at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1252)
	at org.eclipse.ui.internal.WorkbenchWindow.access$9(WorkbenchWindow.java:1234)
	at org.eclipse.ui.internal.WorkbenchWindow$6.run(WorkbenchWindow.java:1281)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1279)
	at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1295)
	at org.eclipse.ui.internal.WorkbenchWindow$4.close(WorkbenchWindow.java:440)
	at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer$8.shellClosed(WBWRenderer.java:434)

Caused by: java.lang.NullPointerException
	at org.eclipse.e4.ui.internal.workbench.SelectionServiceImpl.isMasterService(SelectionServiceImpl.java:135)
	at org.eclipse.e4.ui.internal.workbench.SelectionServiceImpl.setPart(SelectionServiceImpl.java:149)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
	at java.lang.reflect.Method.invoke(Method.java:600)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:52)
	... 152 more
Comment 1 Remy Suen CLA 2011-01-18 10:48:49 EST
Created attachment 187010 [details]
PartRenderingEngine patch v1

The problem is that when a perspective or a window is unrendered, its child windows are _not_. At this point, the deconstruction code ultimately causes the view to try to set focus to something (and thus reactivating the part). This wouldn't normally happen because the focus call would not have happened if the widgets were already disposed (during the deconstruction process).

The fix is to unrender child windows before the element itself is unrendered.
Comment 2 Remy Suen CLA 2011-01-18 10:51:15 EST
Fix released to CVS HEAD.
Comment 3 Remy Suen CLA 2011-01-26 09:04:30 EST
Verified with I20110125-2200 on Windows XP.