Index: E:/workspace-3.3.1.1/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/browser/XulRunnerBrowser.java =================================================================== --- E:/workspace-3.3.1.1/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/browser/XulRunnerBrowser.java (revision 5437) +++ E:/workspace-3.3.1.1/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/browser/XulRunnerBrowser.java (working copy) @@ -153,6 +153,10 @@ browser.addListener(eventType, listener); } + public void removeListener(int eventType, Listener listener) { + browser.removeListener(eventType, listener); + } + /** * Decorate Widget.dispose() */ @@ -158,7 +162,7 @@ */ public void dispose() { browser.dispose(); - + browser = null; } public static String getXulRunnerBundle() { @@ -416,4 +420,8 @@ public Browser getBrowser() { return browser; } + + protected void onDispose() { + + } } Index: E:/workspace-3.3.1.1/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java =================================================================== --- E:/workspace-3.3.1.1/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java (revision 5437) +++ E:/workspace-3.3.1.1/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java (working copy) @@ -15,6 +15,8 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; @@ -38,9 +40,13 @@ import org.mozilla.interfaces.nsIDragSession; import org.mozilla.interfaces.nsIInterfaceRequestor; import org.mozilla.interfaces.nsISelection; +import org.mozilla.interfaces.nsISelectionListener; +import org.mozilla.interfaces.nsISelectionPrivate; import org.mozilla.interfaces.nsIServiceManager; import org.mozilla.interfaces.nsISupports; +import org.mozilla.interfaces.nsITooltipListener; import org.mozilla.interfaces.nsITransferable; +import org.mozilla.interfaces.nsIWebProgressListener; import org.mozilla.xpcom.Mozilla; import org.mozilla.xpcom.XPCOMException; @@ -101,6 +107,17 @@ */ private boolean scrollRegtangleFlag = false; + private nsISelectionListener selectionListener; + + private Listener eventListenet = new Listener() { + + public void handleEvent(Event event) { + Display.getCurrent().asyncExec(new Thread(){ + public void run(){ + showSelectionRectangle(); + } + }); + }}; /** * @param parent * @throws XulRunnerException @@ -107,16 +124,34 @@ */ public XulRunnerEditor(Composite parent) throws XulRunnerException { super(parent); - - Listener eventListenet = new Listener() { + getBrowser().addDisposeListener(new DisposeListener() { - public void handleEvent(Event event) { - Display.getCurrent().asyncExec(new Thread(){ - public void run(){ - showSelectionRectangle(); - } - }); - }}; + public void widgetDisposed(DisposeEvent e) { + getWebBrowser().removeWebBrowserListener(XulRunnerEditor.this, nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID); + getWebBrowser().removeWebBrowserListener(XulRunnerEditor.this, nsITooltipListener.NS_ITOOLTIPLISTENER_IID); + if (selectionListener != null) { + nsISelection selection = getSelection(); + nsISelectionPrivate selectionPrivate = (nsISelectionPrivate) selection.queryInterface(nsISelectionPrivate.NS_ISELECTIONPRIVATE_IID); + selectionPrivate.removeSelectionListener(selectionListener); + } + if (resizeListener != null) + getIXulRunnerVpeResizer().removeResizeListener(resizeListener); + xulRunnerVpeResizer = null; + resizeListener = null; + if (eventListenet != null) { + removeListener(SWT.Paint, eventListenet); + removeListener(SWT.Show, eventListenet); + removeListener(SWT.FocusIn, eventListenet); + removeListener(SWT.Selection, eventListenet); + removeListener(SWT.Paint, eventListenet); + eventListenet = null; + } + getBrowser().removeDisposeListener(this); + onDispose(); + } + + }); + // addListener(SWT.Activate, eventListenet); addListener(SWT.Paint, eventListenet); //Commented by Max Areshkau (bug on Mac OS X10.4 @@ -411,7 +446,7 @@ try { parentElement = (nsIDOMElement) element.getParentNode().queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID); - } catch (XPCOMException ex) { + } catch (Exception ex) { // if parent node isn't nsIDOMElement just return null; return null; } @@ -421,7 +456,11 @@ return parentElement; }else { - parentElement=(nsIDOMElement) parentElement.getParentNode() ; + try { + parentElement=(nsIDOMElement) parentElement.getParentNode() ; + } catch (Exception e) { + return null; + } } } return parentElement; @@ -508,6 +547,15 @@ getIFlasher().scrollElementIntoView(element); } + + public void addSelectionListener ( + nsISelectionListener selectionListener) { + nsISelection selection = getSelection(); + nsISelectionPrivate selectionPrivate = (nsISelectionPrivate) selection.queryInterface(nsISelectionPrivate.NS_ISELECTIONPRIVATE_IID); + selectionPrivate.addSelectionListener(selectionListener); + this.selectionListener = selectionListener; + } + }