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: <P>

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

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

 * 3. add a jstring to the string constant list in
 * CBrowserContainer.cpp, below.

 * 4. Initialize this jstring constant in CBrowserContainer.cpp
 * initStringConstants() <P>

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

You have to clobber_all in webclient after this change.
This commit is contained in:
edburns%acm.org 2000-08-10 21:38:52 +00:00
Родитель 20e4421fed
Коммит 0a19898c15
7 изменённых файлов: 100 добавлений и 38 удалений

Просмотреть файл

@ -351,20 +351,22 @@ void removeListener(WCEventListenerWrapper newListener)
*/ */
void nativeEventOccurred(WebclientEventListener target, long eventType, void nativeEventOccurred(WebclientEventListener target,
String targetClassName, long eventType,
Object eventData) Object eventData)
{ {
ParameterCheck.nonNull(target); ParameterCheck.nonNull(target);
ParameterCheck.nonNull(targetClassName);
Assert.assert(-1 != nativeWebShell); Assert.assert(-1 != nativeWebShell);
Assert.assert(null != windowControl); Assert.assert(null != windowControl);
WebclientEvent event = null; WebclientEvent event = null;
if (target instanceof DocumentLoadListener) { if (DocumentLoadListener.class.getName().equals(targetClassName)) {
event = new DocumentLoadEvent(this, eventType, eventData); event = new DocumentLoadEvent(this, eventType, eventData);
} }
else if (target instanceof MouseListener) { else if (MouseListener.class.getName().equals(targetClassName)) {
Assert.assert(target instanceof WCMouseListenerImpl); Assert.assert(target instanceof WCMouseListenerImpl);
// We create a plain vanilla WebclientEvent, which the // We create a plain vanilla WebclientEvent, which the

Просмотреть файл

@ -61,7 +61,7 @@ char *CBrowserContainer::DOMMouseListener_maskNames[] = {
nsnull nsnull
}; };
static jboolean PROPERTIES_KEYS_INITED = JNI_FALSE; static jboolean STRING_CONSTANTS_INITED = JNI_FALSE;
static jobject SCREEN_X_KEY = nsnull; static jobject SCREEN_X_KEY = nsnull;
static jobject SCREEN_Y_KEY = nsnull; static jobject SCREEN_Y_KEY = nsnull;
static jobject CLIENT_X_KEY = nsnull; static jobject CLIENT_X_KEY = nsnull;
@ -77,6 +77,36 @@ static jobject FALSE_VALUE = nsnull;
static jobject ONE_VALUE = nsnull; static jobject ONE_VALUE = nsnull;
static jobject TWO_VALUE = nsnull; static jobject TWO_VALUE = nsnull;
/**
* How to create a new listener type on the native side: <P>
* 1. add an entry in the gSupportedListenerInterfaces array defined in
* ns_util.cpp <P>
* 2. add a corresponding entry in the LISTENER_CLASSES enum in
* ns_util.h <P>
* 3. add a jstring to the string constant list in
* CBrowserContainer.cpp, below.
* 4. Initialize this jstring constant in CBrowserContainer.cpp
* initStringConstants() <P>
* 5. add an entry to the switch statement in NativeEventThread.cpp
* native{add,remove}Listener <P>
*/
/**
* 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) #if defined(XP_UNIX) || defined(XP_MAC) || defined(XP_BEOS)
#define WC_ITOA(intVal, buf, radix) sprintf(buf, "%d", intVal) #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, CBrowserContainer::CBrowserContainer(nsIWebBrowser *pOwner, JNIEnv *env,
WebShellInitContext *yourInitContext) : WebShellInitContext *yourInitContext) :
@ -103,6 +133,10 @@ CBrowserContainer::CBrowserContainer(nsIWebBrowser *pOwner, JNIEnv *env,
if (nsnull == gVm) { // declared in ../src_share/jni_util.h if (nsnull == gVm) { // declared in ../src_share/jni_util.h
::util_GetJavaVM(env, &gVm); // save this vm reference away for the callback! ::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, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mDocTarget, mInitContext->nativeEventThread, mDocTarget,
DOCUMENT_LOAD_LISTENER_CLASSNAME,
DocumentLoader_maskValues[START_DOCUMENT_LOAD_EVENT_MASK], DocumentLoader_maskValues[START_DOCUMENT_LOAD_EVENT_MASK],
urlJStr); urlJStr);
@ -749,6 +784,7 @@ CBrowserContainer::OnEndDocumentLoad(nsIDocumentLoader* loader, nsIChannel *aCha
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mDocTarget, mInitContext->nativeEventThread, mDocTarget,
DOCUMENT_LOAD_LISTENER_CLASSNAME,
DocumentLoader_maskValues[END_DOCUMENT_LOAD_EVENT_MASK], DocumentLoader_maskValues[END_DOCUMENT_LOAD_EVENT_MASK],
nsnull); nsnull);
@ -773,6 +809,7 @@ CBrowserContainer::OnStartURLLoad(nsIDocumentLoader* loader, nsIChannel* aChanne
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mDocTarget, mInitContext->nativeEventThread, mDocTarget,
DOCUMENT_LOAD_LISTENER_CLASSNAME,
DocumentLoader_maskValues[START_URL_LOAD_EVENT_MASK], DocumentLoader_maskValues[START_URL_LOAD_EVENT_MASK],
nsnull); nsnull);
@ -795,6 +832,7 @@ CBrowserContainer::OnProgressURLLoad(nsIDocumentLoader* loader, nsIChannel* aCha
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mDocTarget, mInitContext->nativeEventThread, mDocTarget,
DOCUMENT_LOAD_LISTENER_CLASSNAME,
DocumentLoader_maskValues[PROGRESS_URL_LOAD_EVENT_MASK], DocumentLoader_maskValues[PROGRESS_URL_LOAD_EVENT_MASK],
nsnull); nsnull);
@ -829,6 +867,7 @@ CBrowserContainer::OnStatusURLLoad(nsIDocumentLoader* loader,
util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread,
mDocTarget, mDocTarget,
DOCUMENT_LOAD_LISTENER_CLASSNAME,
DocumentLoader_maskValues[STATUS_URL_LOAD_EVENT_MASK], DocumentLoader_maskValues[STATUS_URL_LOAD_EVENT_MASK],
(jobject) statusMessage); (jobject) statusMessage);
@ -856,6 +895,7 @@ CBrowserContainer::OnEndURLLoad(nsIDocumentLoader* loader, nsIChannel* channel,
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mDocTarget, mInitContext->nativeEventThread, mDocTarget,
DOCUMENT_LOAD_LISTENER_CLASSNAME,
DocumentLoader_maskValues[END_URL_LOAD_EVENT_MASK], nsnull); DocumentLoader_maskValues[END_URL_LOAD_EVENT_MASK], nsnull);
return NS_OK; return NS_OK;
@ -881,6 +921,7 @@ CBrowserContainer::MouseDown(nsIDOMEvent* aMouseEvent)
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mInitContext->nativeEventThread,
mMouseTarget, mMouseTarget,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_DOWN_EVENT_MASK], DOMMouseListener_maskValues[MOUSE_DOWN_EVENT_MASK],
properties); properties);
return NS_OK; return NS_OK;
@ -899,6 +940,7 @@ CBrowserContainer::MouseUp(nsIDOMEvent* aMouseEvent)
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mInitContext->nativeEventThread,
mMouseTarget, mMouseTarget,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_UP_EVENT_MASK], DOMMouseListener_maskValues[MOUSE_UP_EVENT_MASK],
properties); properties);
return NS_OK; return NS_OK;
@ -922,6 +964,7 @@ CBrowserContainer::MouseClick(nsIDOMEvent* aMouseEvent)
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mInitContext->nativeEventThread,
mMouseTarget, mMouseTarget,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_CLICK_EVENT_MASK], DOMMouseListener_maskValues[MOUSE_CLICK_EVENT_MASK],
properties); properties);
return NS_OK; return NS_OK;
@ -946,6 +989,7 @@ CBrowserContainer::MouseDblClick(nsIDOMEvent* aMouseEvent)
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mInitContext->nativeEventThread,
mMouseTarget, mMouseTarget,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_DOUBLE_CLICK_EVENT_MASK], DOMMouseListener_maskValues[MOUSE_DOUBLE_CLICK_EVENT_MASK],
properties); properties);
return NS_OK; return NS_OK;
@ -964,6 +1008,7 @@ CBrowserContainer::MouseOver(nsIDOMEvent* aMouseEvent)
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mInitContext->nativeEventThread,
mMouseTarget, mMouseTarget,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_OVER_EVENT_MASK], DOMMouseListener_maskValues[MOUSE_OVER_EVENT_MASK],
properties); properties);
return NS_OK; return NS_OK;
@ -982,6 +1027,7 @@ CBrowserContainer::MouseOut(nsIDOMEvent* aMouseEvent)
util_SendEventToJava(mInitContext->env, util_SendEventToJava(mInitContext->env,
mInitContext->nativeEventThread, mInitContext->nativeEventThread,
mMouseTarget, mMouseTarget,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_OUT_EVENT_MASK], DOMMouseListener_maskValues[MOUSE_OUT_EVENT_MASK],
properties); properties);
return NS_OK; return NS_OK;
@ -1135,7 +1181,8 @@ jobject JNICALL CBrowserContainer::getPropertiesFromEvent(nsIDOMEvent *event)
void JNICALL CBrowserContainer::addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent) void JNICALL CBrowserContainer::addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent)
{ {
if (!properties) { // if the initialization failed, don't modify the properties
if (!properties || !STRING_CONSTANTS_INITED) {
return; return;
} }
nsresult rv; nsresult rv;
@ -1148,13 +1195,7 @@ void JNICALL CBrowserContainer::addMouseEventDataToProperties(nsIDOMEvent *aMous
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return; return;
} }
// initialize the standard properties keys
if (!PROPERTIES_KEYS_INITED) {
// if the initialization failed, don't modify the properties
if (!initPropertiesKeys()) {
return;
}
}
PRInt32 intVal; PRInt32 intVal;
PRUint16 int16Val; PRUint16 int16Val;
PRBool boolVal; PRBool boolVal;
@ -1394,7 +1435,7 @@ nsresult JNICALL CBrowserContainer::takeActionOnNode(nsCOMPtr<nsIDOMNode> curren
// Local functions // Local functions
// //
jboolean initPropertiesKeys() jboolean initStringConstants()
{ {
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2);
@ -1469,6 +1510,18 @@ jboolean initPropertiesKeys()
::util_NewStringUTF(env, "2")))) { ::util_NewStringUTF(env, "2")))) {
return JNI_FALSE; 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;
} }

Просмотреть файл

@ -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_DOCSHELL_PROGID = "component://netscape/docshell/html";
//static const char *NS_WEBBROWSER_PROGID = "component://netscape/embedding/browser/nsWebBrowser"; //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 #ifdef XP_PC
@ -160,27 +160,6 @@ char * errorMessages[] = {
"Unable to show the WebShell." "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 // JNI methods
// //

Просмотреть файл

@ -30,6 +30,20 @@
#include "ns_util.h" #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) void util_PostEvent(WebShellInitContext * initContext, PLEvent * event)
{ {
PL_ENTER_EVENT_QUEUE_MONITOR(initContext->actionQueue); PL_ENTER_EVENT_QUEUE_MONITOR(initContext->actionQueue);

Просмотреть файл

@ -118,6 +118,17 @@ enum {
kGetDOMWindowError 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(), * This method calls PL_PostEvent(),

Просмотреть файл

@ -87,6 +87,7 @@ void util_ThrowExceptionToJava (JNIEnv * env, const char * message)
void util_SendEventToJava(JNIEnv *yourEnv, jobject nativeEventThread, void util_SendEventToJava(JNIEnv *yourEnv, jobject nativeEventThread,
jobject webclientEventListener, jobject webclientEventListener,
jstring eventListenerClassName,
jlong eventType, jobject eventData) jlong eventType, jobject eventData)
{ {
#ifdef BAL_INTERFACE #ifdef BAL_INTERFACE
@ -113,9 +114,10 @@ void util_SendEventToJava(JNIEnv *yourEnv, jobject nativeEventThread,
jclass clazz = env->GetObjectClass(nativeEventThread); jclass clazz = env->GetObjectClass(nativeEventThread);
jmethodID mid = env->GetMethodID(clazz, "nativeEventOccurred", 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) { if ( mid != nsnull) {
env->CallVoidMethod(nativeEventThread, mid, webclientEventListener, env->CallVoidMethod(nativeEventThread, mid, webclientEventListener,
eventListenerClassName,
eventType, eventData); eventType, eventData);
} else { } else {
util_LogMessage(3, "cannot call the Java Method!\n"); util_LogMessage(3, "cannot call the Java Method!\n");

Просмотреть файл

@ -75,6 +75,7 @@ void util_ThrowExceptionToJava (JNIEnv * env, const char * message);
void util_SendEventToJava(JNIEnv *env, jobject eventRegistrationImpl, void util_SendEventToJava(JNIEnv *env, jobject eventRegistrationImpl,
jobject webclientEventListener, jobject webclientEventListener,
jstring eventListenerClassName,
jlong eventType, jlong eventType,
jobject eventData); jobject eventData);