From 7bb66a6538518786792450d4ce2603c05122700b Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Thu, 24 Jun 2004 16:23:42 +0000 Subject: [PATCH] Ok after this checkin we now have all the functionality of Sun's JDIC WebBrowser , with the following exceptions: - we're based on mozilla 1.6 - it only works on windows - we don't have mouse event support - we only support mozilla, not IE So, webclient still has a ways to go until we reach its former glory. However, I'm going to get together a 2.0 alpha release, including build instructions, from what we have now. I'd love it if someone could get the unit tests working on GNU/Linux again. I think the problem has to do with our old friend GDKSUPERWIN. M webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java M webclient/src_moz/NavigationImpl.cpp - re-enable POST M webclient/src_moz/EmbedWindow.cpp M webclient/src_moz/EmbedWindow.h - expose DocShell post method. M webclient/test/automated/src/classes/org/mozilla/util/THTTPD.java M webclient/test/automated/src/classes/org/mozilla/webclient/NavigationTest.java - test code for POST --- .../impl/wrapper_native/NavigationImpl.java | 52 +++++++++------ java/webclient/src_moz/EmbedWindow.cpp | 63 ++++++++++++++++++- java/webclient/src_moz/EmbedWindow.h | 9 +++ java/webclient/src_moz/NavigationImpl.cpp | 36 ++++------- .../src/classes/org/mozilla/util/THTTPD.java | 50 ++++++++++++--- .../org/mozilla/webclient/NavigationTest.java | 63 ++++++++++++++++++- 6 files changed, 221 insertions(+), 52 deletions(-) diff --git a/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java b/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java index 74ef4212c243..0196762609d0 100644 --- a/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java +++ b/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java @@ -166,17 +166,21 @@ public void setPrompt(Prompt yourPrompt) // Methods from Navigation2 // -public void post(String absoluteUrl, - String target, - String postData, - String postHeaders) +public void post(String argUrl, + String argTarget, + String argPostData, + String argPostHeaders) { - ParameterCheck.nonNull(absoluteUrl); + ParameterCheck.nonNull(argUrl); getWrapperFactory().verifyInitialized(); Assert.assert_it(-1 != getNativeBrowserControl()); - int postDataLength = 0; - int postHeadersLength = 0; + final String url = new String(argUrl); + final String target = argTarget; + final String postData = argPostData; + final String postHeaders = argPostHeaders; + final int postDataLength; + final int postHeadersLength; // PENDING(edburns): make it so the url doesn't have to be absolute. @@ -184,22 +188,30 @@ public void post(String absoluteUrl, // "\r\n" as specified in Navigation.java if (postData != null){ - postDataLength = postData.length(); + postDataLength = postData.length(); } - + else { + postDataLength = 0; + } + if (postHeaders != null){ - postHeadersLength = postHeaders.length(); + postHeadersLength = postHeaders.length(); + } + else { + postHeadersLength = 0; } - synchronized(getBrowserControl()) { - nativePost(getNativeBrowserControl(), - absoluteUrl, - target, - postDataLength, - postData, - postHeadersLength, - postHeaders); - } + NativeEventThread.instance.pushRunnable(new Runnable() { + public void run() { + nativePost(NavigationImpl.this.getNativeBrowserControl(), + url, + target, + postDataLength, + postData, + postHeadersLength, + postHeaders); + } + }); } // @@ -241,7 +253,7 @@ public static void main(String [] args) Log.setApplicationName("NavigationImpl"); Log.setApplicationVersion("0.0"); - Log.setApplicationVersionDate("$Id: NavigationImpl.java,v 1.10 2004/06/23 17:08:14 edburns%acm.org Exp $"); + Log.setApplicationVersionDate("$Id: NavigationImpl.java,v 1.11 2004/06/24 16:23:42 edburns%acm.org Exp $"); try { org.mozilla.webclient.BrowserControlFactory.setAppData(args[0]); diff --git a/java/webclient/src_moz/EmbedWindow.cpp b/java/webclient/src_moz/EmbedWindow.cpp index 4f5f78a590cc..1579be32e61f 100644 --- a/java/webclient/src_moz/EmbedWindow.cpp +++ b/java/webclient/src_moz/EmbedWindow.cpp @@ -43,7 +43,7 @@ #include "nsIInputStream.h" #include "nsIURI.h" #include "nsIDocShellLoadInfo.h" - +#include "nsNetUtil.h" // for NS_NewPostDataStream #include "NativeBrowserControl.h" #include "EmbedWindow.h" @@ -284,6 +284,67 @@ EmbedWindow::LoadStream(nsIInputStream *aStream, nsIURI * aURI, aLoadInfo); } +nsresult +EmbedWindow::Post(nsIURI *absoluteURL, + const PRUnichar *target, + PRInt32 targetLength, + PRInt32 postDataLength, + const char *postData, + PRInt32 postHeadersLength, + const char *postHeaders) +{ + nsresult rv = NS_ERROR_FAILURE; + + nsCOMPtr docShell = do_GetInterface(mWebBrowser); + nsCOMPtr docShellLoadInfo = nsnull; + if (!docShell) { + return rv; + } + + rv = docShell->CreateLoadInfo(getter_AddRefs(docShellLoadInfo)); + + if (NS_FAILED(rv)) { + return rv; + } + + docShellLoadInfo->SetReferrer(absoluteURL); + docShellLoadInfo->SetLoadType(nsIDocShellLoadInfo::loadNormalReplace); + docShellLoadInfo->SetInheritOwner(PR_TRUE); + docShellLoadInfo->SetTarget(target); + + // create the streams + nsCOMPtr postDataStream = nsnull; + nsCOMPtr headersDataStream = nsnull; + nsCOMPtr inputStream = nsnull; + + if (postData) { + nsCAutoString postDataStr(postData); + NS_NewPostDataStream(getter_AddRefs(postDataStream), + PR_FALSE, + postDataStr, 0); + } + + if (postHeaders) { + NS_NewByteInputStream(getter_AddRefs(inputStream), + postHeaders, postHeadersLength); + if (inputStream) { + headersDataStream = do_QueryInterface(inputStream, &rv); + } + + if (NS_FAILED(rv)) { + return rv; + } + } + + docShellLoadInfo->SetPostDataStream(postDataStream); + docShellLoadInfo->SetHeadersStream(headersDataStream); + + rv = docShell->LoadURI(absoluteURL, docShellLoadInfo, + nsIWebNavigation::LOAD_FLAGS_NONE, PR_TRUE); + + return rv; +} + nsresult EmbedWindow::AddWebBrowserListener(nsIWeakReference *aListener, const nsIID & aIID) diff --git a/java/webclient/src_moz/EmbedWindow.h b/java/webclient/src_moz/EmbedWindow.h index fb719dcec987..7ad8ea127d84 100644 --- a/java/webclient/src_moz/EmbedWindow.h +++ b/java/webclient/src_moz/EmbedWindow.h @@ -73,6 +73,15 @@ public: const nsACString &aContentCharset, nsIDocShellLoadInfo * aLoadInfo); + nsresult Post (nsIURI *absoluteURL, + const PRUnichar *target, + PRInt32 targetLength, + PRInt32 postDataLength, + const char *postData, + PRInt32 postHeadersLength, + const char *postHeaders); + + nsresult AddWebBrowserListener(nsIWeakReference *aListener, const nsIID & aIID); diff --git a/java/webclient/src_moz/NavigationImpl.cpp b/java/webclient/src_moz/NavigationImpl.cpp index 16589ab09e73..7c337d806f08 100644 --- a/java/webclient/src_moz/NavigationImpl.cpp +++ b/java/webclient/src_moz/NavigationImpl.cpp @@ -39,6 +39,7 @@ #include "NativeBrowserControl.h" #include "NavigationActionEvents.h" +#include "EmbedWindow.h" #include "ns_util.h" JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_NavigationImpl_nativeLoadURL @@ -150,10 +151,6 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio // wsLoadFromStreamEvent destructor. } - /********************** - - - JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_NavigationImpl_nativePost (JNIEnv *env, jobject obj, jint nativeBCPtr, jstring absoluteURL, jstring target, jint postDataLength, jstring postData, jint postHeadersLength, jstring postHeaders) @@ -166,30 +163,30 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio const char *postDataChars = nsnull; const char *postHeadersChars = nsnull; char *headersAndData = nsnull; - wsPostEvent *actionEvent = nsnull; nsresult rv = NS_OK; nsCOMPtr ioService = do_GetService(NS_IOSERVICE_CONTRACTID, &rv); nsCOMPtr uri; - NS_ConvertUCS2toUTF8 uriACString(urlChars); if (!ioService || NS_FAILED(rv)) { return; } - if (nativeBrowserControl == nsnull || !nativeBrowserControl->initComplete) { + if (nativeBrowserControl == nsnull) { ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed to nativePost"); return; } urlChars = (PRUnichar *) ::util_GetStringChars(env, absoluteURL); urlLen = (PRInt32) ::util_GetStringLength(env, absoluteURL); + NS_ConvertUCS2toUTF8 uriACString(urlChars); if (::util_ExceptionOccurred(env)) { ::util_ThrowExceptionToJava(env, "nativePost Exception: unable to extract Java string"); goto NPFS_CLEANUP; } + if (target){ targetChars = (PRUnichar *) ::util_GetStringChars(env, target); targetLen = (PRInt32) ::util_GetStringLength(env, target); @@ -242,23 +239,17 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio goto NPFS_CLEANUP; } - - if (!(actionEvent = new wsPostEvent(nativeBrowserControl, - uri, - targetChars, - targetLen, - (PRInt32) postDataLength, - headersAndData ? headersAndData : postDataChars, - (PRInt32) postHeadersLength, - postHeadersChars))) { - - ::util_ThrowExceptionToJava(env, "Exception: nativePost: can't create wsPostEvent"); - goto NPFS_CLEANUP; - } - - ::util_PostSynchronousEvent(nativeBrowserControl, (PLEvent *) *actionEvent); + + rv = nativeBrowserControl->mWindow->Post(uri, + targetChars, + targetLen, + (PRInt32) postDataLength, + headersAndData ? headersAndData : postDataChars, + (PRInt32) postHeadersLength, + postHeadersChars); NPFS_CLEANUP: + if (urlChars != nsnull) ::util_ReleaseStringChars(env, absoluteURL, (const jchar *) urlChars); if (targetChars != nsnull) @@ -271,7 +262,6 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio delete [] headersAndData; return; } -*********************/ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_NavigationImpl_nativeRefresh (JNIEnv *env, jobject obj, jint nativeBCPtr, jlong loadFlags) diff --git a/java/webclient/test/automated/src/classes/org/mozilla/util/THTTPD.java b/java/webclient/test/automated/src/classes/org/mozilla/util/THTTPD.java index 810677eb22f9..451e9a1ca37b 100644 --- a/java/webclient/test/automated/src/classes/org/mozilla/util/THTTPD.java +++ b/java/webclient/test/automated/src/classes/org/mozilla/util/THTTPD.java @@ -1,5 +1,5 @@ /* - * $Id: THTTPD.java,v 1.3 2004/06/23 19:21:06 edburns%acm.org Exp $ + * $Id: THTTPD.java,v 1.4 2004/06/24 16:23:42 edburns%acm.org Exp $ */ /* @@ -31,6 +31,7 @@ import java.net.ServerSocket; import java.net.Socket; import java.io.FileInputStream; import java.io.InputStreamReader; +import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -51,7 +52,9 @@ public class THTTPD extends Object { protected int count = 0; public final static int REQUEST_GET = 2; - public final static int REQUEST_POST = 2; + public final static int REQUEST_POST = 3; + + protected StringBuffer requestData = null; public ServerThread(String name, File root, int maxRequests) { @@ -59,6 +62,17 @@ public class THTTPD extends Object { this.root = root; this.maxRequests = maxRequests; keepRunning = true; + requestData = new StringBuffer(); + } + + public String getRequestData() { + String result = null; + if (null != requestData) { + synchronized (requestData) { + result = requestData.toString(); + } + } + return result; } protected int soTimeout = -1; @@ -81,13 +95,15 @@ public class THTTPD extends Object { BufferedReader responseReader = null, requestReader = null; + InputStream socketInputStream = null; BufferedWriter responseWriter = null; String requestLine = null, curLine = null; File responseFile = null; - StringBuffer responseString = null; + StringBuffer + responseString = null; V(); @@ -104,16 +120,30 @@ public class THTTPD extends Object { serverSocket.setSoTimeout(getSoTimeout()); } socket = serverSocket.accept(); - requestReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + requestReader = new BufferedReader(new InputStreamReader(socketInputStream = socket.getInputStream())); requestLine = requestReader.readLine(); - while (null != (curLine = requestReader.readLine())) { - if (curLine.trim().length() == 0) { - break; + synchronized (requestData) { + requestData.delete(0, requestData.length()); + requestData.append(requestLine); + while (null != (curLine = requestReader.readLine())) { + requestData.append(curLine); + if (curLine.trim().length() == 0) { + break; + } } } switch (getRequestMethod(requestLine)) { + case REQUEST_POST: + while (null != (curLine = requestReader.readLine())) { + requestData.append(curLine); + if (socketInputStream.available() <= 0 || + curLine.trim().length() == 0) { + break; + } + } + // intentional fall through! case REQUEST_GET: responseWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); if (null != @@ -154,6 +184,12 @@ public class THTTPD extends Object { protected int getRequestMethod(String requestLine) { int result = REQUEST_GET; + if (0 == requestLine.indexOf("GET")) { + result = REQUEST_GET; + } + else if (0 == requestLine.indexOf("POST")) { + result = REQUEST_POST; + } return result; } diff --git a/java/webclient/test/automated/src/classes/org/mozilla/webclient/NavigationTest.java b/java/webclient/test/automated/src/classes/org/mozilla/webclient/NavigationTest.java index e86bb4d97c2e..5135db99d929 100644 --- a/java/webclient/test/automated/src/classes/org/mozilla/webclient/NavigationTest.java +++ b/java/webclient/test/automated/src/classes/org/mozilla/webclient/NavigationTest.java @@ -1,5 +1,5 @@ /* - * $Id: NavigationTest.java,v 1.17 2004/06/23 19:21:06 edburns%acm.org Exp $ + * $Id: NavigationTest.java,v 1.18 2004/06/24 16:23:42 edburns%acm.org Exp $ */ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- @@ -389,4 +389,65 @@ public class NavigationTest extends WebclientTestCase { BrowserControlFactory.deleteBrowserControl(firstBrowserControl); } + public void testHttpPost() throws Exception { + BrowserControl firstBrowserControl = null; + DocumentLoadListenerImpl listener = null; + Selection selection = null; + firstBrowserControl = BrowserControlFactory.newBrowserControl(); + assertNotNull(firstBrowserControl); + BrowserControlCanvas canvas = (BrowserControlCanvas) + firstBrowserControl.queryInterface(BrowserControl.BROWSER_CONTROL_CANVAS_NAME); + eventRegistration = (EventRegistration2) + firstBrowserControl.queryInterface(BrowserControl.EVENT_REGISTRATION_NAME); + + assertNotNull(canvas); + Frame frame = new Frame(); + frame.setUndecorated(true); + frame.setBounds(0, 0, 640, 480); + frame.add(canvas, BorderLayout.CENTER); + frame.setVisible(true); + canvas.setVisible(true); + + Navigation2 nav = (Navigation2) + firstBrowserControl.queryInterface(BrowserControl.NAVIGATION_NAME); + assertNotNull(nav); + final CurrentPage2 currentPage = (CurrentPage2) + firstBrowserControl.queryInterface(BrowserControl.CURRENT_PAGE_NAME); + + assertNotNull(currentPage); + + // + // try loading a file over HTTP + // + + NavigationTest.keepWaiting = true; + + + eventRegistration.addDocumentLoadListener(listener = new DocumentLoadListenerImpl() { + public void doEndCheck() { + currentPage.selectAll(); + Selection selection = currentPage.getSelection(); + NavigationTest.keepWaiting = false; + assertTrue(-1 != selection.toString().indexOf("This file was downloaded over HTTP.")); + System.out.println("Selection is: " + + selection.toString()); + } + }); + + String url = "http://localhost:5243/HttpNavigationTest.txt"; + + Thread.currentThread().sleep(3000); + + nav.post(url, null, "PostData\r\n", "X-WakaWaka: true\r\n\r\n"); + + // keep waiting until the previous load completes + while (NavigationTest.keepWaiting) { + Thread.currentThread().sleep(1000); + } + eventRegistration.removeDocumentLoadListener(listener); + + frame.setVisible(false); + BrowserControlFactory.deleteBrowserControl(firstBrowserControl); + } + }