From 1f01dae0069717a89added3b84e63254e104e969 Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Thu, 10 Aug 2000 21:38:52 +0000 Subject: [PATCH] a=edburns r=ashuk bug=47357 M classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java M src_moz/CBrowserContainer.cpp M src_moz/NativeEventThread.cpp M src_moz/ns_util.cpp M src_moz/ns_util.h M src_share/jni_util.cpp M src_share/jni_util.h tar -cvf 47357.2.tar classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java src_moz/CBrowserContainer.cpp src_moz/NativeEventThread.cpp src_moz/ns_util.cpp src_moz/ns_util.h src_share/jni_util.cpp src_share/jni_util.h cvs diff -u classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java src_moz/CBrowserContainer.cpp src_moz/NativeEventThread.cpp src_moz/ns_util.cpp src_moz/ns_util.h src_share/jni_util.cpp src_share/jni_util.h This change modifes what one has to do on the native side to add a listener. * How to create a new listener type on the native side:

* 1. add an entry in the gSupportedListenerInterfaces array defined in * ns_util.cpp

* 2. add a corresponding entry in the LISTENER_CLASSES enum in * ns_util.h

* 3. add a jstring to the string constant list in * CBrowserContainer.cpp, below. * 4. Initialize this jstring constant in CBrowserContainer.cpp * initStringConstants()

* 5. add an entry to the switch statement in NativeEventThread.cpp * native{add,remove}Listener

You have to clobber_all in webclient after this change. git-svn-id: svn://10.0.0.236/trunk@76019 18797224-902f-48f8-a5cc-f745e15eee43 --- .../wrapper_native/NativeEventThread.java | 8 +- .../webclient/src_moz/CBrowserContainer.cpp | 77 ++++++++++++++++--- .../webclient/src_moz/NativeEventThread.cpp | 23 +----- mozilla/java/webclient/src_moz/ns_util.cpp | 14 ++++ mozilla/java/webclient/src_moz/ns_util.h | 11 +++ mozilla/java/webclient/src_share/jni_util.cpp | 4 +- mozilla/java/webclient/src_share/jni_util.h | 1 + 7 files changed, 100 insertions(+), 38 deletions(-) diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java index 78b2b65aea9..c9987b17e34 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java @@ -351,20 +351,22 @@ void removeListener(WCEventListenerWrapper newListener) */ -void nativeEventOccurred(WebclientEventListener target, long eventType, +void nativeEventOccurred(WebclientEventListener target, + String targetClassName, long eventType, Object eventData) { ParameterCheck.nonNull(target); + ParameterCheck.nonNull(targetClassName); Assert.assert(-1 != nativeWebShell); Assert.assert(null != windowControl); WebclientEvent event = null; - if (target instanceof DocumentLoadListener) { + if (DocumentLoadListener.class.getName().equals(targetClassName)) { event = new DocumentLoadEvent(this, eventType, eventData); } - else if (target instanceof MouseListener) { + else if (MouseListener.class.getName().equals(targetClassName)) { Assert.assert(target instanceof WCMouseListenerImpl); // We create a plain vanilla WebclientEvent, which the diff --git a/mozilla/java/webclient/src_moz/CBrowserContainer.cpp b/mozilla/java/webclient/src_moz/CBrowserContainer.cpp index 0a4cc886b57..779c2597c20 100644 --- a/mozilla/java/webclient/src_moz/CBrowserContainer.cpp +++ b/mozilla/java/webclient/src_moz/CBrowserContainer.cpp @@ -61,7 +61,7 @@ char *CBrowserContainer::DOMMouseListener_maskNames[] = { nsnull }; -static jboolean PROPERTIES_KEYS_INITED = JNI_FALSE; +static jboolean STRING_CONSTANTS_INITED = JNI_FALSE; static jobject SCREEN_X_KEY = nsnull; static jobject SCREEN_Y_KEY = nsnull; static jobject CLIENT_X_KEY = nsnull; @@ -77,6 +77,36 @@ static jobject FALSE_VALUE = nsnull; static jobject ONE_VALUE = nsnull; static jobject TWO_VALUE = nsnull; +/** + + * How to create a new listener type on the native side:

+ + * 1. add an entry in the gSupportedListenerInterfaces array defined in + * ns_util.cpp

