### Eclipse Workspace Patch 1.0 #P org.eclipse.swt Index: Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java,v retrieving revision 1.144 diff -u -r1.144 Mozilla.java --- Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java 10 Sep 2009 19:51:34 -0000 1.144 +++ Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java 11 Sep 2009 21:06:57 -0000 @@ -47,7 +47,7 @@ int refCount, lastKeyCode, lastCharCode, authCount; int /*long*/ request; Point location, size; - boolean visible, isChild, ignoreDispose, isRetrievingBadCert, isViewingErrorPage; + boolean visible, isChild, ignoreDispose, isRetrievingBadCert, isViewingErrorPage, ignoreAllMessages; Shell tip = null; Listener listener; Vector unhookedDOMWindows = new Vector (); @@ -2097,6 +2097,16 @@ } void onDispose (Display display) { + /* invoke onbeforeunload handler(s) */ + if (!isClosing) { + LocationListener[] oldLocationListeners = locationListeners; + locationListeners = new LocationListener[0]; + ignoreAllMessages = true; + execute ("window.location.replace('about:blank');"); //$NON-NLS-1$ + ignoreAllMessages = false; + locationListeners = oldLocationListeners; + } + int rc = webBrowser.RemoveWebBrowserListener (weakReference.getAddress (), nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID); if (rc != XPCOM.NS_OK) error (rc); Index: Eclipse SWT Mozilla/common/org/eclipse/swt/browser/PromptService2.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/PromptService2.java,v retrieving revision 1.9 diff -u -r1.9 PromptService2.java --- Eclipse SWT Mozilla/common/org/eclipse/swt/browser/PromptService2.java 19 Aug 2009 20:18:47 -0000 1.9 +++ Eclipse SWT Mozilla/common/org/eclipse/swt/browser/PromptService2.java 11 Sep 2009 21:06:57 -0000 @@ -221,7 +221,13 @@ int Confirm (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ _retval) { Browser browser = getBrowser (aParent); - + + if (browser != null && ((Mozilla)browser.webBrowser).ignoreAllMessages) { + int[] result = {1}; + XPCOM.memmove (_retval, result, 4); /* PRBool */ + return XPCOM.NS_OK; + } + int length = XPCOM.strlen_PRUnichar (aDialogTitle); char[] dest = new char[length]; XPCOM.memmove (dest, aDialogTitle, length * 2); @@ -238,7 +244,7 @@ messageBox.setMessage (textLabel); int id = messageBox.open (); int[] result = {id == SWT.OK ? 1 : 0}; - XPCOM.memmove (_retval, result, 4); + XPCOM.memmove (_retval, result, 4); /* PRBool */ return XPCOM.NS_OK; } Index: Eclipse SWT Browser/win32/org/eclipse/swt/browser/WebSite.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/WebSite.java,v retrieving revision 1.65 diff -u -r1.65 WebSite.java --- Eclipse SWT Browser/win32/org/eclipse/swt/browser/WebSite.java 2 Sep 2009 19:37:06 -0000 1.65 +++ Eclipse SWT Browser/win32/org/eclipse/swt/browser/WebSite.java 11 Sep 2009 21:06:57 -0000 @@ -27,7 +27,7 @@ COMObject iOleCommandTarget; COMObject iAuthenticate; COMObject iDispatch; - boolean ignoreNextMessage; + boolean ignoreNextMessage, ignoreAllMessages; Boolean canExecuteApplets; static final int OLECMDID_SHOWSCRIPTERROR = 40; @@ -412,7 +412,7 @@ /* IDocHostShowUI */ int ShowMessage(int /*long*/ hwnd, int /*long*/ lpstrText, int /*long*/ lpstrCaption, int dwType, int /*long*/ lpstrHelpFile, int dwHelpContext, int /*long*/ plResult) { - boolean ignore = ignoreNextMessage; + boolean ignore = ignoreNextMessage || ignoreAllMessages; ignoreNextMessage = false; return ignore ? COM.S_OK : COM.S_FALSE; } Index: Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java,v retrieving revision 1.53 diff -u -r1.53 IE.java --- Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java 10 Sep 2009 19:51:26 -0000 1.53 +++ Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java 11 Sep 2009 21:06:57 -0000 @@ -22,7 +22,7 @@ class IE extends WebBrowser { OleFrame frame; - OleControlSite site; + WebSite site; OleAutomation auto; OleListener domListener; OleAutomation[] documents = new OleAutomation[0]; @@ -271,7 +271,15 @@ browser.notifyListeners (e.type, e); e.type = SWT.NONE; -// execute("window.location.href='about:blank';"); + /* invoke onbeforeunload handler(s) */ + if (!isClosing) { + LocationListener[] oldLocationListeners = locationListeners; + locationListeners = new LocationListener[0]; + site.ignoreAllMessages = true; + execute ("window.location.href='about:blank'"); //$NON-NLS-1$ + site.ignoreAllMessages = false; + locationListeners = oldLocationListeners; + } /* * It is possible for the Browser's OLE frame to have been disposed Index: Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java,v retrieving revision 1.64 diff -u -r1.64 Safari.java --- Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java 10 Sep 2009 19:51:26 -0000 1.64 +++ Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java 11 Sep 2009 21:06:57 -0000 @@ -40,7 +40,7 @@ String url = ""; //$NON-NLS-1$ Point location; Point size; - boolean statusBar = true, toolBar = true, ignoreDispose; + boolean statusBar = true, toolBar = true, ignoreDispose, acceptAllBeforeUnloadConfirms; //TEMPORARY CODE // boolean doit; @@ -293,6 +293,13 @@ browser.notifyListeners (e.type, e); e.type = SWT.NONE; + /* invoke onbeforeunload handler(s) */ + if (!isClosing) { + acceptAllBeforeUnloadConfirms = true; + close (); + acceptAllBeforeUnloadConfirms = false; + } + OS.RemoveEventHandler(windowBoundsHandler); windowBoundsHandler = 0; @@ -441,11 +448,11 @@ StringBuffer buffer = new StringBuffer ("function "); // $NON-NLS-1$ buffer.append (functionName); buffer.append ("(win) {\n"); // $NON-NLS-1$ - buffer.append ("var fn = win.onbeforeunload; if (fn != null) {var str = null; try {str = fn();} catch (e) {}"); // $NON-NLS-1$ - buffer.append ("if (str != null) {var result = window.external.callRunBeforeUnloadConfirmPanelWithMessage(str);if (!result) return false;}}"); // $NON-NLS-1$ - buffer.append ("for (var i = 0; i < win.frames.length; i++) {var result = "); // $NON-NLS-1$ + buffer.append ("var fn = win.onbeforeunload; if (fn != null) {try {var str = fn(); if (str != null) { "); // $NON-NLS-1$ + buffer.append ("var result = window.external.callRunBeforeUnloadConfirmPanelWithMessage(str); if (!result) return false;}} catch (e) {}} "); // $NON-NLS-1$ + buffer.append ("try {for (var i = 0; i < win.frames.length; i++) {var result = "); // $NON-NLS-1$ buffer.append (functionName); - buffer.append ("(win.frames[i]); if (!result) return false;} return true;"); // $NON-NLS-1$ + buffer.append ("(win.frames[i]); if (!result) return false;}} catch (e) {} return true;"); // $NON-NLS-1$ buffer.append ("\n};"); // $NON-NLS-1$ execute (buffer.toString ()); @@ -1490,7 +1497,12 @@ } int callRunBeforeUnloadConfirmPanelWithMessage(int /*long*/ messageID, int /*long*/ arg) { - int result = runBeforeUnloadConfirmPanelWithMessage (messageID, 0); + int result; + if (acceptAllBeforeUnloadConfirms) { + result = 1; + } else { + result = runBeforeUnloadConfirmPanelWithMessage (messageID, 0); + } return Cocoa.objc_msgSend (Cocoa.C_NSNumber, Cocoa.S_numberWithBool, result); } Index: Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java,v retrieving revision 1.27 diff -u -r1.27 WebBrowser.java --- Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java 10 Sep 2009 19:51:25 -0000 1.27 +++ Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java 11 Sep 2009 21:06:57 -0000 @@ -27,7 +27,7 @@ TitleListener[] titleListeners = new TitleListener[0]; VisibilityWindowListener[] visibilityWindowListeners = new VisibilityWindowListener[0]; boolean jsEnabled = true; - boolean jsEnabledChanged; + boolean jsEnabledChanged, isClosing; int nextFunctionIndex = 1; Object evaluateResult; Index: Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java,v retrieving revision 1.44 diff -u -r1.44 Browser.java --- Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java 10 Sep 2009 19:51:24 -0000 1.44 +++ Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java 11 Sep 2009 21:06:57 -0000 @@ -509,7 +509,9 @@ public boolean close () { checkWidget(); if (webBrowser.close ()) { + webBrowser.isClosing = true; dispose (); + webBrowser.isClosing = false; return true; } return false; Index: Eclipse SWT Browser/cocoa/org/eclipse/swt/browser/Safari.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Browser/cocoa/org/eclipse/swt/browser/Safari.java,v retrieving revision 1.64 diff -u -r1.64 Safari.java --- Eclipse SWT Browser/cocoa/org/eclipse/swt/browser/Safari.java 10 Sep 2009 19:51:27 -0000 1.64 +++ Eclipse SWT Browser/cocoa/org/eclipse/swt/browser/Safari.java 11 Sep 2009 21:06:57 -0000 @@ -31,7 +31,7 @@ String url = ""; //$NON-NLS-1$ Point location; Point size; - boolean statusBar = true, toolBar = true, ignoreDispose; + boolean statusBar = true, toolBar = true, ignoreDispose, acceptAllBeforeUnloadConfirms; int lastMouseMoveX, lastMouseMoveY; //TEMPORARY CODE // boolean doit; @@ -217,6 +217,13 @@ browser.notifyListeners (e.type, e); e.type = SWT.NONE; + /* invoke onbeforeunload handler(s) */ + if (!isClosing) { + acceptAllBeforeUnloadConfirms = true; + close (); + acceptAllBeforeUnloadConfirms = false; + } + e.display.setData(ADD_WIDGET_KEY, new Object[] {delegate, null}); Safari.this.webView.setFrameLoadDelegate(null); @@ -415,11 +422,11 @@ StringBuffer buffer = new StringBuffer ("function "); // $NON-NLS-1$ buffer.append (functionName); buffer.append ("(win) {\n"); // $NON-NLS-1$ - buffer.append ("var fn = win.onbeforeunload; if (fn != null) {var str = null; try {str = fn();} catch (e) {}"); // $NON-NLS-1$ - buffer.append ("if (str != null) {var result = window.external.callRunBeforeUnloadConfirmPanelWithMessage(str);if (!result) return false;}}"); // $NON-NLS-1$ - buffer.append ("for (var i = 0; i < win.frames.length; i++) {var result = "); // $NON-NLS-1$ + buffer.append ("var fn = win.onbeforeunload; if (fn != null) {try {var str = fn(); if (str != null) { "); // $NON-NLS-1$ + buffer.append ("var result = window.external.callRunBeforeUnloadConfirmPanelWithMessage(str); if (!result) return false;}} catch (e) {}} "); // $NON-NLS-1$ + buffer.append ("try {for (var i = 0; i < win.frames.length; i++) {var result = "); // $NON-NLS-1$ buffer.append (functionName); - buffer.append ("(win.frames[i]); if (!result) return false;} return true;"); // $NON-NLS-1$ + buffer.append ("(win.frames[i]); if (!result) return false;}} catch (e) {} return true;"); // $NON-NLS-1$ buffer.append ("\n};"); // $NON-NLS-1$ execute (buffer.toString ()); @@ -1067,7 +1074,12 @@ } NSNumber callRunBeforeUnloadConfirmPanelWithMessage(int /*long*/ messageID, int /*long*/ arg) { - boolean result = webView_runBeforeUnloadConfirmPanelWithMessage_initiatedByFrame (0, messageID, 0); + boolean result; + if (acceptAllBeforeUnloadConfirms) { + result = true; + } else { + result = webView_runBeforeUnloadConfirmPanelWithMessage_initiatedByFrame (0, messageID, 0); + } return NSNumber.numberWithBool (result); }