Community
Participate
Working Groups
Build ID: M20070212-1330 Steps To Reproduce: The main problem here is that the browser can be partially disposed (ie: the children are disposed, including the 'auto' object), but the Browser itself is not yet disposed. The call to setText is done like this: Display.getDefault ().asyncExec (new Runnable () { public void run () { if (!browser.isDisposed ()) browser.setText (html); } } (where html is non-null). Based on the stack trace below, I've determined how this is possible: 1. The above asyncExec call is done while the display thread is active doing something 2. The display thread continues, and eventually makes a call to dispose the widgets consisting of our view page. 3. The children of our view page are disposed (note that 'Widget.release' releases children before parents). 4. The 'auto' object belonging to the Browser is disposed 5. Its parent, the OleAutoControlSite is disposed 6. While the OleAutoControlSite is being disposed, it executes this portion of the stack trace: at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3325) at org.eclipse.swt.widgets.Display.foregroundIdleProc(Display.java:1072) at org.eclipse.swt.internal.win32.OS.VtblCall(Native Method) at org.eclipse.swt.internal.ole.win32.IOleInPlaceObject.InPlaceDeactivate(IOleInPlaceObject.java:21) at org.eclipse.swt.ole.win32.OleClientSite.deactivateInPlaceClient(OleClientSite.java:524) at org.eclipse.swt.ole.win32.OleClientSite.onDispose(OleClientSite.java:825) at org.eclipse.swt.ole.win32.OleClientSite.access$1(OleClientSite.java:821) at org.eclipse.swt.ole.win32.OleClientSite$1.handleEvent(OleClientSite.java:125) -- this causes the messages in the async queue to be executed. 7. Our async runnable is executed. The browser is not disposed of yet, although some of its children are. The NPE happens when it tries to use 'auto'. More information: org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NullPointerException) at org.eclipse.swt.SWT.error(SWT.java:3374) at org.eclipse.swt.SWT.error(SWT.java:3297) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:126) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3325) at org.eclipse.swt.widgets.Display.foregroundIdleProc(Display.java:1072) at org.eclipse.swt.internal.win32.OS.VtblCall(Native Method) at org.eclipse.swt.internal.ole.win32.IOleInPlaceObject.InPlaceDeactivate(IOleInPlaceObject.java:21) at org.eclipse.swt.ole.win32.OleClientSite.deactivateInPlaceClient(OleClientSite.java:524) at org.eclipse.swt.ole.win32.OleClientSite.onDispose(OleClientSite.java:825) at org.eclipse.swt.ole.win32.OleClientSite.access$1(OleClientSite.java:821) at org.eclipse.swt.ole.win32.OleClientSite$1.handleEvent(OleClientSite.java:125) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:933) at org.eclipse.swt.widgets.Widget.release(Widget.java:743) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:636) at org.eclipse.swt.widgets.Widget.release(Widget.java:746) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:636) at org.eclipse.swt.widgets.Widget.release(Widget.java:746) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:636) at org.eclipse.swt.widgets.Widget.release(Widget.java:746) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:636) at org.eclipse.swt.widgets.Widget.release(Widget.java:746) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:636) at org.eclipse.swt.widgets.Widget.release(Widget.java:746) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:636) at org.eclipse.swt.widgets.Widget.release(Widget.java:746) at org.eclipse.swt.widgets.Widget.dispose(Widget.java:415) at org.eclipse.ui.internal.PartPane.dispose(PartPane.java:167) at org.eclipse.ui.internal.ViewPane.dispose(ViewPane.java:193) at org.eclipse.ui.internal.WorkbenchPartReference.dispose(WorkbenchPartReference.java:639) at org.eclipse.ui.internal.WorkbenchPage.disposePart(WorkbenchPage.java:1548) at org.eclipse.ui.internal.WorkbenchPage.partRemoved(WorkbenchPage.java:1540) at org.eclipse.ui.internal.ViewFactory.releaseView(ViewFactory.java:252) at org.eclipse.ui.internal.Perspective.hideView(Perspective.java:494) at org.eclipse.ui.internal.WorkbenchPage.hideView(WorkbenchPage.java:2208) at org.eclipse.ui.internal.WorkbenchPage.hideView(WorkbenchPage.java:2222) ... Caused By: java.lang.NullPointerException at org.eclipse.swt.browser.Browser.setText(Browser.java:1354) at com.bobj.MyBrowserPage$2.run(MyBrowserPage.java:225) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123) ...
I can't make a snippet that reproduces this, and just fixing the symptom (adding an auto != null check) may be ignoring a bigger issue. Can you see if this still happens for you with eclipse 3.3 (there were big changes in this area)?
I'll look into whether it's reproducible in 3.3; it'll likely be a few weeks until I have time to do it though.
Timed out, closing report. Please reopen if you have more info to provide, and if this still happens with a recent swt version, thanks.