diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/test/EMWindow.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/test/EMWindow.java index b8f7577894d..5153c6212df 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/test/EMWindow.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/test/EMWindow.java @@ -45,14 +45,13 @@ import org.mozilla.util.Assert; import org.w3c.dom.Document; - /** * * This is a test application for using the BrowserControl. * - * @version $Id: EMWindow.java,v 1.13 2000-06-05 19:11:22 edburns%acm.org Exp $ + * @version $Id: EMWindow.java,v 1.14 2000-06-08 02:16:06 edburns%acm.org Exp $ * * @see org.mozilla.webclient.BrowserControlFactory @@ -236,7 +235,6 @@ public class EMWindow extends Frame implements DialogClient, ActionListener, Doc EventRegistration eventRegistration = (EventRegistration) browserControl.queryInterface(BrowserControl.EVENT_REGISTRATION_NAME); - System.out.println("debug: edburns: adding DocumentLoadListener"); eventRegistration.addDocumentLoadListener(this); eventRegistration.addMouseListener(this); @@ -310,9 +308,7 @@ public void delete() } BrowserControlFactory.deleteBrowserControl(browserControl); browserControl = null; - System.out.println("debug: edburns: about to hide"); this.hide(); - System.out.println("debug: edburns: about to dispose"); this.dispose(); urlField = null; browserCanvas = null; @@ -530,9 +526,11 @@ public void eventDispatched(WebclientEvent event) forwardButton.setEnabled(history.canForward()); statusLabel.setText("Done."); currentDocument = currentPage.getDOM(); + // add the new document to the domViewer if (null != domViewer) { domViewer.setDocument(currentDocument); } + break; } } @@ -544,12 +542,20 @@ public void eventDispatched(WebclientEvent event) public void mouseClicked(java.awt.event.MouseEvent e) { - System.out.println("mouseClicked"); + int modifiers = e.getModifiers(); + if (0 != (modifiers & InputEvent.BUTTON1_MASK)) { + System.out.println("Button1 "); + } + if (0 != (modifiers & InputEvent.BUTTON2_MASK)) { + System.out.println("Button2 "); + } + if (0 != (modifiers & InputEvent.BUTTON3_MASK)) { + System.out.println("Button3 "); + } } public void mouseEntered(java.awt.event.MouseEvent e) { - System.out.println("mouseEntered"); if (e instanceof WCMouseEvent) { WCMouseEvent wcMouseEvent = (WCMouseEvent) e; Properties eventProps = @@ -557,6 +563,18 @@ public void mouseEntered(java.awt.event.MouseEvent e) if (null == eventProps) { return; } + if (e.isAltDown()) { + System.out.println("Alt "); + } + if (e.isControlDown()) { + System.out.println("Ctrl "); + } + if (e.isShiftDown()) { + System.out.println("Shift "); + } + if (e.isMetaDown()) { + System.out.println("Meta "); + } String href = eventProps.getProperty("href"); if (null != href) { // if it's a relative URL @@ -569,7 +587,6 @@ public void mouseEntered(java.awt.event.MouseEvent e) href = currentURL.substring(0, lastSlashIndex) + "/"+ href; } } - System.out.println(href); statusLabel.setText(href); } } @@ -578,19 +595,17 @@ public void mouseEntered(java.awt.event.MouseEvent e) public void mouseExited(java.awt.event.MouseEvent e) { statusLabel.setText(""); - System.out.println("mouseExited"); } public void mousePressed(java.awt.event.MouseEvent e) { - System.out.println("mousePressed"); } public void mouseReleased(java.awt.event.MouseEvent e) { - System.out.println("mouseReleased"); } + // // Package methods // diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/WCMouseListenerImpl.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/WCMouseListenerImpl.java index e7778153e09..e6ba8036e92 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/WCMouseListenerImpl.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/wrapper_native/WCMouseListenerImpl.java @@ -28,11 +28,14 @@ import org.mozilla.util.ParameterCheck; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; +import java.awt.event.InputEvent; import java.awt.Component; import org.mozilla.webclient.WCMouseEvent; import org.mozilla.webclient.WebclientEvent; import org.mozilla.webclient.WebclientEventListener; +import java.util.Properties; + /** * This class wraps the user provided instance of @@ -109,48 +112,90 @@ public void eventDispatched(WebclientEvent event) { ParameterCheck.nonNull(event); WCMouseEvent mouseEvent; - + Properties props = (Properties) event.getEventData(); + int modifiers = 0, x = -1, y = -1, clickCount = 0; + String str; + boolean bool; + if (null != (str = props.getProperty("ClientX"))) { + x = Integer.valueOf(str).intValue(); + } + if (null != (str = props.getProperty("ClientY"))) { + y = Integer.valueOf(str).intValue(); + } + if (null != (str = props.getProperty("ClickCount"))) { + clickCount = Integer.valueOf(str).intValue(); + } + if (null != (str = props.getProperty("Button"))) { + int button = Integer.valueOf(str).intValue(); + if (1 == button) { + modifiers += InputEvent.BUTTON1_MASK; + } + if (2 == button) { + modifiers += InputEvent.BUTTON2_MASK; + } + if (3 == button) { + modifiers += InputEvent.BUTTON3_MASK; + } + } + if (null != (str = props.getProperty("Alt"))) { + bool = Boolean.valueOf(str).booleanValue(); + if (bool) { + modifiers += InputEvent.ALT_MASK; + } + } + if (null != (str = props.getProperty("Ctrl"))) { + bool = Boolean.valueOf(str).booleanValue(); + if (bool) { + modifiers += InputEvent.CTRL_MASK; + } + } + if (null != (str = props.getProperty("Meta"))) { + bool = Boolean.valueOf(str).booleanValue(); + if (bool) { + modifiers += InputEvent.META_MASK; + } + } + if (null != (str = props.getProperty("Shift"))) { + bool = Boolean.valueOf(str).booleanValue(); + if (bool) { + modifiers += InputEvent.SHIFT_MASK; + } + } switch ((int) event.getType()) { case (int) WCMouseEvent.MOUSE_DOWN_EVENT_MASK: mouseEvent = new WCMouseEvent((Component) event.getSource(), MouseEvent.MOUSE_PRESSED, -1, - -1, -1, -1, -1, false, event); + modifiers, x, y, clickCount, false, event); mouseListener.mousePressed(mouseEvent); break; case (int) WCMouseEvent.MOUSE_UP_EVENT_MASK: mouseEvent = new WCMouseEvent((Component) event.getSource(), MouseEvent.MOUSE_RELEASED, -1, - -1, -1, -1, -1, false, event); + modifiers, x, y, clickCount, false, event); mouseListener.mouseReleased(mouseEvent); break; case (int) WCMouseEvent.MOUSE_CLICK_EVENT_MASK: - mouseEvent = - new WCMouseEvent((Component) event.getSource(), - MouseEvent.MOUSE_CLICKED, -1, - -1, -1, -1, 1, false, event); - mouseListener.mouseClicked(mouseEvent); - break; case (int) WCMouseEvent.MOUSE_DOUBLE_CLICK_EVENT_MASK: mouseEvent = new WCMouseEvent((Component) event.getSource(), MouseEvent.MOUSE_CLICKED, -1, - -1, -1, -1, 2, false, event); + modifiers, x, y, clickCount, false, event); mouseListener.mouseClicked(mouseEvent); break; case (int) WCMouseEvent.MOUSE_OVER_EVENT_MASK: mouseEvent = new WCMouseEvent((Component) event.getSource(), MouseEvent.MOUSE_ENTERED, -1, - -1, -1, -1, -1, false, event); + modifiers, x, y, clickCount, false, event); mouseListener.mouseEntered(mouseEvent); break; case (int) WCMouseEvent.MOUSE_OUT_EVENT_MASK: mouseEvent = new WCMouseEvent((Component) event.getSource(), MouseEvent.MOUSE_EXITED, -1, - -1, -1, -1, -1, false, event); + modifiers, x, y, clickCount, false, event); mouseListener.mouseExited(mouseEvent); break; } diff --git a/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.cpp b/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.cpp index e202bc0b554..a9abe92a685 100644 --- a/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.cpp +++ b/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.cpp @@ -79,16 +79,40 @@ static jobject FALSE_VALUE = nsnull; jboolean initPropertiesKeys(); -NS_IMPL_ADDREF(DOMMouseListenerImpl); -NS_IMPL_RELEASE(DOMMouseListenerImpl); +//NS_IMPL_ADDREF(DOMMouseListenerImpl); +//NS_IMPL_RELEASE(DOMMouseListenerImpl); -DOMMouseListenerImpl::DOMMouseListenerImpl(){ +NS_IMETHODIMP_(nsrefcnt) DOMMouseListenerImpl::AddRef() +{ + mRefCnt++; + return mRefCnt; +} + +NS_IMETHODIMP_(nsrefcnt) DOMMouseListenerImpl::Release() +{ + mRefCnt--; + + if (mRefCnt == 0) { + mRefCnt = 1; /* stabilize */ + NS_DELETEXPCOM(this); + return 0; + } + return mRefCnt; +} + + + +DOMMouseListenerImpl::DOMMouseListenerImpl() : mJNIEnv(nsnull), + mInitContext(nsnull), mTarget(nsnull), + inverseDepth(-1), properties(nsnull), currentDOMEvent(nsnull) +{ } DOMMouseListenerImpl::DOMMouseListenerImpl(JNIEnv *env, WebShellInitContext *yourInitContext, jobject yourTarget) : - mJNIEnv(env), mInitContext(yourInitContext), mTarget(yourTarget) + mJNIEnv(env), mInitContext(yourInitContext), mTarget(yourTarget), + inverseDepth(-1), properties(nsnull), currentDOMEvent(nsnull) { if (nsnull == gVm) { // declared in jni_util.h ::util_GetJavaVM(env, &gVm); // save this vm reference away for the callback! @@ -101,7 +125,18 @@ DOMMouseListenerImpl::DOMMouseListenerImpl(JNIEnv *env, util_InitializeEventMaskValuesFromClass("org/mozilla/webclient/WCMouseEvent", maskNames, maskValues); } - mRefCnt = 1; // PENDING(edburns): not sure about how right this is to do. + mRefCnt = 0; // PENDING(edburns): not sure about how right this is to do. +} + +DOMMouseListenerImpl::~DOMMouseListenerImpl() +{ + if (properties) { + JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); + util_DestroyPropertiesObject(env, properties, (jobject) mInitContext); + properties = nsnull; + } + currentDOMEvent = nsnull; + } NS_IMETHODIMP DOMMouseListenerImpl::QueryInterface(REFNSIID aIID, void** aInstance) @@ -134,7 +169,7 @@ nsresult DOMMouseListenerImpl::MouseDown(nsIDOMEvent *aMouseEvent) { #if DEBUG_RAPTOR_CANVAS if (prLogModuleInfo) { - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("!DOMMouseListenerImpl::MouseDown\n")); } #endif @@ -146,7 +181,6 @@ nsresult DOMMouseListenerImpl::MouseDown(nsIDOMEvent *aMouseEvent) mTarget, maskValues[MOUSE_DOWN_EVENT_MASK], properties); - util_DestroyPropertiesObject(mInitContext->env, properties, nsnull); return NS_OK; } @@ -154,7 +188,7 @@ nsresult DOMMouseListenerImpl::MouseUp(nsIDOMEvent *aMouseEvent) { #if DEBUG_RAPTOR_CANVAS if (prLogModuleInfo) { - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("!DOMMouseListenerImpl::MouseUp\n")); } #endif @@ -166,7 +200,6 @@ nsresult DOMMouseListenerImpl::MouseUp(nsIDOMEvent *aMouseEvent) mTarget, maskValues[MOUSE_UP_EVENT_MASK], properties); - util_DestroyPropertiesObject(mInitContext->env, properties, nsnull); return NS_OK; } @@ -174,7 +207,7 @@ nsresult DOMMouseListenerImpl::MouseClick(nsIDOMEvent *aMouseEvent) { #if DEBUG_RAPTOR_CANVAS if (prLogModuleInfo) { - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("!DOMMouseListenerImpl::MouseClick\n")); } #endif @@ -186,7 +219,6 @@ nsresult DOMMouseListenerImpl::MouseClick(nsIDOMEvent *aMouseEvent) mTarget, maskValues[MOUSE_CLICK_EVENT_MASK], properties); - util_DestroyPropertiesObject(mInitContext->env, properties, nsnull); return NS_OK; } @@ -194,7 +226,7 @@ nsresult DOMMouseListenerImpl::MouseDblClick(nsIDOMEvent *aMouseEvent) { #if DEBUG_RAPTOR_CANVAS if (prLogModuleInfo) { - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("!DOMMouseListenerImpl::MouseDoubleClick\n")); } #endif @@ -206,7 +238,6 @@ nsresult DOMMouseListenerImpl::MouseDblClick(nsIDOMEvent *aMouseEvent) mTarget, maskValues[MOUSE_DOUBLE_CLICK_EVENT_MASK], properties); - util_DestroyPropertiesObject(mInitContext->env, properties, nsnull); return NS_OK; } @@ -214,7 +245,7 @@ nsresult DOMMouseListenerImpl::MouseOver(nsIDOMEvent *aMouseEvent) { #if DEBUG_RAPTOR_CANVAS if (prLogModuleInfo) { - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("!DOMMouseListenerImpl::MouseOver\n")); } #endif @@ -226,7 +257,6 @@ nsresult DOMMouseListenerImpl::MouseOver(nsIDOMEvent *aMouseEvent) mTarget, maskValues[MOUSE_OVER_EVENT_MASK], properties); - util_DestroyPropertiesObject(mInitContext->env, properties, nsnull); return NS_OK; } @@ -235,7 +265,7 @@ nsresult DOMMouseListenerImpl::MouseOut(nsIDOMEvent *aMouseEvent) { #if DEBUG_RAPTOR_CANVAS if (prLogModuleInfo) { - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("!DOMMouseListenerImpl::MouseOut\n")); } #endif @@ -247,7 +277,6 @@ nsresult DOMMouseListenerImpl::MouseOut(nsIDOMEvent *aMouseEvent) mTarget, maskValues[MOUSE_OUT_EVENT_MASK], properties); - util_DestroyPropertiesObject(mInitContext->env, properties, nsnull); return NS_OK; } @@ -266,116 +295,142 @@ jobject JNICALL DOMMouseListenerImpl::getPropertiesFromEvent(nsIDOMEvent *event) } inverseDepth = 0; JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); - - properties = util_CreatePropertiesObject(env, nsnull); - dom_iterateToRoot(currentNode, DOMMouseListenerImpl::takeActionOnNode, - (void *)this); - if (properties) { - // Add to the properties table, the modifiers and such - nsCOMPtr mouseEvent; - rv = aMouseEvent->QueryInterface(nsIDOMMouseEvent::GetIID(), - getter_AddRefs(mouseEvent)); - if (NS_FAILED(rv)) { + if (properties) { + util_ClearPropertiesObject(env, properties, (jobject) mInitContext); + } + else { + if (!(properties = + util_CreatePropertiesObject(env, (jobject)mInitContext))) { return properties; } - // initialize the standard properties keys - if (!PROPERTIES_KEYS_INITED) { - // if the initialization failed, don't modify the properties - if (!initPropertiesKeys()) { - return properties; - } - } - PRInt32 intVal; - PRUint16 int16Val; - PRBool boolVal; - char buf[20]; - jstring strVal; - JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); - - // PENDING(edburns): perhaps use a macro to speed this up? - rv = mouseEvent->GetScreenX(&intVal); - if (NS_SUCCEEDED(rv)) { - itoa(intVal, buf, 10); - strVal = ::util_NewStringUTF(env, buf); - ::util_StoreIntoPropertiesObject(env, properties, SCREEN_X_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetScreenY(&intVal); - if (NS_SUCCEEDED(rv)) { - itoa(intVal, buf, 10); - strVal = ::util_NewStringUTF(env, buf); - ::util_StoreIntoPropertiesObject(env, properties, SCREEN_Y_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetClientX(&intVal); - if (NS_SUCCEEDED(rv)) { - itoa(intVal, buf, 10); - strVal = ::util_NewStringUTF(env, buf); - ::util_StoreIntoPropertiesObject(env, properties, CLIENT_X_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetClientY(&intVal); - if (NS_SUCCEEDED(rv)) { - itoa(intVal, buf, 10); - strVal = ::util_NewStringUTF(env, buf); - ::util_StoreIntoPropertiesObject(env, properties, CLIENT_Y_KEY, - (jobject) strVal); - } - - int16Val = 0; - rv = mouseEvent->GetButton(&int16Val); - if (NS_SUCCEEDED(rv)) { - itoa(int16Val, buf, 10); - strVal = ::util_NewStringUTF(env, buf); - ::util_StoreIntoPropertiesObject(env, properties, BUTTON_KEY, - (jobject) strVal); - } - - int16Val = 0; - rv = mouseEvent->GetClickCount(&int16Val); - if (NS_SUCCEEDED(rv)) { - itoa(int16Val, buf, 10); - strVal = ::util_NewStringUTF(env, buf); - ::util_StoreIntoPropertiesObject(env, properties, CLICK_COUNT_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetAltKey(&boolVal); - if (NS_SUCCEEDED(rv)) { - strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; - ::util_StoreIntoPropertiesObject(env, properties, ALT_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetCtrlKey(&boolVal); - if (NS_SUCCEEDED(rv)) { - strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; - ::util_StoreIntoPropertiesObject(env, properties, CTRL_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetShiftKey(&boolVal); - if (NS_SUCCEEDED(rv)) { - strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; - ::util_StoreIntoPropertiesObject(env, properties, SHIFT_KEY, - (jobject) strVal); - } - - rv = mouseEvent->GetMetaKey(&boolVal); - if (NS_SUCCEEDED(rv)) { - strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; - ::util_StoreIntoPropertiesObject(env, properties, META_KEY, - (jobject) strVal); - } - } + dom_iterateToRoot(currentNode, DOMMouseListenerImpl::takeActionOnNode, + (void *)this); + addMouseEventDataToProperties(aMouseEvent); + return properties; } +void JNICALL DOMMouseListenerImpl::addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent) +{ + if (!properties) { + return; + } + nsresult rv; + + // Add modifiers, keys, mouse buttons, etc, to the properties table + nsCOMPtr mouseEvent; + + rv = aMouseEvent->QueryInterface(nsIDOMMouseEvent::GetIID(), + getter_AddRefs(mouseEvent)); + 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; + char buf[20]; + jstring strVal; + JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); + + // PENDING(edburns): perhaps use a macro to speed this up? + rv = mouseEvent->GetScreenX(&intVal); + if (NS_SUCCEEDED(rv)) { + itoa(intVal, buf, 10); + strVal = ::util_NewStringUTF(env, buf); + ::util_StoreIntoPropertiesObject(env, properties, SCREEN_X_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetScreenY(&intVal); + if (NS_SUCCEEDED(rv)) { + itoa(intVal, buf, 10); + strVal = ::util_NewStringUTF(env, buf); + ::util_StoreIntoPropertiesObject(env, properties, SCREEN_Y_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetClientX(&intVal); + if (NS_SUCCEEDED(rv)) { + itoa(intVal, buf, 10); + strVal = ::util_NewStringUTF(env, buf); + ::util_StoreIntoPropertiesObject(env, properties, CLIENT_X_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetClientY(&intVal); + if (NS_SUCCEEDED(rv)) { + itoa(intVal, buf, 10); + strVal = ::util_NewStringUTF(env, buf); + ::util_StoreIntoPropertiesObject(env, properties, CLIENT_Y_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + int16Val = 0; + rv = mouseEvent->GetButton(&int16Val); + if (NS_SUCCEEDED(rv)) { + itoa(int16Val, buf, 10); + strVal = ::util_NewStringUTF(env, buf); + ::util_StoreIntoPropertiesObject(env, properties, BUTTON_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + int16Val = 0; + rv = mouseEvent->GetClickCount(&int16Val); + if (NS_SUCCEEDED(rv)) { + itoa(int16Val, buf, 10); + strVal = ::util_NewStringUTF(env, buf); + ::util_StoreIntoPropertiesObject(env, properties, CLICK_COUNT_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetAltKey(&boolVal); + if (NS_SUCCEEDED(rv)) { + strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; + ::util_StoreIntoPropertiesObject(env, properties, ALT_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetCtrlKey(&boolVal); + if (NS_SUCCEEDED(rv)) { + strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; + ::util_StoreIntoPropertiesObject(env, properties, CTRL_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetShiftKey(&boolVal); + if (NS_SUCCEEDED(rv)) { + strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; + ::util_StoreIntoPropertiesObject(env, properties, SHIFT_KEY, + (jobject) strVal, + (jobject) mInitContext); + } + + rv = mouseEvent->GetMetaKey(&boolVal); + if (NS_SUCCEEDED(rv)) { + strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE; + ::util_StoreIntoPropertiesObject(env, properties, META_KEY, + (jobject) strVal, + (jobject) mInitContext); + } +} + nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr currentNode, void *myObject) { @@ -413,7 +468,7 @@ nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr cur if (prLogModuleInfo) { nsAutoCString nodeInfoCStr(nodeName); - PR_LOG(prLogModuleInfo, 3, ("%s", (const char *)nodeInfoCStr)); + PR_LOG(prLogModuleInfo, 4, ("%s", (const char *)nodeInfoCStr)); } rv = currentNode->GetNodeValue(nodeInfo); @@ -426,7 +481,7 @@ nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr cur if (prLogModuleInfo) { nsAutoCString nodeInfoCStr(nodeValue); - PR_LOG(prLogModuleInfo, 3, ("%s", (const char *)nodeInfoCStr)); + PR_LOG(prLogModuleInfo, 4, ("%s", (const char *)nodeInfoCStr)); } jNodeName = ::util_NewString(env, nodeName.GetUnicode(), @@ -435,7 +490,9 @@ nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr cur nodeValue.Length()); util_StoreIntoPropertiesObject(env, (jobject) curThis->properties, - (jobject) jNodeName, (jobject) jNodeValue); + (jobject) jNodeName, + (jobject) jNodeValue, + (jobject) curThis->mInitContext); if (jNodeName) { ::util_DeleteString(env, jNodeName); } @@ -473,7 +530,7 @@ nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr cur if (prLogModuleInfo) { nsAutoCString nodeInfoCStr(nodeName); - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("attribute[%d], %s", i, (const char *)nodeInfoCStr)); } @@ -487,7 +544,7 @@ nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr cur if (prLogModuleInfo) { nsAutoCString nodeInfoCStr(nodeValue); - PR_LOG(prLogModuleInfo, 3, + PR_LOG(prLogModuleInfo, 4, ("attribute[%d] %s", i,(const char *)nodeInfoCStr)); } jNodeName = ::util_NewString(env, nodeName.GetUnicode(), @@ -496,7 +553,9 @@ nsresult JNICALL DOMMouseListenerImpl::takeActionOnNode(nsCOMPtr cur nodeValue.Length()); util_StoreIntoPropertiesObject(env, (jobject) curThis->properties, - (jobject) jNodeName, (jobject) jNodeValue); + (jobject) jNodeName, + (jobject) jNodeValue, + (jobject) curThis->mInitContext); if (jNodeName) { ::util_DeleteString(env, jNodeName); } @@ -517,41 +576,65 @@ jboolean initPropertiesKeys() { JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); - if (nsnull == (SCREEN_X_KEY = (jobject) ::util_NewStringUTF(env, "ScreenX"))) { + if (nsnull == (SCREEN_X_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "ScreenX")))) { return JNI_FALSE; } - if (nsnull == (SCREEN_Y_KEY = (jobject) ::util_NewStringUTF(env, "ScreenY"))) { + if (nsnull == (SCREEN_Y_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "ScreenY")))) { return JNI_FALSE; } - if (nsnull == (CLIENT_X_KEY = (jobject) ::util_NewStringUTF(env, "ClientX"))) { + if (nsnull == (CLIENT_X_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "ClientX")))) { return JNI_FALSE; } - if (nsnull == (CLIENT_Y_KEY = (jobject) ::util_NewStringUTF(env, "ClientY"))) { + if (nsnull == (CLIENT_Y_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "ClientY")))) { return JNI_FALSE; } - if (nsnull == (ALT_KEY = (jobject) ::util_NewStringUTF(env, "Alt"))) { + if (nsnull == (ALT_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "Alt")))) { return JNI_FALSE; } - if (nsnull == (CTRL_KEY = (jobject) ::util_NewStringUTF(env, "Ctrl"))) { + if (nsnull == (CTRL_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "Ctrl")))) { return JNI_FALSE; } - if (nsnull == (SHIFT_KEY = (jobject) ::util_NewStringUTF(env, "Shift"))) { + if (nsnull == (SHIFT_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "Shift")))) { return JNI_FALSE; } - if (nsnull == (META_KEY = (jobject) ::util_NewStringUTF(env, "Meta"))) { + if (nsnull == (META_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "Meta")))) { return JNI_FALSE; } - if (nsnull == (BUTTON_KEY = (jobject) ::util_NewStringUTF(env, "Button"))) { + if (nsnull == (BUTTON_KEY = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "Button")))) { return JNI_FALSE; } if (nsnull == (CLICK_COUNT_KEY = - ::util_NewStringUTF(env, "ClickCount"))) { + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, + "ClickCount")))) { return JNI_FALSE; } - if (nsnull == (TRUE_VALUE = (jobject) ::util_NewStringUTF(env, "true"))) { + if (nsnull == (TRUE_VALUE = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "true")))) { return JNI_FALSE; } - if (nsnull == (FALSE_VALUE = (jobject) ::util_NewStringUTF(env, "false"))) { + if (nsnull == (FALSE_VALUE = + ::util_NewGlobalRef(env, (jobject) + ::util_NewStringUTF(env, "false")))) { return JNI_FALSE; } diff --git a/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.h b/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.h index 72677674e36..311a2a449da 100644 --- a/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.h +++ b/mozilla/java/webclient/src_moz/DOMMouseListenerImpl.h @@ -75,6 +75,8 @@ static char *maskNames []; DOMMouseListenerImpl(); + virtual ~DOMMouseListenerImpl(); + /* nsIDOMEventListener methods */ nsresult HandleEvent(nsIDOMEvent* aEvent); @@ -96,9 +98,12 @@ static char *maskNames []; // // Local methods // +protected: jobject JNICALL getPropertiesFromEvent(nsIDOMEvent *aMouseEvent); +void JNICALL addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent); + static nsresult JNICALL takeActionOnNode(nsCOMPtr curNode, void *yourObject); diff --git a/mozilla/java/webclient/src_moz/WindowControlImpl.cpp b/mozilla/java/webclient/src_moz/WindowControlImpl.cpp index d37e32d119b..47ad2b5a999 100644 --- a/mozilla/java/webclient/src_moz/WindowControlImpl.cpp +++ b/mozilla/java/webclient/src_moz/WindowControlImpl.cpp @@ -95,6 +95,7 @@ JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI initContext->h = height; initContext->searchContext = nsnull; initContext->currentDocument = nsnull; + initContext->propertiesClass = nsnull; #ifdef XP_UNIX initContext->gtkWinPtr = @@ -149,6 +150,7 @@ Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeDestroyInitCo initContext->gtkWinPtr = nsnull; initContext->searchContext = nsnull; initContext->currentDocument = nsnull; + initContext->propertiesClass = nsnull; delete initContext; } diff --git a/mozilla/java/webclient/src_moz/jni_util.cpp b/mozilla/java/webclient/src_moz/jni_util.cpp index 44f5285820b..dd604a8bcfd 100644 --- a/mozilla/java/webclient/src_moz/jni_util.cpp +++ b/mozilla/java/webclient/src_moz/jni_util.cpp @@ -36,9 +36,9 @@ JavaVM *gVm = nsnull; // declared in ns_globals.h, which is included in // Local cache variables of JNI data items // -static jclass gPropertiesClass = nsnull; static jmethodID gPropertiesInitMethodID = nsnull; static jmethodID gPropertiesSetPropertyMethodID = nsnull; +static jmethodID gPropertiesClearMethodID = nsnull; void util_ThrowExceptionToJava (JNIEnv * env, const char * message) { @@ -368,30 +368,37 @@ void util_SetIntValueForInstance(JNIEnv *env, jobject obj, #endif; } -jobject util_CreatePropertiesObject(JNIEnv *env, jobject reserved_NotUsed) +jobject util_CreatePropertiesObject(JNIEnv *env, jobject initContextObj) { jobject result = nsnull; #ifdef BAL_INTERFACE if (nsnull != externalCreatePropertiesObject) { - result = externalCreatePropertiesObject(env, reserved_NotUsed); + result = externalCreatePropertiesObject(env, initContextObj); } #else - // For some reason, we have to do FindClass each time. If we try to - // cache the class, it crashes. I think this may have something to - // do with threading issues. - if (nsnull == (gPropertiesClass - = ::util_FindClass(env, "java/util/Properties"))) { - return result; - } - - if (nsnull == gPropertiesInitMethodID) { - if (nsnull == (gPropertiesInitMethodID = - env->GetMethodID(gPropertiesClass, "", "()V"))) { + PR_ASSERT(initContextObj); + WebShellInitContext *initContext = (WebShellInitContext *) initContextObj; + + if (nsnull == initContext->propertiesClass) { + if (nsnull == (initContext->propertiesClass = + ::util_FindClass(env, "java/util/Properties"))) { return result; } } - result = env->NewObject(gPropertiesClass, gPropertiesInitMethodID); + if (nsnull == gPropertiesInitMethodID) { + PR_ASSERT(initContext->propertiesClass); + if (nsnull == (gPropertiesInitMethodID = + env->GetMethodID(initContext->propertiesClass, + "", "()V"))) { + return result; + } + } + PR_ASSERT(gPropertiesInitMethodID); + + result = ::util_NewGlobalRef(env, + env->NewObject(initContext->propertiesClass, + gPropertiesInitMethodID)); #endif return result; @@ -406,21 +413,52 @@ void util_DestroyPropertiesObject(JNIEnv *env, jobject propertiesObject, reserved_NotUsed); } #else + ::util_DeleteGlobalRef(env, propertiesObject); +#endif +} + +void util_ClearPropertiesObject(JNIEnv *env, jobject propertiesObject, + jobject initContextObj) +{ +#ifdef BAL_INTERFACE + if (nsnull != externalClearPropertiesObject) { + externalClearPropertiesObject(env, propertiesObject, initContextObj); + } +#else + PR_ASSERT(initContextObj); + WebShellInitContext *initContext = (WebShellInitContext *) initContextObj; + + if (nsnull == gPropertiesClearMethodID) { + PR_ASSERT(initContext->propertiesClass); + if (nsnull == (gPropertiesClearMethodID = + env->GetMethodID(initContext->propertiesClass, "clear", "()V"))) { + return; + } + } + PR_ASSERT(gPropertiesClearMethodID); + env->CallVoidMethod(propertiesObject, gPropertiesClearMethodID); + + return; #endif } void util_StoreIntoPropertiesObject(JNIEnv *env, jobject propertiesObject, - jobject name, jobject value) + jobject name, jobject value, + jobject initContextObj) { #ifdef BAL_INTERFACE if (nsnull != externalStoreIntoPropertiesObject) { - externalStoreIntoPropertiesObject(env, propertiesObject, name, value); + externalStoreIntoPropertiesObject(env, propertiesObject, name, value, + initContextObj); } #else + PR_ASSERT(initContextObj); + WebShellInitContext *initContext = (WebShellInitContext *) initContextObj; + if (nsnull == gPropertiesSetPropertyMethodID) { - PR_ASSERT(gPropertiesClass); + PR_ASSERT(initContext->propertiesClass); if (nsnull == (gPropertiesSetPropertyMethodID = - env->GetMethodID(gPropertiesClass, + env->GetMethodID(initContext->propertiesClass, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"))) { return; diff --git a/mozilla/java/webclient/src_moz/jni_util.h b/mozilla/java/webclient/src_moz/jni_util.h index ab236045030..cf2947d2406 100644 --- a/mozilla/java/webclient/src_moz/jni_util.h +++ b/mozilla/java/webclient/src_moz/jni_util.h @@ -86,6 +86,7 @@ struct WebShellInitContext { int gtkWinPtr; nsCOMPtr searchContext; nsCOMPtr currentDocument; + jclass propertiesClass; }; enum { @@ -202,6 +203,15 @@ jobject util_CreatePropertiesObject(JNIEnv *env, jobject reserved_NotUsed); void util_DestroyPropertiesObject(JNIEnv *env, jobject propertiesObject, jobject reserved_NotUsed); +/** + + * A JNI wrapper to clear the object from CreatePropertiesObject + + */ + +void util_ClearPropertiesObject(JNIEnv *env, jobject propertiesObject, + jobject reserved_NotUsed); + /** * A JNI wrapper for storing a name/value pair into the Properties @@ -210,7 +220,8 @@ void util_DestroyPropertiesObject(JNIEnv *env, jobject propertiesObject, */ void util_StoreIntoPropertiesObject(JNIEnv *env, jobject propertiesObject, - jobject name, jobject value); + jobject name, jobject value, + jobject reserved); // diff --git a/mozilla/java/webclient/src_moz/jni_util_export.cpp b/mozilla/java/webclient/src_moz/jni_util_export.cpp index 58e38780455..4a918ecc3f3 100644 --- a/mozilla/java/webclient/src_moz/jni_util_export.cpp +++ b/mozilla/java/webclient/src_moz/jni_util_export.cpp @@ -44,6 +44,8 @@ fpCreatePropertiesObjectType externalCreatePropertiesObject = nsnull; // jni_uti fpDestroyPropertiesObjectType externalDestroyPropertiesObject = nsnull; // jni_util_export.h +fpClearPropertiesObjectType externalClearPropertiesObject = nsnull; // jni_util_export.h + fpStoreIntoPropertiesObjectType externalStoreIntoPropertiesObject = nsnull; // jni_util_export.h JNIEXPORT const char * JNICALL util_GetStringUTFChars(JNIEnv *env, @@ -203,6 +205,11 @@ JNIEXPORT void JNICALL util_SetDestroyPropertiesObjectFunction(fpDestroyProperti externalDestroyPropertiesObject = fp; } +JNIEXPORT void JNICALL util_SetClearPropertiesObjectFunction(fpClearPropertiesObjectType fp) +{ + externalClearPropertiesObject = fp; +} + JNIEXPORT void JNICALL util_SetStoreIntoPropertiesObjectFunction(fpStoreIntoPropertiesObjectType fp) { externalStoreIntoPropertiesObject = fp; diff --git a/mozilla/java/webclient/src_moz/jni_util_export.h b/mozilla/java/webclient/src_moz/jni_util_export.h index 4f419728ed4..41eb2bb109d 100644 --- a/mozilla/java/webclient/src_moz/jni_util_export.h +++ b/mozilla/java/webclient/src_moz/jni_util_export.h @@ -173,6 +173,19 @@ typedef JNIEXPORT jobject (JNICALL * fpCreatePropertiesObjectType) typedef JNIEXPORT void (JNICALL * fpDestroyPropertiesObjectType) (JNIEnv *env, jobject propertiesObject, jobject reserved_NotUsed); +/** + + * Called when webclient wants to clear a "Properties" object it created + * with fpCreatePropertiesObject + + * @param propertiesObject the propertiesObject created with + * fpCreatePropertiesObject + + */ + +typedef JNIEXPORT void (JNICALL * fpClearPropertiesObjectType) + (JNIEnv *env, jobject propertiesObject, jobject reserved_NotUsed); + /** * Called after webclient has called fpCreatePropertiesObjectType when @@ -189,7 +202,8 @@ typedef JNIEXPORT void (JNICALL * fpDestroyPropertiesObjectType) */ typedef JNIEXPORT void (JNICALL * fpStoreIntoPropertiesObjectType) - (JNIEnv *env, jobject propertiesObject, jobject name, jobject value); + (JNIEnv *env, jobject propertiesObject, jobject name, jobject value, + jobject reserved); /** @@ -241,6 +255,16 @@ JNIEXPORT void JNICALL util_SetCreatePropertiesObjectFunction(fpCreateProperties JNIEXPORT void JNICALL util_SetDestroyPropertiesObjectFunction(fpDestroyPropertiesObjectType fp); +/** + + * This function must be called at app initialization. + + * @see fpDestroyPropertiesObjectType + + */ + +JNIEXPORT void JNICALL util_SetClearPropertiesObjectFunction(fpDestroyPropertiesObjectType fp); + /** * This function must be called at app initialization. @@ -303,6 +327,16 @@ extern fpCreatePropertiesObjectType externalCreatePropertiesObject; extern fpDestroyPropertiesObjectType externalDestroyPropertiesObject; +/** + + * defined in jni_util_export.cpp + + * The function pointer set with util_SetClearPropertiesObjectFunction + + */ + +extern fpClearPropertiesObjectType externalClearPropertiesObject; + /** * defined in jni_util_export.cpp