+ + * 2. add a corresponding entry in the LISTENER_CLASSES enum in + * ns_util.h

+ + * 3. add a jstring to the string constant list in + * CBrowserContainer.cpp, below. + + * 4. Initialize this jstring constant in CBrowserContainer.cpp + * initStringConstants()

+ + * 5. add an entry to the switch statement in NativeEventThread.cpp + * native{add,remove}Listener

+ + */ + +/** + + * We need one of these for each of the classes in + * gSupportedListenerInterfaces, defined in ns_util.cpp + + */ +static jstring DOCUMENT_LOAD_LISTENER_CLASSNAME; +static jstring MOUSE_LISTENER_CLASSNAME; + #if defined(XP_UNIX) || defined(XP_MAC) || defined(XP_BEOS) #define WC_ITOA(intVal, buf, radix) sprintf(buf, "%d", intVal) @@ -91,7 +121,7 @@ static jobject TWO_VALUE = nsnull; */ -jboolean initPropertiesKeys(); +jboolean initStringConstants(); CBrowserContainer::CBrowserContainer(nsIWebBrowser *pOwner, JNIEnv *env, WebShellInitContext *yourInitContext) : @@ -103,6 +133,10 @@ CBrowserContainer::CBrowserContainer(nsIWebBrowser *pOwner, JNIEnv *env, if (nsnull == gVm) { // declared in ../src_share/jni_util.h ::util_GetJavaVM(env, &gVm); // save this vm reference away for the callback! } + // initialize the string constants (including properties keys) + if (!STRING_CONSTANTS_INITED) { + initStringConstants(); + } } @@ -702,6 +736,7 @@ CBrowserContainer::OnStartDocumentLoad(nsIDocumentLoader* loader, nsIURI* aURL, } util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mDocTarget, + DOCUMENT_LOAD_LISTENER_CLASSNAME, DocumentLoader_maskValues[START_DOCUMENT_LOAD_EVENT_MASK], urlJStr); @@ -749,6 +784,7 @@ CBrowserContainer::OnEndDocumentLoad(nsIDocumentLoader* loader, nsIChannel *aCha util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mDocTarget, + DOCUMENT_LOAD_LISTENER_CLASSNAME, DocumentLoader_maskValues[END_DOCUMENT_LOAD_EVENT_MASK], nsnull); @@ -773,6 +809,7 @@ CBrowserContainer::OnStartURLLoad(nsIDocumentLoader* loader, nsIChannel* aChanne util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mDocTarget, + DOCUMENT_LOAD_LISTENER_CLASSNAME, DocumentLoader_maskValues[START_URL_LOAD_EVENT_MASK], nsnull); @@ -795,6 +832,7 @@ CBrowserContainer::OnProgressURLLoad(nsIDocumentLoader* loader, nsIChannel* aCha util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mDocTarget, + DOCUMENT_LOAD_LISTENER_CLASSNAME, DocumentLoader_maskValues[PROGRESS_URL_LOAD_EVENT_MASK], nsnull); @@ -829,6 +867,7 @@ CBrowserContainer::OnStatusURLLoad(nsIDocumentLoader* loader, util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mDocTarget, + DOCUMENT_LOAD_LISTENER_CLASSNAME, DocumentLoader_maskValues[STATUS_URL_LOAD_EVENT_MASK], (jobject) statusMessage); @@ -856,6 +895,7 @@ CBrowserContainer::OnEndURLLoad(nsIDocumentLoader* loader, nsIChannel* channel, util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mDocTarget, + DOCUMENT_LOAD_LISTENER_CLASSNAME, DocumentLoader_maskValues[END_URL_LOAD_EVENT_MASK], nsnull); return NS_OK; @@ -881,6 +921,7 @@ CBrowserContainer::MouseDown(nsIDOMEvent* aMouseEvent) util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mMouseTarget, + MOUSE_LISTENER_CLASSNAME, DOMMouseListener_maskValues[MOUSE_DOWN_EVENT_MASK], properties); return NS_OK; @@ -899,6 +940,7 @@ CBrowserContainer::MouseUp(nsIDOMEvent* aMouseEvent) util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mMouseTarget, + MOUSE_LISTENER_CLASSNAME, DOMMouseListener_maskValues[MOUSE_UP_EVENT_MASK], properties); return NS_OK; @@ -922,6 +964,7 @@ CBrowserContainer::MouseClick(nsIDOMEvent* aMouseEvent) util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mMouseTarget, + MOUSE_LISTENER_CLASSNAME, DOMMouseListener_maskValues[MOUSE_CLICK_EVENT_MASK], properties); return NS_OK; @@ -946,6 +989,7 @@ CBrowserContainer::MouseDblClick(nsIDOMEvent* aMouseEvent) util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mMouseTarget, + MOUSE_LISTENER_CLASSNAME, DOMMouseListener_maskValues[MOUSE_DOUBLE_CLICK_EVENT_MASK], properties); return NS_OK; @@ -964,6 +1008,7 @@ CBrowserContainer::MouseOver(nsIDOMEvent* aMouseEvent) util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mMouseTarget, + MOUSE_LISTENER_CLASSNAME, DOMMouseListener_maskValues[MOUSE_OVER_EVENT_MASK], properties); return NS_OK; @@ -982,6 +1027,7 @@ CBrowserContainer::MouseOut(nsIDOMEvent* aMouseEvent) util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mMouseTarget, + MOUSE_LISTENER_CLASSNAME, DOMMouseListener_maskValues[MOUSE_OUT_EVENT_MASK], properties); return NS_OK; @@ -1135,7 +1181,8 @@ jobject JNICALL CBrowserContainer::getPropertiesFromEvent(nsIDOMEvent *event) void JNICALL CBrowserContainer::addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent) { - if (!properties) { + // if the initialization failed, don't modify the properties + if (!properties || !STRING_CONSTANTS_INITED) { return; } nsresult rv; @@ -1148,13 +1195,7 @@ void JNICALL CBrowserContainer::addMouseEventDataToProperties(nsIDOMEvent *aMous if (NS_FAILED(rv)) { return; } - // initialize the standard properties keys - if (!PROPERTIES_KEYS_INITED) { - // if the initialization failed, don't modify the properties - if (!initPropertiesKeys()) { - return; - } - } + PRInt32 intVal; PRUint16 int16Val; PRBool boolVal; @@ -1394,7 +1435,7 @@ nsresult JNICALL CBrowserContainer::takeActionOnNode(nsCOMPtr curren // Local functions // -jboolean initPropertiesKeys() +jboolean initStringConstants() { JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); @@ -1469,6 +1510,18 @@ jboolean initPropertiesKeys() ::util_NewStringUTF(env, "2")))) { return JNI_FALSE; } + if (nsnull == (DOCUMENT_LOAD_LISTENER_CLASSNAME = (jstring) + ::util_NewGlobalRef(env, + ::util_NewStringUTF(env, + gSupportedListenerInterfaces[DOCUMENT_LOAD_LISTENER])))) { + return JNI_FALSE; + } + if (nsnull == (MOUSE_LISTENER_CLASSNAME = (jstring) + ::util_NewGlobalRef(env, + ::util_NewStringUTF(env, + gSupportedListenerInterfaces[MOUSE_LISTENER])))) { + return JNI_FALSE; + } - return PROPERTIES_KEYS_INITED = JNI_TRUE; + return STRING_CONSTANTS_INITED = JNI_TRUE; } diff --git a/mozilla/java/webclient/src_moz/NativeEventThread.cpp b/mozilla/java/webclient/src_moz/NativeEventThread.cpp index 96fe875e302..4b41002b50b 100644 --- a/mozilla/java/webclient/src_moz/NativeEventThread.cpp +++ b/mozilla/java/webclient/src_moz/NativeEventThread.cpp @@ -85,7 +85,7 @@ static NS_DEFINE_CID(kCmdLineServiceCID, NS_COMMANDLINE_SERVICE_CID); static const char *NS_DOCSHELL_PROGID = "component://netscape/docshell/html"; //static const char *NS_WEBBROWSER_PROGID = "component://netscape/embedding/browser/nsWebBrowser"; -extern const char * gBinDir; +extern const char * gBinDir; // defined in WrapperFactoryImpl.cpp #ifdef XP_PC @@ -160,27 +160,6 @@ char * errorMessages[] = { "Unable to show the WebShell." }; -/** - - * a null terminated array of listener interfaces we support. - - */ - -const char *gSupportedListenerInterfaces[] = { - "org.mozilla.webclient.DocumentLoadListener", - "java.awt.event.MouseListener", - nsnull -}; - -// these index into the gSupportedListenerInterfaces array - -typedef enum { - DOCUMENT_LOAD_LISTENER = 0, - MOUSE_LISTENER, - LISTENER_NOT_FOUND -} LISTENER_CLASSES; - - // // JNI methods // diff --git a/mozilla/java/webclient/src_moz/ns_util.cpp b/mozilla/java/webclient/src_moz/ns_util.cpp index 30e6900a0e7..72900184b8e 100644 --- a/mozilla/java/webclient/src_moz/ns_util.cpp +++ b/mozilla/java/webclient/src_moz/ns_util.cpp @@ -30,6 +30,20 @@ #include "ns_util.h" +/** + + * a null terminated array of listener interfaces we support. This is + * used in NativeEventThread.cpp nativeAddListener, + * nativeRemoveListener, and in CBrowserContainer.cpp + + */ + +const char *gSupportedListenerInterfaces[] = { + "org.mozilla.webclient.DocumentLoadListener", + "java.awt.event.MouseListener", + nsnull +}; + void util_PostEvent(WebShellInitContext * initContext, PLEvent * event) { PL_ENTER_EVENT_QUEUE_MONITOR(initContext->actionQueue); diff --git a/mozilla/java/webclient/src_moz/ns_util.h b/mozilla/java/webclient/src_moz/ns_util.h index 9f9aebd529c..4ed39fcdc49 100644 --- a/mozilla/java/webclient/src_moz/ns_util.h +++ b/mozilla/java/webclient/src_moz/ns_util.h @@ -118,6 +118,17 @@ enum { kGetDOMWindowError }; +extern const char *gSupportedListenerInterfaces[]; // defined in ns_util.cpp + +// these index into the gSupportedListenerInterfaces array + +typedef enum { + DOCUMENT_LOAD_LISTENER = 0, + MOUSE_LISTENER, + LISTENER_NOT_FOUND +} LISTENER_CLASSES; + + /** * This method calls PL_PostEvent(), diff --git a/mozilla/java/webclient/src_share/jni_util.cpp b/mozilla/java/webclient/src_share/jni_util.cpp index badc3016af8..da6ea15acf8 100644 --- a/mozilla/java/webclient/src_share/jni_util.cpp +++ b/mozilla/java/webclient/src_share/jni_util.cpp @@ -87,6 +87,7 @@ void util_ThrowExceptionToJava (JNIEnv * env, const char * message) void util_SendEventToJava(JNIEnv *yourEnv, jobject nativeEventThread, jobject webclientEventListener, + jstring eventListenerClassName, jlong eventType, jobject eventData) { #ifdef BAL_INTERFACE @@ -113,9 +114,10 @@ void util_SendEventToJava(JNIEnv *yourEnv, jobject nativeEventThread, jclass clazz = env->GetObjectClass(nativeEventThread); jmethodID mid = env->GetMethodID(clazz, "nativeEventOccurred", - "(Lorg/mozilla/webclient/WebclientEventListener;JLjava/lang/Object;)V"); + "(Lorg/mozilla/webclient/WebclientEventListener;Ljava/lang/String;JLjava/lang/Object;)V"); if ( mid != nsnull) { env->CallVoidMethod(nativeEventThread, mid, webclientEventListener, + eventListenerClassName, eventType, eventData); } else { util_LogMessage(3, "cannot call the Java Method!\n"); diff --git a/mozilla/java/webclient/src_share/jni_util.h b/mozilla/java/webclient/src_share/jni_util.h index d8ebaed617b..f566f13a848 100644 --- a/mozilla/java/webclient/src_share/jni_util.h +++ b/mozilla/java/webclient/src_share/jni_util.h @@ -75,6 +75,7 @@ void util_ThrowExceptionToJava (JNIEnv * env, const char * message); void util_SendEventToJava(JNIEnv *env, jobject eventRegistrationImpl, jobject webclientEventListener, + jstring eventListenerClassName, jlong eventType, jobject eventData);