also modifies EmbeddedMozilla so this code is exercised. I have changed EmbeddedMozilla to be a stub-like class that simply displays a Frame with a single Button, titled "New Window". Pressing this button causes an EMWindow to be created and displayed. EMWindow is basically the former EmbeddedMozilla renamed, with modifications to the WindowListener implementation to call the BrowserControl deallocation method. I've added a delete() method to ImplObect: * I know Java has automatic garbage collection and all, but explicitly * adding a delete method helps the gc algorithm out. <P> * Subclasses should override this and call super.delete() at the end of * their overridden delete() method. * @see org.mozilla.webclient.wrapper_native.ImplObjectNative#delete and ImplObjectNative: * Note how we call super.delete() at the end. THIS IS VERY IMPORTANT. <P> * Also, note how we don't de-allocate nativeWebShell, that is done in * the class that owns the nativeWebShell reference, WindowControlImpl. * ImplObjectNative subclasses that further override delete() are <P> <CODE><PRE> BookmarksImpl.java EventRegistrationImpl.java NativeEventThread.java WindowControlImpl.java </PRE><CODE> <P> * All other ImplObject subclasses don't have any local Ivars and thus * don't need to override delete(). I've added a delete() method to BrowserControlImpl: * Called from BrowserControlFactory.deleteBrowserControl() <P> * The order of deletion of objects is very important! <P> * We don't allow deletion if the Canvas is showing. <P> In BrowserControlImpl's delete(), the important delete()s is for WindowControlImpl: * First, we delete our eventThread, which causes the eventThread to * stop running. Then we call nativeDestroyInitContext(), which * deallocates native resources for this window. As stated above, NativeEventThread.delete() is called: * This is a very delicate method, and possibly subject to race * condition problems. To combat this, our first step is to set our * browserControlCanvas to null, within a synchronized block which * synchronizes on the same object used in the run() method's event * loop. By setting the browserControlCanvas ivar to null, we cause the * run method to return. After all of this deleting, we return from BrowserControlFactory.delete(). git-svn-id: svn://10.0.0.236/trunk@62772 18797224-902f-48f8-a5cc-f745e15eee43
284 lines
9.3 KiB
C++
284 lines
9.3 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is RaptorCanvas.
|
|
*
|
|
* The Initial Developer of the Original Code is Kirk Baker and
|
|
* Ian Wilkinson. Portions created by Kirk Baker and Ian Wilkinson are
|
|
* Copyright (C) 1999 Kirk Baker and Ian Wilkinson. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s): Kirk Baker <kbaker@eb.com>
|
|
* Ian Wilkinson <iw@ennoble.com>
|
|
* Mark Lin <mark.lin@eng.sun.com>
|
|
* Mark Goddard
|
|
* Ed Burns <edburns@acm.org>
|
|
* Ann Sunhachawee
|
|
*/
|
|
|
|
#include "WindowControlImpl.h"
|
|
#include <jni.h>
|
|
#include "jni_util.h"
|
|
#include "nsActions.h"
|
|
|
|
#include "nsIThread.h" // for PRThread
|
|
|
|
#include "nsCOMPtr.h" // to get nsIBaseWindow from webshell
|
|
#include "nsIBaseWindow.h" // to get methods like SetVisibility
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeSetBounds
|
|
(JNIEnv *env, jobject obj, jint webShellPtr, jint x, jint y, jint w, jint h)
|
|
{
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
|
|
if (initContext == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to nativeSetBounds");
|
|
return;
|
|
}
|
|
if (initContext->initComplete) {
|
|
wsResizeEvent * actionEvent =
|
|
new wsResizeEvent(initContext->webShell, x, y, w, h);
|
|
PLEvent * event = (PLEvent*) *actionEvent;
|
|
|
|
::util_PostEvent(initContext, event);
|
|
}
|
|
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeCreateInitContext
|
|
(JNIEnv *env, jobject obj, jint windowPtr, jint x, jint y,
|
|
jint width, jint height, jobject aBrowserControlImpl)
|
|
{
|
|
jobject jobj = obj;
|
|
#ifdef XP_MAC
|
|
WindowPtr pWindow = (WindowPtr) windowPtr;
|
|
Rect webRect = pWindow->portRect;
|
|
// nsIWidget * pWidget = (nsIWidget *) widgetPtr;
|
|
#elif defined(XP_PC)
|
|
// elif defined(XP_WIN)
|
|
HWND parentHWnd = (HWND)windowPtr;
|
|
#elif defined(XP_UNIX)
|
|
GtkWidget * parentHWnd = (GtkWidget *) windowPtr;
|
|
#endif
|
|
|
|
if (parentHWnd == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null window handle passed to raptorWebShellCreate");
|
|
return (jint) 0;
|
|
}
|
|
WebShellInitContext* initContext = new WebShellInitContext;
|
|
|
|
initContext->initComplete = FALSE;
|
|
initContext->initFailCode = 0;
|
|
initContext->parentHWnd = parentHWnd;
|
|
initContext->webShell = nsnull;
|
|
initContext->embeddedThread = nsnull;
|
|
initContext->sessionHistory = nsnull;
|
|
initContext->actionQueue = nsnull;
|
|
initContext->nativeEventThread = nsnull;
|
|
initContext->env = env;
|
|
initContext->stopThread = FALSE;
|
|
initContext->x = x;
|
|
initContext->y = y;
|
|
initContext->w = width;
|
|
initContext->h = height;
|
|
|
|
#ifdef XP_UNIX
|
|
jclass cls = env->GetObjectClass(aBrowserControlImpl); // Get Class for BrowserControlImpl object
|
|
jclass clz = env->FindClass("org/mozilla/webclient/BrowserControlImpl");
|
|
if (nsnull == clz) {
|
|
::util_ThrowExceptionToJava(env, "Exception: Could not find class for BrowserControlImpl");
|
|
return (jint) 0;
|
|
}
|
|
jboolean ans = env->IsInstanceOf(aBrowserControlImpl, clz);
|
|
if (JNI_FALSE == ans) {
|
|
::util_ThrowExceptionToJava(env, "Exception: We have a problem");
|
|
return (jint) 0;
|
|
}
|
|
// Get myCanvas IVar
|
|
jfieldID fid = env->GetFieldID(cls, "myCanvas", "Lorg/mozilla/webclient/BrowserControlCanvas;");
|
|
if (nsnull == fid) {
|
|
::util_ThrowExceptionToJava(env, "Exception: field myCanvas not found in the jobject for BrowserControlImpl");
|
|
return (jint) 0;
|
|
}
|
|
jobject canvasObj = env->GetObjectField(aBrowserControlImpl, fid);
|
|
jclass canvasCls = env->GetObjectClass(canvasObj);
|
|
if (nsnull == canvasCls) {
|
|
::util_ThrowExceptionToJava(env, "Exception: Could Not find Class for CanvasObj");
|
|
return (jint) 0;
|
|
}
|
|
jfieldID gtkfid = env->GetFieldID(canvasCls, "gtkWinPtr", "I");
|
|
if (nsnull == gtkfid) {
|
|
::util_ThrowExceptionToJava(env, "Exception: field gtkWinPtr not found in the jobject for BrowserControlCanvas");
|
|
return (jint) 0;
|
|
}
|
|
jint mozPtr = env->GetIntField(canvasObj, gtkfid);
|
|
initContext->gtkWinPtr = (int) mozPtr;
|
|
#else
|
|
initContext->gtkWinPtr = nsnull;
|
|
#endif
|
|
|
|
return (jint) initContext;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeDestroyInitContext
|
|
(JNIEnv *env, jobject obj, jint webShellPtr)
|
|
{
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
|
|
if (initContext == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to nativeDestroyInitContext");
|
|
return;
|
|
}
|
|
|
|
initContext->parentHWnd = nsnull;
|
|
// ((nsISupports *)initContext->docShell)->Release();
|
|
initContext->docShell = nsnull;
|
|
// ((nsISupports *)initContext->webShell)->Release();
|
|
initContext->webShell = nsnull;
|
|
|
|
//NOTE we don't de-allocate the global session history here.
|
|
initContext->sessionHistory = nsnull;
|
|
|
|
// PENDING(edburns): not sure if these need to be deleted
|
|
initContext->actionQueue = nsnull;
|
|
initContext->embeddedThread = nsnull;
|
|
initContext->env = nsnull;
|
|
initContext->nativeEventThread = nsnull;
|
|
initContext->stopThread = -1;
|
|
initContext->initComplete = FALSE;
|
|
initContext->initFailCode = 0;
|
|
initContext->x = -1;
|
|
initContext->y = -1;
|
|
initContext->w = -1;
|
|
initContext->h = -1;
|
|
initContext->gtkWinPtr = nsnull;
|
|
|
|
delete initContext;
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeMoveWindowTo
|
|
(JNIEnv *env, jobject obj, jint webShellPtr, jint x, jint y)
|
|
{
|
|
JNIEnv * pEnv = env;
|
|
jobject jobj = obj;
|
|
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
|
|
if (initContext == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellMoveTo");
|
|
return;
|
|
}
|
|
|
|
if (initContext->initComplete) {
|
|
wsMoveToEvent * actionEvent = new wsMoveToEvent(initContext->webShell, x, y);
|
|
PLEvent * event = (PLEvent*) *actionEvent;
|
|
|
|
::util_PostEvent(initContext, event);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeRemoveFocus
|
|
(JNIEnv *env, jobject obj, jint webShellPtr)
|
|
{
|
|
JNIEnv * pEnv = env;
|
|
jobject jobj = obj;
|
|
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
|
|
if (initContext == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellRemoveFocus");
|
|
return;
|
|
}
|
|
|
|
if (initContext->initComplete) {
|
|
wsRemoveFocusEvent * actionEvent = new wsRemoveFocusEvent(initContext->webShell);
|
|
PLEvent * event = (PLEvent*) *actionEvent;
|
|
|
|
::util_PostEvent(initContext, event);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeRepaint
|
|
(JNIEnv *env, jobject obj, jint webShellPtr, jboolean forceRepaint)
|
|
{
|
|
JNIEnv * pEnv = env;
|
|
jobject jobj = obj;
|
|
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
|
|
if (initContext == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellRepaint");
|
|
return;
|
|
}
|
|
|
|
if (initContext->initComplete) {
|
|
wsRepaintEvent * actionEvent = new wsRepaintEvent(initContext->webShell, (PRBool) forceRepaint);
|
|
PLEvent * event = (PLEvent*) *actionEvent;
|
|
|
|
::util_PostEvent(initContext, event);
|
|
}
|
|
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeSetVisible
|
|
(JNIEnv *env, jobject obj, jint webShellPtr, jboolean newState)
|
|
{
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
nsCOMPtr<nsIBaseWindow> baseWindow;
|
|
nsresult rv;
|
|
|
|
rv = initContext->webShell->QueryInterface(NS_GET_IID(nsIBaseWindow),
|
|
getter_AddRefs(baseWindow));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
initContext->initFailCode = kShowWebShellError;
|
|
return;
|
|
}
|
|
rv = baseWindow->SetVisibility(JNI_TRUE == newState ? PR_TRUE : PR_FALSE);
|
|
if (NS_FAILED(rv)) {
|
|
initContext->initFailCode = kShowWebShellError;
|
|
::util_ThrowExceptionToJava(env, "Exception: can't SetVisibility");
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeSetFocus
|
|
(JNIEnv *env, jobject obj, jint webShellPtr)
|
|
{
|
|
JNIEnv * pEnv = env;
|
|
jobject jobj = obj;
|
|
|
|
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
|
|
|
if (initContext == nsnull) {
|
|
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellSetFocus");
|
|
return;
|
|
}
|
|
|
|
if (initContext->initComplete) {
|
|
wsSetFocusEvent * actionEvent = new wsSetFocusEvent(initContext->webShell);
|
|
PLEvent * event = (PLEvent*) *actionEvent;
|
|
|
|
::util_PostEvent(initContext, event);
|
|
}
|
|
}
|
|
|
|
|
|
|