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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user