Bug 199936 - Browser.setText can cause NPE if run through Display.asyncExec
Summary: Browser.setText can cause NPE if run through Display.asyncExec
Status: RESOLVED WORKSFORME
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 3.2.2   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Grant Gayed CLA
QA Contact:
URL:
Whiteboard:
Keywords: needinfo
Depends on:
Blocks:
 
Reported: 2007-08-14 14:47 EDT by Chris Lee CLA
Modified: 2010-02-12 15:06 EST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Chris Lee CLA 2007-08-14 14:47:21 EDT
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)
	...
Comment 1 Grant Gayed CLA 2007-08-20 11:55:11 EDT
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)?
Comment 2 Chris Lee CLA 2007-08-22 13:05:46 EDT
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.
Comment 3 Grant Gayed CLA 2010-02-12 15:06:20 EST
Timed out, closing report.  Please reopen if you have more info to provide, and if this still happens with a recent swt version, thanks.