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;