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)
{
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

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

@ -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: <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)
#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<nsIDOMNode> 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;
}

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

@ -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
//

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

@ -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);

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

@ -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(),

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

@ -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");

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

@ -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);