backport ability to specify no-cache to 3.4.2
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java
index 464e2dc..ed95263 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/carbon/org/eclipse/swt/browser/Safari.java
@@ -339,6 +339,13 @@
 	return 0;
 }
 
+static int createNSString(String string) {
+	int length = string.length ();
+	char[] buffer = new char[length];
+	string.getChars (0, length, buffer, 0);
+	return OS.CFStringCreateWithCharacters (0, buffer, length);
+}
+
 public boolean back() {
 	html = null;
 	return Cocoa.objc_msgSend(webView, Cocoa.S_goBack) != 0;
@@ -676,7 +683,7 @@
 	OS.CFRelease(string);
 }
 
-public boolean setUrl(String url) {
+public boolean setUrl(String url, String postData, String[] headers) {
 	html = null;
 
 	if (url.indexOf('/') == 0) {
@@ -702,16 +709,39 @@
 	}
 	if (inURL == 0) return false;
 
-	//request = [NSURLRequest requestWithURL:(NSURL*)inURL];
-	int request = Cocoa.objc_msgSend(Cocoa.C_NSURLRequest, Cocoa.S_requestWithURL, inURL);
+	int request = Cocoa.objc_msgSend(Cocoa.C_NSMutableURLRequest, Cocoa.S_requestWithURL, inURL);
 	OS.CFRelease(inURL);
 
-	//mainFrame = [webView mainFrame];
+//	if (postData != null) {
+//		int post = createNSString(POST);
+//		Cocoa.objc_msgSend(request, Cocoa.S_setHTTPMethod, post);
+//		OS.CFRelease (post);
+//		byte[] bytes = postData.getBytes();
+//		int data = Cocoa.objc_msgSend(Cocoa.C_NSData, Cocoa.S_dataWithBytes, bytes, bytes.length);
+//		Cocoa.objc_msgSend(request, Cocoa.S_setHTTPBody, data);
+//	}
+	if (headers != null) {
+		for (int i = 0; i < headers.length; i++) {
+			String current = headers[i];
+			if (current != null) {
+				int index = current.indexOf(':');
+				if (index != -1) {
+					String key = current.substring(0, index).trim();
+					String value = current.substring(index + 1).trim();
+					if (key.length() > 0 && value.length() > 0) {
+						int keyString = createNSString(key);
+						int valueString = createNSString(value);
+						Cocoa.objc_msgSend(request, Cocoa.S_setValueForHTTPHeaderField, valueString, keyString);
+						OS.CFRelease (valueString);
+						OS.CFRelease (keyString);
+					}
+				}
+			}
+		}
+	}
+
 	int mainFrame = Cocoa.objc_msgSend(webView, Cocoa.S_mainFrame);
-
-	//[mainFrame loadRequest:request];
 	Cocoa.objc_msgSend(mainFrame, Cocoa.S_loadRequest, request);
-
 	return true;
 }
 
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java
index 2624d41..3b346ba 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/Browser.java
@@ -760,7 +760,12 @@
 public boolean setUrl (String url) {
 	checkWidget();
 	if (url == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
-	return webBrowser.setUrl (url);
+	String[] headers = null;
+	String value = System.getProperty ("org.eclipse.swt.browser.Browser");
+	if (value != null && value.equals ("no-cache")) {
+		headers = new String[] {"Cache-Control: no-cache"};
+	}
+	return webBrowser.setUrl (url, null, headers);
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java
index 6a621d5..6b6b500 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/common/org/eclipse/swt/browser/WebBrowser.java
@@ -388,7 +388,7 @@
 
 public abstract boolean setText (String html);
 
-public abstract boolean setUrl (String url);
+public abstract boolean setUrl (String url, String postData, String[] headers);
 
 public abstract void stop ();
 
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/forms/org/eclipse/swt/browser/IE.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/forms/org/eclipse/swt/browser/IE.java
index 68baf5d..b4851ab 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/forms/org/eclipse/swt/browser/IE.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/forms/org/eclipse/swt/browser/IE.java
@@ -256,7 +256,7 @@
 	return true;
 }
 
-public boolean setUrl(String url) {
+public boolean setUrl(String url, String postData, String headers[]) {
 	int state = OS.WebBrowser_ReadyState(webBrowser);
 	if (!(state == OS.WebBrowserReadyState_Uninitialized || state == OS.WebBrowserReadyState_Complete)) {
 		OS.WebBrowser_Stop(webBrowser);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/photon/org/eclipse/swt/browser/Voyager.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/photon/org/eclipse/swt/browser/Voyager.java
index 159ea8b..944f1a9 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/photon/org/eclipse/swt/browser/Voyager.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/photon/org/eclipse/swt/browser/Voyager.java
@@ -450,7 +450,7 @@
 	return true;
 }
 
-public boolean setUrl(String url) {
+public boolean setUrl(String url, String postData, String headers[]) {
 	byte[] buffer = Converter.wcsToMbcs(null, url, true);
 	int ptr = OS.malloc(buffer.length);
 	OS.memmove(ptr, buffer, buffer.length);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java
index d410aa2..41c8575 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java
@@ -865,7 +865,7 @@
 	return result;
 }
 
-public boolean setUrl(String url) {
+public boolean setUrl(String url, String postData, String headers[]) {
 	html = null;
 
 	/*
@@ -904,14 +904,46 @@
 		auto.invoke(rgdispid[0]);
 	}
 
-	int[] rgdispid = auto.getIDsOfNames(new String[] { "Navigate", "URL" }); //$NON-NLS-1$ //$NON-NLS-2$
 	navigate = true;
-	Variant[] rgvarg = new Variant[1];
-	rgvarg[0] = new Variant(url);
-	int[] rgdispidNamedArgs = new int[1];
-	rgdispidNamedArgs[0] = rgdispid[1];
+	int count = 1;
+	if (postData != null) count++;
+	if (headers != null) count++;
+	Variant[] rgvarg = new Variant[count];
+	int[] rgdispidNamedArgs = new int[count];
+	int[] rgdispid = auto.getIDsOfNames(new String[] { "Navigate", "URL", "PostData", "Headers" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+	int index = 0;
+	rgvarg[index] = new Variant(url);
+	rgdispidNamedArgs[index++] = rgdispid[1];
+	/* POST data is never received */
+//	if (postData != null) {
+//		rgvarg[index] = createSafeArray(postData);
+//		rgdispidNamedArgs[index++] = rgdispid[2];
+//	}
+	if (headers != null) {
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < headers.length; i++) {
+			String current = headers[i];
+			if (current != null) {
+				int sep = current.indexOf(':');
+				if (sep != -1) {
+					String key = current.substring(0, sep).trim();
+					String value = current.substring(sep + 1).trim();
+					if (key.length() > 0 && value.length() > 0) {
+						buffer.append(key);
+						buffer.append(':');
+						buffer.append(value);
+						buffer.append("\r\n");
+					}
+				}
+			}
+		}
+		rgvarg[index] = new Variant(buffer.toString());
+		rgdispidNamedArgs[index++] = rgdispid[3];
+	}
 	Variant pVarResult = auto.invoke(rgdispid[0], rgvarg, rgdispidNamedArgs);
-	rgvarg[0].dispose();
+	for (int i = 0; i < count; i++) {
+		rgvarg[i].dispose();
+	}
 	if (pVarResult == null) return false;
 	boolean result = pVarResult.getType() == OLE.VT_EMPTY;
 	pVarResult.dispose();
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/wpf/org/eclipse/swt/browser/IE.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/wpf/org/eclipse/swt/browser/IE.java
index f591f62..e69547a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Browser/wpf/org/eclipse/swt/browser/IE.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/wpf/org/eclipse/swt/browser/IE.java
@@ -197,7 +197,7 @@
 //	return result;
 }
 
-public boolean setUrl(String url) {
+public boolean setUrl(String url, String postData, String headers[]) {
 	if (url.indexOf(':') == -1) url = "http://" + url;
 	int length = url.length ();
 	char [] buffer = new char [length + 1];
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/InputStream.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/InputStream.java
index 3440fbb..3a5e3ad 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/InputStream.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/InputStream.java
@@ -108,7 +108,10 @@
 }
 
 int ReadSegments (int /*long*/ aWriter, int /*long*/ aClosure, int aCount, int /*long*/ _retval) {
-	int max = Math.min (aCount, buffer == null ? 0 : buffer.length - index);
+	int max = buffer == null ? 0 : buffer.length - index;
+	if (aCount != -1) {
+		max = Math.min (max, aCount);
+	}
 	int cnt = max;
 	while (cnt > 0) {
 		int[] aWriteCount = new int[1];
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
index 651a1a5..5de828a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
@@ -2191,7 +2191,7 @@
 	return true;
 }
 
-public boolean setUrl (String url) {
+public boolean setUrl (String url, String postData, String[] headers) {
 	htmlBytes = null;
 
 	int /*long*/[] result = new int /*long*/[1];
@@ -2207,9 +2207,70 @@
 	delegate.removeWindowSubclass ();
 
 	nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+	result[0] = 0;
     char[] uri = new char[url.length () + 1];
     url.getChars (0, url.length (), uri, 0);
-	rc = webNavigation.LoadURI (uri, nsIWebNavigation.LOAD_FLAGS_NONE, 0, 0, 0);
+//    nsIMIMEInputStream postDataStream = null;
+    InputStream dataStream = null;
+//	if (postData != null) {
+//    	rc = XPCOM.NS_GetComponentManager (result);
+//    	if (rc != XPCOM.NS_OK) error (rc);
+//    	if (result[0] == 0) error (XPCOM.NS_NOINTERFACE);
+//    	nsIComponentManager componentManager = new nsIComponentManager (result[0]);
+//    	result[0] = 0;
+//    	byte[] contractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MIMEINPUTSTREAM_CONTRACTID, true);
+//    	rc = componentManager.CreateInstanceByContractID (contractID, 0, nsIMIMEInputStream.NS_IMIMEINPUTSTREAM_IID, result);
+//    	componentManager.Release();
+//
+//    	if (rc == XPCOM.NS_OK && result[0] != 0) { /* nsIMIMEInputStream is not in mozilla 1.4 */
+//    		byte[] bytes = MozillaDelegate.wcsToMbcs (null, postData, false);
+//    		dataStream = new InputStream (bytes);
+//    		dataStream.AddRef ();
+//    		postDataStream = new nsIMIMEInputStream (result[0]);
+//    		rc = postDataStream.SetData (dataStream.getAddress ());
+//    		if (rc != XPCOM.NS_OK) error (rc);
+//    		rc = postDataStream.SetAddContentLength (1);
+//    		if (rc != XPCOM.NS_OK) error (rc);
+//    		byte[] name = MozillaDelegate.wcsToMbcs (null, HEADER_CONTENTTYPE, true);
+//    		byte[] value = MozillaDelegate.wcsToMbcs (null, MIMETYPE_FORMURLENCODED, true);
+//    		rc = postDataStream.AddHeader (name, value);
+//    		if (rc != XPCOM.NS_OK) error (rc);
+//    	}
+//    	result[0] = 0;
+//	}
+
+    InputStream headersStream = null;
+    if (headers != null) {
+		StringBuffer buffer = new StringBuffer ();
+		for (int i = 0; i < headers.length; i++) {
+			String current = headers[i];
+			if (current != null) {
+				int sep = current.indexOf (':');
+				if (sep != -1) {
+					String key = current.substring (0, sep).trim ();
+					String value = current.substring (sep + 1).trim ();
+					if (key.length () > 0 && value.length () > 0) {
+						buffer.append (key);
+						buffer.append (':');
+						buffer.append (value);
+						buffer.append ("\r\n");
+					}
+				}
+			}
+		}
+    	byte[] bytes = MozillaDelegate.wcsToMbcs (null, buffer.toString (), true);
+    	headersStream = new InputStream (bytes);
+    	headersStream.AddRef ();
+    }
+
+	rc = webNavigation.LoadURI (
+		uri,
+		nsIWebNavigation.LOAD_FLAGS_NONE,
+		0,
+		0,
+		headersStream == null ? 0 : headersStream.getAddress ());
+	if (dataStream != null) dataStream.Release ();
+	if (headersStream != null) headersStream.Release ();
 	webNavigation.Release ();
 	return rc == XPCOM.NS_OK;
 }
@@ -3254,7 +3315,7 @@
 	if (value.indexOf ("aboutCertError.xhtml") != -1 || (isViewingErrorPage && value.indexOf ("javascript:showSecuritySection") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$
 		XPCOM.memmove (retval, new int[] {1}, 4); /* PRBool */
 		isRetrievingBadCert = true;
-		setUrl (lastNavigateURL);
+		setUrl (lastNavigateURL, null, null);
 		return XPCOM.NS_OK;
 	}
 	isViewingErrorPage = value.indexOf ("netError.xhtml") != -1; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/cocoa/Cocoa.java b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/cocoa/Cocoa.java
index 202f3b2..95a3d05 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/cocoa/Cocoa.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/cocoa/Cocoa.java
@@ -25,6 +25,7 @@
 public static final int C_NSNumber = Cocoa.objc_getClass("NSNumber"); //$NON-NLS-1$
 public static final int C_NSURL = Cocoa.objc_getClass("NSURL"); //$NON-NLS-1$
 public static final int C_NSURLRequest = Cocoa.objc_getClass("NSURLRequest"); //$NON-NLS-1$
+public static final int C_NSMutableURLRequest = Cocoa.objc_getClass("NSMutableURLRequest"); //$NON-NLS-1$
 public static final int C_WebKitDelegate = Cocoa.objc_getClass("WebKitDelegate"); //$NON-NLS-1$
 public static final int C_WebDownload = Cocoa.objc_getClass("WebDownload"); //$NON-NLS-1$
 public static final int C_WebView = Cocoa.objc_getClass("WebView"); //$NON-NLS-1$
@@ -168,6 +169,7 @@
 public static final int S_shiftKey = Cocoa.sel_registerName("shiftKey"); //$NON-NLS-1$
 public static final int S_type = Cocoa.sel_registerName("type"); //$NON-NLS-1$
 public static final int S_wheelDelta = Cocoa.sel_registerName("wheelDelta"); //$NON-NLS-1$
+public static final int S_setValueForHTTPHeaderField = Cocoa.sel_registerName("setValue:forHTTPHeaderField:"); //$NON-NLS-1$
 
 public static final int NSAlphaFirstBitmapFormat = 1 << 0;
 public static final int NSAlphaNonpremultipliedBitmapFormat = 1 << 1;