From 7c1f545442f65f1f05264331a34d27d0ce38c3cc Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Wed, 28 Apr 2004 14:39:54 +0000 Subject: [PATCH] This Change-bundle verifies that loadURL works as expected. Next will be to verify that loadFromStream works as expected. M build-tests.xml - win32 gtk stuff. I can't figure out why this file in particular gets messed up when I move from Unix to Windows and back. Can anyone tell me why? M classes_spec/org/mozilla/webclient/Navigation2.java M classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java - added method loadURLBlocking(). M classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java M src_moz/CurrentPageImpl.cpp - activated selectAll() and getSelection() M src_moz/EmbedWindow.cpp M src_moz/EmbedWindow.h - imbued this class with selection related methods selectAll and getSelection() M src_moz/Makefile.in - activated CurrentPageImpl.cpp M test/automated/src/classes/org/mozilla/webclient/NavigationTest.java - new test content. --- java/webclient/build-tests.xml | 156 +--------- .../org/mozilla/webclient/Navigation2.java | 2 + .../impl/wrapper_native/CurrentPageImpl.java | 34 ++- .../impl/wrapper_native/NavigationImpl.java | 89 ++++-- java/webclient/src_moz/CurrentPageImpl.cpp | 179 ++++++------ java/webclient/src_moz/EmbedWindow.cpp | 158 +++++++++++ java/webclient/src_moz/EmbedWindow.h | 5 + java/webclient/src_moz/Makefile.in | 4 +- java/webclient/src_moz/NavigationImpl.cpp | 12 +- .../org/mozilla/webclient/NavigationTest.java | 21 +- .../webclient/RandomHTMLInputStream.java | 268 ++++++++++++++++++ 11 files changed, 646 insertions(+), 282 deletions(-) create mode 100644 java/webclient/test/automated/src/classes/org/mozilla/webclient/RandomHTMLInputStream.java diff --git a/java/webclient/build-tests.xml b/java/webclient/build-tests.xml index 263da5579bd2..607fe7394f55 100644 --- a/java/webclient/build-tests.xml +++ b/java/webclient/build-tests.xml @@ -1,155 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/java/webclient/classes_spec/org/mozilla/webclient/Navigation2.java b/java/webclient/classes_spec/org/mozilla/webclient/Navigation2.java index b5df4071458a..f8fa80c4fc81 100644 --- a/java/webclient/classes_spec/org/mozilla/webclient/Navigation2.java +++ b/java/webclient/classes_spec/org/mozilla/webclient/Navigation2.java @@ -50,5 +50,7 @@ public void post(String absoluteUrl, String postData, String postHeaders); +public void loadURLBlocking(String absoluteURL); + } // end of interface Navigation2 diff --git a/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java b/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java index e26387ce4f06..4d39f70522d9 100644 --- a/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java +++ b/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java @@ -1,5 +1,4 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * +/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of @@ -101,14 +100,17 @@ public void copyCurrentSelectionToSystemClipboard() } public Selection getSelection() { - Selection selection = new SelectionImpl(); - getWrapperFactory().verifyInitialized(); - Assert.assert_it(-1 != getNativeBrowserControl()); - synchronized(getBrowserControl()) { - nativeGetSelection(getNativeBrowserControl(), selection); - } + final Selection selection = new SelectionImpl(); + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable() { + public Object run() { + nativeGetSelection(CurrentPageImpl.this.getNativeBrowserControl(), + selection); + return null; + } + }); + return selection; } @@ -258,13 +260,15 @@ public void resetFind() } } -public void selectAll() -{ +public void selectAll() { getWrapperFactory().verifyInitialized(); - - synchronized(getBrowserControl()) { - nativeSelectAll(getNativeBrowserControl()); - } + + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable() { + public Object run() { + nativeSelectAll(CurrentPageImpl.this.getNativeBrowserControl()); + return null; + } + }); } public void print() @@ -332,7 +336,7 @@ public static void main(String [] args) Assert.setEnabled(true); Log.setApplicationName("CurrentPageImpl"); Log.setApplicationVersion("0.0"); - Log.setApplicationVersionDate("$Id: CurrentPageImpl.java,v 1.3 2004/04/10 21:50:38 edburns%acm.org Exp $"); + Log.setApplicationVersionDate("$Id: CurrentPageImpl.java,v 1.4 2004/04/28 14:39:54 edburns%acm.org Exp $"); } 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 83e84597c0f0..fb824efa6d75 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 @@ -92,28 +92,77 @@ public void loadURL(String absoluteURL) }); } -public void loadFromStream(InputStream stream, String uri, - String contentType, int contentLength, - Properties loadInfo) -{ - ParameterCheck.nonNull(stream); - ParameterCheck.nonNull(uri); - ParameterCheck.nonNull(contentType); - if (contentLength < -1 || contentLength == 0) { - throw new RangeException("contentLength value " + contentLength + - " is out of range. It is should be either -1 or greater than 0."); + public void loadURLBlocking(String absoluteURL) { + ParameterCheck.nonNull(absoluteURL); + getWrapperFactory().verifyInitialized(); + final int bc = getNativeBrowserControl(); + final String url = new String(absoluteURL); + Assert.assert_it(-1 != bc); + + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable() { + public Object run() { + NavigationImpl.this.nativeLoadURL(bc, url); + return null; + } + }); } - getWrapperFactory().verifyInitialized(); - Assert.assert_it(-1 != getNativeBrowserControl()); + + public void loadFromStream(InputStream stream, String uri, + String contentType, int contentLength, + Properties loadInfo) { + ParameterCheck.nonNull(stream); + ParameterCheck.nonNull(uri); + ParameterCheck.nonNull(contentType); + if (contentLength < -1 || contentLength == 0) { + throw new RangeException("contentLength value " + contentLength + + " is out of range. It is should be either -1 or greater than 0."); + } + + final InputStream finalStream = stream; + final String finalUri = uri; + final String finalContentType = contentType; + final int finalContentLength = contentLength; + final Properties finalLoadInfo = loadInfo; + + NativeEventThread.instance.pushRunnable(new Runnable() { + public void run() { + nativeLoadFromStream(NavigationImpl.this.getNativeBrowserControl(), + finalStream, finalUri, + finalContentType, + finalContentLength, finalLoadInfo); + } + }); + } + + public void loadFromStreamBlocking(InputStream stream, String uri, + String contentType, int contentLength, + Properties loadInfo) { + ParameterCheck.nonNull(stream); + ParameterCheck.nonNull(uri); + ParameterCheck.nonNull(contentType); + if (contentLength < -1 || contentLength == 0) { + throw new RangeException("contentLength value " + contentLength + + " is out of range. It is should be either -1 or greater than 0."); + } + + final InputStream finalStream = stream; + final String finalUri = uri; + final String finalContentType = contentType; + final int finalContentLength = contentLength; + final Properties finalLoadInfo = loadInfo; + + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable() { + public Object run() { + nativeLoadFromStream(NavigationImpl.this.getNativeBrowserControl(), + finalStream, finalUri, + finalContentType, + finalContentLength, finalLoadInfo); + return null; + } + }); + } - synchronized(getBrowserControl()) { - nativeLoadFromStream(getNativeBrowserControl(), stream, - uri, contentType, contentLength, - loadInfo); - } -} - public void refresh(long loadFlags) { ParameterCheck.noLessThan(loadFlags, 0); @@ -226,7 +275,7 @@ public static void main(String [] args) Log.setApplicationName("NavigationImpl"); Log.setApplicationVersion("0.0"); - Log.setApplicationVersionDate("$Id: NavigationImpl.java,v 1.5 2004/04/17 21:25:11 edburns%acm.org Exp $"); + Log.setApplicationVersionDate("$Id: NavigationImpl.java,v 1.6 2004/04/28 14:39:54 edburns%acm.org Exp $"); try { org.mozilla.webclient.BrowserControlFactory.setAppData(args[0]); diff --git a/java/webclient/src_moz/CurrentPageImpl.cpp b/java/webclient/src_moz/CurrentPageImpl.cpp index 4ab1b1c54df2..ca3629d3253e 100644 --- a/java/webclient/src_moz/CurrentPageImpl.cpp +++ b/java/webclient/src_moz/CurrentPageImpl.cpp @@ -32,84 +32,90 @@ #include "org_mozilla_webclient_impl_wrapper_0005fnative_CurrentPageImpl.h" -#include "CurrentPageActionEvents.h" - #include "ns_util.h" #include "rdf_util.h" +#include "NativeBrowserControl.h" +#include "EmbedWindow.h" #include "nsCRT.h" -JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeCopyCurrentSelectionToSystemClipboard -(JNIEnv *env, jobject obj, jint webShellPtr) -{ - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; +#if 0 // convenience - if (initContext->initComplete) { - wsCopySelectionEvent * actionEvent = new wsCopySelectionEvent(initContext); +JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeCopyCurrentSelectionToSystemClipboard +(JNIEnv *env, jobject obj, jint nativeBCPtr) +{ + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; + + if (nativeBrowserControl->initComplete) { + wsCopySelectionEvent * actionEvent = new wsCopySelectionEvent(nativeBrowserControl); PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + ::util_PostEvent(nativeBrowserControl, event); } } +#endif // if 0 + JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeGetSelection -(JNIEnv *env, jobject obj, jint webShellPtr, jobject selection) +(JNIEnv *env, jobject obj, jint nativeBCPtr, jobject selection) { - NativeBrowserControl *initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl *nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; - if (initContext == nsnull) { - ::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed nativeGetSelection"); + if (nativeBrowserControl == nsnull) { + ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed nativeGetSelection"); return; } - PR_ASSERT(initContext->initComplete); - if (selection == nsnull) { - ::util_ThrowExceptionToJava(env, "Exception: null Selection object passed to raptorWebShellGetSelection"); + ::util_ThrowExceptionToJava(env, "Exception: null Selection object passed to nativeGetSelection"); + return; + } + nsresult rv = nativeBrowserControl->mWindow->GetSelection(env, + selection); + if (NS_FAILED(rv)) { + ::util_ThrowExceptionToJava(env, "Exception: Can't get Selection from browser"); return; } - wsGetSelectionEvent *actionEvent = new wsGetSelectionEvent(env, initContext, selection); - - PLEvent *event = (PLEvent *) *actionEvent; - ::util_PostSynchronousEvent(initContext, event); + } +#if 0 // convenience JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeHighlightSelection -(JNIEnv *env, jobject obj, jint webShellPtr, jobject startContainer, jobject endContainer, jint startOffset, jint endOffset) +(JNIEnv *env, jobject obj, jint nativeBCPtr, jobject startContainer, jobject endContainer, jint startOffset, jint endOffset) { - NativeBrowserControl *initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl *nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; - if (initContext == nsnull) { - ::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to nativeHighlightSelection"); + if (nativeBrowserControl == nsnull) { + ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed to nativeHighlightSelection"); return; } - PR_ASSERT(initContext->initComplete); + PR_ASSERT(nativeBrowserControl->initComplete); - wsHighlightSelectionEvent *actionEvent = new wsHighlightSelectionEvent(env, initContext, startContainer, endContainer, (PRInt32) startOffset, (PRInt32) endOffset); + wsHighlightSelectionEvent *actionEvent = new wsHighlightSelectionEvent(env, nativeBrowserControl, startContainer, endContainer, (PRInt32) startOffset, (PRInt32) endOffset); PLEvent *event = (PLEvent *) *actionEvent; - ::util_PostSynchronousEvent(initContext, event); + ::util_PostSynchronousEvent(nativeBrowserControl, event); } JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeClearAllSelections -(JNIEnv *env, jobject obj, jint webShellPtr) +(JNIEnv *env, jobject obj, jint nativeBCPtr) { - NativeBrowserControl *initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl *nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; - if (initContext == nsnull) { - ::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to nativeClearAllSelections"); + if (nativeBrowserControl == nsnull) { + ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed to nativeClearAllSelections"); return; } - PR_ASSERT(initContext->initComplete); + PR_ASSERT(nativeBrowserControl->initComplete); - wsClearAllSelectionEvent *actionEvent = new wsClearAllSelectionEvent(initContext); + wsClearAllSelectionEvent *actionEvent = new wsClearAllSelectionEvent(nativeBrowserControl); PLEvent *event = (PLEvent *) *actionEvent; - ::util_PostSynchronousEvent(initContext, event); + ::util_PostSynchronousEvent(nativeBrowserControl, event); } /* @@ -118,24 +124,24 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPa * Signature: (Ljava/lang/String;ZZ)V */ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeFindInPage -(JNIEnv *env, jobject obj, jint webShellPtr, jstring searchString, jboolean forward, jboolean matchCase) +(JNIEnv *env, jobject obj, jint nativeBCPtr, jstring searchString, jboolean forward, jboolean matchCase) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; jstring searchStringGlobalRef = (jstring) ::util_NewGlobalRef(env, searchString); if (!searchStringGlobalRef) { - initContext->initFailCode = kFindComponentError; + nativeBrowserControl->initFailCode = kFindComponentError; ::util_ThrowExceptionToJava(env, "Exception: Can't create global ref for search string"); return; } - if (initContext->initComplete) { - wsFindEvent * actionEvent = new wsFindEvent(initContext, searchStringGlobalRef, + if (nativeBrowserControl->initComplete) { + wsFindEvent * actionEvent = new wsFindEvent(nativeBrowserControl, searchStringGlobalRef, forward, matchCase); PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + ::util_PostEvent(nativeBrowserControl, event); } @@ -149,18 +155,18 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPa * Signature: (Z)V */ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeFindNextInPage -(JNIEnv *env, jobject obj, jint webShellPtr) +(JNIEnv *env, jobject obj, jint nativeBCPtr) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; //First get the FindComponent object PRBool found = PR_TRUE; - if (initContext->initComplete) { - wsFindEvent * actionEvent = new wsFindEvent(initContext); + if (nativeBrowserControl->initComplete) { + wsFindEvent * actionEvent = new wsFindEvent(nativeBrowserControl); PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + ::util_PostEvent(nativeBrowserControl, event); } } @@ -171,25 +177,25 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPa * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeGetCurrentURL -(JNIEnv *env, jobject obj, jint webShellPtr) +(JNIEnv *env, jobject obj, jint nativeBCPtr) { JNIEnv * pEnv = env; jobject jobj = obj; char * charResult = nsnull; jstring urlString = nsnull; - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; - if (initContext == nsnull) { - ::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellGetURL"); + if (nativeBrowserControl == nsnull) { + ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed to raptorWebShellGetURL"); return nsnull; } - if (initContext->initComplete) { - wsGetURLEvent * actionEvent = new wsGetURLEvent(initContext); + if (nativeBrowserControl->initComplete) { + wsGetURLEvent * actionEvent = new wsGetURLEvent(nativeBrowserControl); PLEvent * event = (PLEvent*) *actionEvent; - charResult = (char *) ::util_PostSynchronousEvent(initContext, event); + charResult = (char *) ::util_PostSynchronousEvent(nativeBrowserControl, event); if (charResult != nsnull) { urlString = ::util_NewStringUTF(env, (const char *) charResult); @@ -206,20 +212,20 @@ JNIEXPORT jstring JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Curren } JNIEXPORT jobject JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeGetDOM -(JNIEnv *env, jobject obj, jint webShellPtr) +(JNIEnv *env, jobject obj, jint nativeBCPtr) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; jobject result = nsnull; jlong documentLong = nsnull; jclass clazz = nsnull; jmethodID mid = nsnull; - if (initContext == nsnull) { - ::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellGetDOM"); + if (nativeBrowserControl == nsnull) { + ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed to raptorWebShellGetDOM"); return nsnull; } - if (nsnull == initContext->currentDocument || - nsnull == (documentLong = (jlong) initContext->currentDocument.get())){ + if (nsnull == nativeBrowserControl->currentDocument || + nsnull == (documentLong = (jlong) nativeBrowserControl->currentDocument.get())){ return nsnull; } @@ -236,7 +242,7 @@ JNIEXPORT jobject JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Curren wsGetDOMEvent * actionEvent = new wsGetDOMEvent(env, clazz, mid, documentLong); PLEvent * event = (PLEvent*) *actionEvent; - result = (jobject) ::util_PostSynchronousEvent(initContext, event); + result = (jobject) ::util_PostSynchronousEvent(nativeBrowserControl, event); return result; @@ -268,18 +274,18 @@ JNIEXPORT jstring JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Curren /* PENDING(ashuk): remove this from here and in the motif directory JNIEXPORT jbyteArray JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeGetSourceBytes -(JNIEnv * env, jobject jobj, jint webShellPtr, jboolean viewMode) +(JNIEnv * env, jobject jobj, jint nativeBCPtr, jboolean viewMode) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; - if (initContext->initComplete) { + if (nativeBrowserControl->initComplete) { wsViewSourceEvent * actionEvent = - new wsViewSourceEvent(initContext->docShell, ((JNI_TRUE == viewMode)? PR_TRUE : PR_FALSE)); + new wsViewSourceEvent(nativeBrowserControl->docShell, ((JNI_TRUE == viewMode)? PR_TRUE : PR_FALSE)); PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + ::util_PostEvent(nativeBrowserControl, event); } jbyteArray result = nsnull; @@ -294,13 +300,14 @@ JNIEXPORT jbyteArray JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Cur * Signature: ()V */ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeResetFind -(JNIEnv * env, jobject obj, jint webShellPtr) +(JNIEnv * env, jobject obj, jint nativeBCPtr) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; } +#endif // if 0 /* * Class: org_mozilla_webclient_impl_wrapper_0005fnative_CurrentPageImpl @@ -308,29 +315,36 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPa * Signature: ()V */ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativeSelectAll -(JNIEnv * env, jobject obj, jint webShellPtr) +(JNIEnv * env, jobject obj, jint nativeBCPtr) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; - if (initContext->initComplete) { - wsSelectAllEvent * actionEvent = new wsSelectAllEvent(initContext); - PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; + + if (nativeBrowserControl == nsnull) { + ::util_ThrowExceptionToJava(env, "Exception: null passed to nativeSelectAll"); + return; + } + nsresult rv = nativeBrowserControl->mWindow->SelectAll(); + if (NS_FAILED(rv)) { + ::util_ThrowExceptionToJava(env, "Exception: Can't selectAll"); + return; } } +#if 0 // convenience + /* * Class: org_mozilla_webclient_impl_wrapper_0005fnative_CurrentPageImpl * Method: nativePrint * Signature: (I)V */ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativePrint -(JNIEnv * env, jobject obj, jint webShellPtr) +(JNIEnv * env, jobject obj, jint nativeBCPtr) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; - if (initContext->initComplete) { - wsPrintEvent * actionEvent = new wsPrintEvent(initContext); + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; + if (nativeBrowserControl->initComplete) { + wsPrintEvent * actionEvent = new wsPrintEvent(nativeBrowserControl); PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + ::util_PostEvent(nativeBrowserControl, event); } } @@ -340,13 +354,14 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPa * Signature: (IZ)V */ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CurrentPageImpl_nativePrintPreview -(JNIEnv * env, jobject obj, jint webShellPtr, jboolean preview) +(JNIEnv * env, jobject obj, jint nativeBCPtr, jboolean preview) { - NativeBrowserControl* initContext = (NativeBrowserControl *) webShellPtr; - if (initContext->initComplete) { - wsPrintPreviewEvent * actionEvent = new wsPrintPreviewEvent(initContext, preview); + NativeBrowserControl* nativeBrowserControl = (NativeBrowserControl *) nativeBCPtr; + if (nativeBrowserControl->initComplete) { + wsPrintPreviewEvent * actionEvent = new wsPrintPreviewEvent(nativeBrowserControl, preview); PLEvent * event = (PLEvent*) *actionEvent; - ::util_PostEvent(initContext, event); + ::util_PostEvent(nativeBrowserControl, event); } } +# endif // if 0 diff --git a/java/webclient/src_moz/EmbedWindow.cpp b/java/webclient/src_moz/EmbedWindow.cpp index cc9f2089da02..12bc489fa0f8 100644 --- a/java/webclient/src_moz/EmbedWindow.cpp +++ b/java/webclient/src_moz/EmbedWindow.cpp @@ -29,12 +29,26 @@ #include #include #include +#include "nsIDOMWindowInternal.h" +#include "nsIDOMWindow.h" +#include "nsISelection.h" +#include "nsIDOMRange.h" +#include "nsIDOMNode.h" #include "nsIWidget.h" #include "nsReadableUtils.h" +#include "nsIContentViewer.h" +#include "nsIContentViewerEdit.h" +#include "nsIDocShell.h" +#include "nsIInterfaceRequestorUtils.h" + #include "NativeBrowserControl.h" #include "EmbedWindow.h" +#include "jni_util.h" + +#include "nsCRT.h" + EmbedWindow::EmbedWindow(void) { mOwner = nsnull; @@ -109,6 +123,150 @@ EmbedWindow::ReleaseChildren(void) mWebBrowser = 0; } +nsresult +EmbedWindow::SelectAll() +{ + nsCOMPtr docShell = do_GetInterface(mWebBrowser); + if (!docShell) { + return NS_ERROR_FAILURE; + } + nsCOMPtr contentViewer; + nsresult rv = docShell->GetContentViewer(getter_AddRefs(contentViewer)); + if (!contentViewer) { + return NS_ERROR_FAILURE; + } + nsCOMPtr contentViewerEdit(do_QueryInterface(contentViewer)); + if (!contentViewerEdit) { + return NS_ERROR_FAILURE; + } + + rv = contentViewerEdit->SelectAll(); + return rv; +} + +nsresult +EmbedWindow::GetSelection(JNIEnv *env, jobject mSelection) +{ + nsresult rv = NS_ERROR_FAILURE; + + // Get the DOM window + nsCOMPtr domWindow; + rv = mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow)); + if (NS_FAILED(rv) || !domWindow) { + return rv; + } + + // Get the selection object of the DOM window + nsCOMPtr selection; + rv = domWindow->GetSelection(getter_AddRefs(selection)); + if (NS_FAILED(rv) || !selection) { + return rv; + } + + // Get the range count + PRInt32 rangeCount; + rv = selection->GetRangeCount(&rangeCount); + if (NS_FAILED(rv) || rangeCount == 0) { + return rv; + } + + // Get the actual selection string + PRUnichar *selectionStr; + rv = selection->ToString(&selectionStr); + if (NS_FAILED(rv)) { + return rv; + } + + jstring string = + env->NewString((jchar*)selectionStr, nsCRT::strlen(selectionStr)); + // string is now GC'd by Java + nsMemory::Free((void *) selectionStr); + + // Get the first range object of the selection object + nsCOMPtr range; + rv = selection->GetRangeAt(0, getter_AddRefs(range)); + if (NS_FAILED(rv) || !range) { + return rv; + } + + // Get the properties of the range object (startContainer, + // startOffset, endContainer, endOffset) + PRInt32 startOffset; + PRInt32 endOffset; + nsCOMPtr startContainer; + nsCOMPtr endContainer; + + // start container + rv = range->GetStartContainer(getter_AddRefs(startContainer)); + if (NS_FAILED(rv)) { + return rv; + } + + // end container + rv = range->GetEndContainer(getter_AddRefs(endContainer)); + if (NS_FAILED(rv)) { + return rv; + } + + // start offset + rv = range->GetStartOffset(&startOffset); + if (NS_FAILED(rv)) { + return rv; + } + + // end offset + rv = range->GetEndOffset(&endOffset); + if (NS_FAILED(rv)) { + return rv; + } + + // get a handle on to acutal (java) Node representing the start + // and end containers + jlong node1Long = nsnull; + jlong node2Long = nsnull; + + nsCOMPtr node1Ptr(do_QueryInterface(startContainer)); + nsCOMPtr node2Ptr(do_QueryInterface(endContainer)); + + if (nsnull == (node1Long = (jlong)node1Ptr.get())) { + return NS_ERROR_NULL_POINTER; + } + if (nsnull == (node2Long = (jlong)node2Ptr.get())) { + return NS_ERROR_NULL_POINTER; + } + + jclass clazz = nsnull; + jmethodID mid = nsnull; + + if (nsnull == (clazz = ::util_FindClass(env, + "org/mozilla/dom/DOMAccessor"))) { + return NS_ERROR_NULL_POINTER; + } + if (nsnull == (mid = env->GetStaticMethodID(clazz, "getNodeByHandle", + "(J)Lorg/w3c/dom/Node;"))) { + return NS_ERROR_NULL_POINTER; + } + + jobject node1 = (jobject) ((void *)::util_CallStaticObjectMethodlongArg(env, clazz, mid, node1Long)); + jobject node2 = (jobject) ((void *)::util_CallStaticObjectMethodlongArg(env, clazz, mid, node2Long)); + + // prepare the (java) Selection object that is to be returned. + if (nsnull == (clazz = ::util_FindClass(env, "org/mozilla/webclient/Selection"))) { + return NS_ERROR_NULL_POINTER; + } + + if (nsnull == (mid = env->GetMethodID(clazz, "init", + "(Ljava/lang/String;Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;II)V"))) { + return NS_ERROR_NULL_POINTER; + } + + env->CallVoidMethod(mSelection, mid, + string, node1, node2, + (jint)startOffset, (jint)endOffset); + + return NS_OK; +} + // nsISupports NS_IMPL_ADDREF(EmbedWindow) diff --git a/java/webclient/src_moz/EmbedWindow.h b/java/webclient/src_moz/EmbedWindow.h index 37fa390516f0..abf91a1bb148 100644 --- a/java/webclient/src_moz/EmbedWindow.h +++ b/java/webclient/src_moz/EmbedWindow.h @@ -43,6 +43,8 @@ class NativeBrowserControl; +#include "ns_util.h" + class EmbedWindow : public nsIWebBrowserChrome, public nsIWebBrowserChromeFocus, public nsIEmbeddingSiteWindow, @@ -58,6 +60,9 @@ public: nsresult Init (NativeBrowserControl *aOwner); nsresult CreateWindow_ (PRUint32 width, PRUint32 height); void ReleaseChildren (void); + + nsresult SelectAll (); + nsresult GetSelection (JNIEnv *env, jobject selection); NS_DECL_ISUPPORTS diff --git a/java/webclient/src_moz/Makefile.in b/java/webclient/src_moz/Makefile.in index dbeb7dbbbf54..44bdde18a5ff 100644 --- a/java/webclient/src_moz/Makefile.in +++ b/java/webclient/src_moz/Makefile.in @@ -89,18 +89,18 @@ REQUIRES = xpcom \ # nsActions.cpp \ # CBrowserContainer.cpp \ # PromptActionEvents.cpp \ -# CurrentPageImpl.cpp \ # CurrentPageActionEvents.cpp \ # HistoryImpl.cpp \ # HistoryActionEvents.cpp \ # ISupportsPeer.cpp \ # NativeEventThreadActionEvents.cpp \ # NavigationActionEvents.cpp \ -# InputStreamShim.cpp \ # WindowControlActionEvents.cpp \ # WindowCreator.cpp \ CPPSRCS = \ + InputStreamShim.cpp \ + CurrentPageImpl.cpp \ NativeBrowserControl.cpp \ NativeWrapperFactory.cpp \ EmbedWindow.cpp \ diff --git a/java/webclient/src_moz/NavigationImpl.cpp b/java/webclient/src_moz/NavigationImpl.cpp index 2d20c3a865fe..73517d2ec49b 100644 --- a/java/webclient/src_moz/NavigationImpl.cpp +++ b/java/webclient/src_moz/NavigationImpl.cpp @@ -99,7 +99,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio nsString *uriNsString = nsnull; wsLoadFromStreamEvent *actionEvent = nsnull; - if (nativeBrowserControl == nsnull || !nativeBrowserControl->initComplete) { + if (nativeBrowserControl == nsnull) { ::util_ThrowExceptionToJava(env, "Exception: null nativeBCPtr passed to nativeLoadFromStream"); return; } @@ -110,19 +110,19 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio ::util_ThrowExceptionToJava(env, "Exception: nativeLoadFromStream: unable to convert java string to native format"); goto NLFS_CLEANUP; } - + if (!(uriNsString = new nsString(uriStringUniChars, uriStringUniCharsLength))) { ::util_ThrowExceptionToJava(env, "Exception: nativeLoadFromStream: unable to convert native string to nsString"); goto NLFS_CLEANUP; } - + // the deleteGlobalRef is done in the wsLoadFromStream destructor if (!(globalStream = ::util_NewGlobalRef(env, stream))) { ::util_ThrowExceptionToJava(env, "Exception: nativeLoadFromStream: unable to create gloabal ref to stream"); goto NLFS_CLEANUP; } - + if (loadProperties) { // the deleteGlobalRef is done in the wsLoadFromStream destructor if (!(globalLoadProperties = @@ -131,7 +131,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_Navigatio goto NLFS_CLEANUP; } } - + if (!(actionEvent = new wsLoadFromStreamEvent(nativeBrowserControl, (void *) globalStream, *uriNsString, @@ -153,6 +153,8 @@ 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) 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 4a87996984f1..13744d91b328 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.3 2004/04/22 06:41:02 edburns%acm.org Exp $ + * $Id: NavigationTest.java,v 1.4 2004/04/28 14:39:54 edburns%acm.org Exp $ */ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- @@ -71,14 +71,29 @@ public class NavigationTest extends WebclientTestCase { frame.setVisible(true); canvas.setVisible(true); - Navigation nav = (Navigation) + Navigation2 nav = (Navigation2) firstBrowserControl.queryInterface(BrowserControl.NAVIGATION_NAME); assertNotNull(nav); File testPage = new File(getBrowserBinDir(), "../../java/webclient/test/automated/src/test/NavigationTest.txt"); System.out.println("Loading url: " + testPage.toURL().toString()); - nav.loadURL(testPage.toURL().toString()); + nav.loadURLBlocking(testPage.toURL().toString()); + + CurrentPage2 currentPage = (CurrentPage2) + firstBrowserControl.queryInterface(BrowserControl.CURRENT_PAGE_NAME); + + assertNotNull(currentPage); + currentPage.selectAll(); + Selection selection = currentPage.getSelection(); + assertTrue(-1 != selection.toString().indexOf("This test file is for the NavigationTest.")); + System.out.println("Selection is: " + selection.toString()); + + /********* + RandomHTMLInputStream rhis = new RandomHTMLInputStream(3); + nav.loadFromStream(rhis, "http://randomstream.com/", + "text/html", -1, null); + ************/ frame.setVisible(false); BrowserControlFactory.deleteBrowserControl(firstBrowserControl); BrowserControlFactory.appTerminate(); diff --git a/java/webclient/test/automated/src/classes/org/mozilla/webclient/RandomHTMLInputStream.java b/java/webclient/test/automated/src/classes/org/mozilla/webclient/RandomHTMLInputStream.java new file mode 100644 index 000000000000..2c3daae342b4 --- /dev/null +++ b/java/webclient/test/automated/src/classes/org/mozilla/webclient/RandomHTMLInputStream.java @@ -0,0 +1,268 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is RaptorCanvas. + * + * The Initial Developer of the Original Code is Kirk Baker and + * Ian Wilkinson. Portions created by Kirk Baker and Ian Wilkinson are + * Copyright (C) 1999 Kirk Baker and Ian Wilkinson. All + * Rights Reserved. + * + * Contributor(s): Ed Burns + */ + +package org.mozilla.webclient; + +/* + * RandomHTMLInputStream.java + */ + +import org.mozilla.util.Assert; +import org.mozilla.util.ParameterCheck; + +import java.io.InputStream; +import java.io.IOException; +import java.util.Random; + +/** + + * This class simulates a nasty, misbehavin' InputStream. + + * It randomly throws IOExceptions, blocks on read, and is bursty. + + */ + +public class RandomHTMLInputStream extends InputStream +{ + +// +// Class variables +// + +private static final int MAX_AVAILABLE = 4096; + +/** + + * This makes it so only when we get a random between 0 and 100 number + * that evenly divides by three do we throw an IOException + + */ + +private static final int EXCEPTION_DIVISOR = 179; + +private static final byte [] CHARSET; + +// +// relationship ivars +// + +private Random random; + +// +// attribute ivars +// + +private boolean isClosed; + +private boolean firstRead; + +/** + + * the number of times that read(bytearray) can be called and still get + * data. + + */ + +private int numReads; + +private int available; + +/** + + * @param yourNumReads must be at least 2 + + */ + +static { + String charSet = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890[]{}"; + CHARSET = charSet.getBytes(); +} + +public RandomHTMLInputStream(int yourNumReads) +{ + ParameterCheck.greaterThan(yourNumReads, 1); + + random = new Random(); + Assert.assert_it(null != random); + + isClosed = false; + firstRead = true; + numReads = yourNumReads; + available = random.nextInt(MAX_AVAILABLE); +} + +public int available() throws IOException +{ + int result; + if (shouldThrowException()) { + throw new IOException("It's time for an IOException!"); + } + if (isClosed) { + result = -1; + } + else { + result = available; + } + return result; +} + +public int read() throws IOException +{ + int result = 0; + if (shouldThrowException()) { + throw new IOException("It's time for an IOException!"); + } + + if (0 < available) { + result = (int) 'a'; + available--; + } + else { + result = -1; + } + return result; +} + +public int read(byte[] b, int off, int len) throws IOException +{ + if (shouldThrowException()) { + throw new IOException("It's time for an IOException!"); + } + + byte [] bytes; + int i = 0; + int max = 0; + int numRead = -1; + + // write case 0, no more reads left + if (0 == numReads || isClosed) { + return -1; + } + if (len <= available) { + max = len; + } + else { + max = available; + } + + + if (firstRead) { + String htmlHead = "
START Random Data";
+        numRead = htmlHead.length();
+
+        // write case 1, yes enough length to write htmlHead
+        if (numRead < len && len <= available) {
+            bytes = htmlHead.getBytes();
+            for (i = 0; i < numRead; i++) {
+                b[off+i] = bytes[i];
+            }
+            available -= numRead;
+        }
+        else {
+            // write case 2, not enough length to write htmlHead
+            for (i = 0; i < max; i++) {
+                b[off+i] = (byte) random.nextInt(8);
+            }
+            numRead = max;
+            available -= max;
+        }
+        firstRead = false;
+    }
+    else {
+        // if this is the last read
+        if (1 == numReads) {
+            String htmlTail = "\nEND Random Data
"; + numRead = htmlTail.length(); + // write case 3, yes enough length to write htmlTail + if (numRead < len && len <= available) { + bytes = htmlTail.getBytes(); + for (i = 0; i < numRead; i++) { + b[off+i] = bytes[i]; + } + available -= numRead; + } + else { + // write case 4, not enough length to write htmlTail + for (i = 0; i < max; i++) { + b[off+i] = (byte) random.nextInt(8); + } + numRead = max; + available -= max; + } + } + else { + + // if it's time to block + if (random.nextBoolean()) { + try { + System.out.println("RandomHTMLInputStream:: sleeping"); + Thread.sleep(3000); + } + catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + // write case 5, write some random bytes to fit length + + // this is not the first or the last read, just cough up + // some random bytes. + + bytes = new byte[max]; + for (i = 0; i < max; i++) { + if (0 == (i % 78)) { + b[off+i] = (byte) '\n'; + } + else { + b[off+i] = CHARSET[random.nextInt(CHARSET.length)]; + } + } + numRead = max; + available -= max; + } + } + available = random.nextInt(MAX_AVAILABLE); + numReads--; + return numRead; +} + +public void close() throws IOException +{ + if (shouldThrowException()) { + throw new IOException("It's time for an IOException!"); + } + isClosed = true; +} + +private boolean shouldThrowException() +{ + int nextInt = random.nextInt(10000); + + boolean result = false; + + if (nextInt > EXCEPTION_DIVISOR) { + result = (0 == (nextInt % EXCEPTION_DIVISOR)); + } + return result; +} + +}