This checkin has the basic functionality of NewWindowListener

re-implemented using the new event model.  It's a bit cleaner.

Next step is to uncomment the selection check at the end of
WindowCreatorTest.java.  This code currently causes the VM to crash.  I
also plan to do some testing on the chrome flags.

M classes_spec/org/mozilla/webclient/EventRegistration2.java

- deprecate {add,remove}NewWindowListener(), replace with
  setNewWindowListener().

M classes_spec/org/mozilla/webclient/NewWindowEvent.java

- added BrowserControl property, which the user sets into the event.

M classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java

- change newWindowListeners List ivar to newWindowListener ivar.

- fix {add,remove}NewWindowListener() to leverage setNewWindowListener()

- change nativeEventOccurred() to return an int instead of void.

- add boolean property nativeSetNewWindowListenerAttached()

M classes_spec/org/mozilla/webclient/impl/wrapper_native/NativeEventThread.java

- modify pushBlockingWCRunnable() to execute the runnable right away if
  we're already on the NativeEventThread.  This is necessary to allow
  re-entrancy.

M src_moz/EmbedEventListener.cpp
M src_moz/EmbedEventListener.h

- expose the mEventRegistration ivar via a getter.

M src_moz/EventRegistrationImpl.cpp
M src_moz/NativeBrowserControl.cpp
M src_moz/NativeBrowserControl.h

- add nativeSetNewWindowListenerAttached(), which calls through and sets
  it on the NativeBrowserControl.

M src_moz/WindowCreator.cpp

- implement CreateChromeWindow2, which is called when the browser needs
  a new window.

M src_share/jni_util.cpp
M src_share/jni_util.h

- change util_SendEventToJava() to return int.

M test/automated/src/classes/org/mozilla/webclient/WindowCreatorTest.java


git-svn-id: svn://10.0.0.236/trunk@167943 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
edburns%acm.org
2005-01-18 15:20:52 +00:00
parent 2a8426d8bb
commit 8a9f83057f
15 changed files with 257 additions and 90 deletions

View File

@@ -25,6 +25,10 @@
#include "nsIWebBrowser.h"
#include "WindowCreator.h"
#include "NativeBrowserControl.h"
#include "EmbedEventListener.h"
#include "EmbedWindow.h"
NativeBrowserControl* gNewWindowNativeBCPtr;
NS_IMPL_ISUPPORTS2(WindowCreator, nsIWindowCreator, nsIWindowCreator2)
@@ -87,37 +91,40 @@ WindowCreator::CreateChromeWindow2(nsIWebBrowserChrome *parent,
nsIURI *uri, PRBool *cancel,
nsIWebBrowserChrome **_retval)
{
nsresult rv = NS_OK;
PRBool hasNewWindowListener = PR_FALSE;
NativeBrowserControl *newNativeBrowserControl = nsnull;
jint newNativeBCPtr = -1;
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
rv = mNativeBCPtr->GetNewWindowListenerAttached(&hasNewWindowListener);
if (NS_FAILED(rv) || !hasNewWindowListener) {
return rv;
}
nsCOMPtr<nsIWebBrowser> webBrowser;
parent->GetWebBrowser(getter_AddRefs(webBrowser));
nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(webBrowser));
if (nsnull != baseWindow) {
/*
Block this thread.
Call back into java and ask the user to create a top level
window and hand it, or an added child of it, to us. Call this
thing the userWindow.
Create a new BrowserControl, get its BrowserControlCanvas and
make it be a child of the userWindow.
Set the userWindow and the BrowserControlCanvas to visible ==
true. This is necessary to get the cause the underlying
mozilla window to be created.
java returns the C++ nativeBrowserControl to us. Cast it to a
native NativeBrowserControl C++ object instance. If the
nsIURI is non-null, cause the new window to navigate to that
URI. Return the NativeBrowserControl's EmbedWindow instance,
which is an impl of nsIWebBrowserChrome.
I'm not sure if it's safe to do all this on the same thread on
which mozilla calls us. I hope so.
*/
jobject eventRegistration = nsnull;
rv = mNativeBCPtr->mEventListener->GetEventRegistration(&eventRegistration);
if (NS_FAILED(rv) || !eventRegistration) {
return rv;
}
printf("debug: edburns: can QI to baseWindow\n\n");
// send this event to allow the user to create the new BrowserControl
newNativeBCPtr = util_SendEventToJava(nsnull,
eventRegistration,
NEW_WINDOW_LISTENER_CLASSNAME,
chromeFlags, nsnull);
newNativeBrowserControl = (NativeBrowserControl *) newNativeBCPtr;
PR_ASSERT(nsnull != newNativeBrowserControl);
nsCOMPtr<nsIWebBrowserChrome> webChrome(newNativeBrowserControl->mWindow);
*_retval = webChrome;
NS_IF_ADDREF(*_retval);
}
return NS_OK;