From 8f4e04f72fd4e8079b45d921c694afd4e9d69785 Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Sat, 22 Apr 2000 02:01:20 +0000 Subject: [PATCH] a=edburns bug: pressing BACK hangs webclient Files touched File: DocumentLoadEvent.java Status: Locally Modified Made the constants final so they can be used in a switch statement File: EMWindow.java Status: Locally Modified Modified eventDispatched() so it doesn't call any webclient events. This was causing the hang. Took advantage of the newly implemented ability to pass a string from the mozilla event handler into java. File: DocumentLoaderObserverImpl.cpp Status: Locally Modified Create a jstring from the url in the OnStartDocumentLoad event. Pass it on to java. File: jni_util.cpp Status: Locally Modified Wrapped JNU_GetEnv in BAL stuff so it works from Star. File: WebclinetEventListener.java Status: Locally Modified Added comment to eventDispatched. git-svn-id: svn://10.0.0.236/trunk@66829 18797224-902f-48f8-a5cc-f745e15eee43 --- .../mozilla/webclient/DocumentLoadEvent.java | 16 +++---- .../webclient/WebclientEventListener.java | 7 +++ .../org/mozilla/webclient/test/EMWindow.java | 23 ++++++++-- .../src_moz/DocumentLoaderObserverImpl.cpp | 46 +++++++++++++++++-- mozilla/java/webclient/src_moz/jni_util.cpp | 5 +- 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/DocumentLoadEvent.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/DocumentLoadEvent.java index a178e16ea6b..321087e5aee 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/DocumentLoadEvent.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/DocumentLoadEvent.java @@ -25,14 +25,14 @@ package org.mozilla.webclient; public class DocumentLoadEvent extends WebclientEvent { -public static long START_DOCUMENT_LOAD_EVENT_MASK = 1; -public static long END_DOCUMENT_LOAD_EVENT_MASK = 1 << 2; -public static long START_URL_LOAD_EVENT_MASK = 1 << 3; -public static long END_URL_LOAD_EVENT_MASK = 1 << 4; -public static long PROGRESS_URL_LOAD_EVENT_MASK = 1 << 5; -public static long STATUS_URL_LOAD_EVENT_MASK = 1 << 6; -public static long UNKNOWN_CONTENT_EVENT_MASK = 1 << 7; -public static long FETCH_INTERRUPT_EVENT_MASK = 1 << 8; +public static final long START_DOCUMENT_LOAD_EVENT_MASK = 1; +public static final long END_DOCUMENT_LOAD_EVENT_MASK = 1 << 2; +public static final long START_URL_LOAD_EVENT_MASK = 1 << 3; +public static final long END_URL_LOAD_EVENT_MASK = 1 << 4; +public static final long PROGRESS_URL_LOAD_EVENT_MASK = 1 << 5; +public static final long STATUS_URL_LOAD_EVENT_MASK = 1 << 6; +public static final long UNKNOWN_CONTENT_EVENT_MASK = 1 << 7; +public static final long FETCH_INTERRUPT_EVENT_MASK = 1 << 8; // // Constructors diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/WebclientEventListener.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/WebclientEventListener.java index 8c61b6f7472..27859f2f625 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/WebclientEventListener.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/WebclientEventListener.java @@ -25,6 +25,13 @@ package org.mozilla.webclient; public interface WebclientEventListener { +/** + + * Important: do not call any webclient methods during this callback. + * It may caus your app to deadlock. + + */ + public void eventDispatched(WebclientEvent event); } // end of interface WebclientEventListener 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 3271688d64d..bad1ef2f3cd 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 @@ -50,7 +50,7 @@ import org.mozilla.util.Assert; * This is a test application for using the BrowserControl. * - * @version $Id: EMWindow.java,v 1.4 2000-04-20 03:16:15 ashuk%eng.sun.com Exp $ + * @version $Id: EMWindow.java,v 1.5 2000-04-22 02:00:57 edburns%acm.org Exp $ * * @see org.mozilla.webclient.BrowserControlFactory @@ -120,6 +120,8 @@ public class EMWindow extends Frame implements DialogClient, ActionListener, Doc // Create the URL field urlField = new TextField("", 30); urlField.addActionListener(this); + urlField.setText(url); + // Create the buttons sub panel buttonsPanel = new Panel(); @@ -436,13 +438,24 @@ public void dialogCancelled(Dialog d) { // From DocumentLoadListener // +/** + + * Important: do not call any webclient methods during this callback. + * It may caus your app to deadlock. + + */ + public void eventDispatched(WebclientEvent event) { if (event instanceof DocumentLoadEvent) { - String currentURL = currentPage.getCurrentURL(); - System.out.println("debug: edburns: Currently Viewing: " + - currentURL); - urlField.setText(currentURL); + switch ((int) event.getType()) { + case ((int) DocumentLoadEvent.START_DOCUMENT_LOAD_EVENT_MASK): + String currentURL = (String) event.getEventData(); + System.out.println("debug: edburns: Currently Viewing: " + + currentURL); + urlField.setText(currentURL); + break; + } } } diff --git a/mozilla/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp b/mozilla/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp index ae699de3816..6ac2b7c98b4 100644 --- a/mozilla/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp +++ b/mozilla/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp @@ -39,6 +39,8 @@ // end of take this out #endif +#include "prlog.h" // for PR_ASSERT + static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIDocumentLoaderObserverIID, NS_IDOCUMENT_LOADER_OBSERVER_IID); @@ -80,6 +82,9 @@ DocumentLoaderObserverImpl::DocumentLoaderObserverImpl(JNIEnv *env, if (nsnull == gVm) { // declared in jni_util.h ::util_GetJavaVM(env, &gVm); // save this vm reference away for the callback! } +#ifndef BAL_INTERFACE + PR_ASSERT(gVm); +#endif if (-1 == maskValues[0]) { util_InitializeEventMaskValuesFromClass("org/mozilla/webclient/DocumentLoadEvent", @@ -117,9 +122,35 @@ NS_IMETHODIMP DocumentLoaderObserverImpl::OnStartDocumentLoad(nsIDocumentLoader* ("DocumentLoaderObserverImpl.cpp: OnStartDocumentLoad\n")); } #endif + char *urlStr = nsnull; + jobject urlJStr = nsnull; + if (nsnull != aURL) { + + // IMPORTANT: do not use initContext->env here since it comes + // from another thread. Use JNU_GetEnv instead. + + JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); + + aURL->GetSpec(&urlStr); + if (nsnull != urlStr) { + urlJStr = (jobject) ::util_NewStringUTF(env, urlStr); + ::Recycle(urlStr); + } + } util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mTarget, - maskValues[START_DOCUMENT_LOAD_EVENT_MASK], nsnull); + maskValues[START_DOCUMENT_LOAD_EVENT_MASK], urlJStr); + +#ifdef BAL_INTERFACE + // This violates my goal of confining all #ifdef BAL_INTERFACE to + // jni_util files, but this is the only part of the code that knows + // that eventData is a jstring. In java, this will get garbage + // collected, but in non-java contexts, it will not. Thus, we have + // to manually de-allocate it. + if (urlJStr) { + ::util_DeleteStringUTF(mInitContext->env, (jstring) urlJStr); + } +#endif return NS_OK; } @@ -186,8 +217,12 @@ NS_IMETHODIMP DocumentLoaderObserverImpl::OnStatusURLLoad(nsIDocumentLoader* loa } #endif int length = aMsg.Length(); - jstring statusMessage = ::util_NewString(mInitContext->env, - aMsg.GetUnicode(), length); + + // IMPORTANT: do not use initContext->env here since it comes + // from another thread. Use JNU_GetEnv instead. + + JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION_1_2); + jstring statusMessage = ::util_NewString(env, aMsg.GetUnicode(), length); util_SendEventToJava(mInitContext->env, mInitContext->nativeEventThread, mTarget, maskValues[STATUS_URL_LOAD_EVENT_MASK], (jobject) statusMessage); @@ -198,8 +233,9 @@ NS_IMETHODIMP DocumentLoaderObserverImpl::OnStatusURLLoad(nsIDocumentLoader* loa // that eventData is a jstring. In java, this will get garbage // collected, but in non-java contexts, it will not. Thus, we have // to manually de-allocate it. - ::util_DeleteString(mInitContext->env, statusMessage); - + if (statusMessage) { + ::util_DeleteString(mInitContext->env, statusMessage); + } #endif return NS_OK; diff --git a/mozilla/java/webclient/src_moz/jni_util.cpp b/mozilla/java/webclient/src_moz/jni_util.cpp index 139b78b7a8d..61c2e1f7c1e 100644 --- a/mozilla/java/webclient/src_moz/jni_util.cpp +++ b/mozilla/java/webclient/src_moz/jni_util.cpp @@ -453,10 +453,11 @@ JNU_GetEnv(JavaVM *vm, jint version) { // void *result; //vm->GetEnv(&result, version); - JNIEnv *result = nsnull; +#ifdef BAL_INTERFACE +#else vm->AttachCurrentThread((void **)&result, (void *) version); - +#endif return result; }