hooking up 'close' xul event handler. bug 13695. r:hyatt@netscape.com

git-svn-id: svn://10.0.0.236/trunk@54951 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
danm%netscape.com
1999-12-01 22:38:06 +00:00
parent 9bfb5a41b9
commit 22cd501286
6 changed files with 106 additions and 48 deletions

View File

@@ -479,6 +479,15 @@ nsWebShellWindow::HandleEvent(nsGUIEvent *aEvent)
result = nsEventStatus_eConsumeNoDefault;
break;
}
case NS_XUL_CLOSE: {
void* data;
nsWebShellWindow *win;
aEvent->widget->GetClientData(data);
win = NS_REINTERPRET_CAST(nsWebShellWindow *, data);
if (!win->ExecuteCloseHandler())
win->Close();
break;
}
/*
* Notify the ApplicationShellService that the window is being closed...
*/
@@ -1123,8 +1132,7 @@ nsWebShellWindow::ConvertWebShellToDOMWindow(nsIWebShell* aShell, nsIDOMWindow**
nsCOMPtr<nsIDOMWindow> newDOMWindow;
newContextOwner = do_QueryInterface(aShell);
if (newContextOwner)
{
if (newContextOwner) {
if (NS_FAILED(rv = newContextOwner->GetScriptGlobalObject(getter_AddRefs(newGlobalObject)))) {
NS_ERROR("Unable to retrieve global object.");
return rv;
@@ -2398,6 +2406,48 @@ void nsWebShellWindow::LoadContentAreas() {
}
}
/**
* ExecuteCloseHandler - Run the close handler, if any.
* @return PR_TRUE iff we found a close handler to run.
*/
PRBool nsWebShellWindow::ExecuteCloseHandler()
{
/* If the event handler closes this window -- a likely scenario --
things get deleted out of order without this death grip.
(The problem may be the death grip in nsWindow::windowProc,
which forces this window's widget to remain alive longer
than it otherwise would.) */
nsCOMPtr<nsIWebShellWindow> kungFuDeathGrip(this);
nsresult rv;
nsCOMPtr<nsIScriptContextOwner> contextOwner;
nsCOMPtr<nsIScriptGlobalObject> globalObject;
contextOwner = do_QueryInterface(mWebShell);
if (contextOwner) {
if (NS_SUCCEEDED(contextOwner->GetScriptGlobalObject(getter_AddRefs(globalObject))) && globalObject) {
nsCOMPtr<nsIContentViewer> contentViewer;
if (NS_SUCCEEDED(mWebShell->GetContentViewer(getter_AddRefs(contentViewer)))) {
nsCOMPtr<nsIDocumentViewer> docViewer;
nsCOMPtr<nsIPresContext> presContext;
docViewer = do_QueryInterface(contentViewer);
if (NS_SUCCEEDED(docViewer->GetPresContext(*getter_AddRefs(presContext)))) {
nsEventStatus status = nsEventStatus_eIgnore;
nsMouseEvent event;
event.eventStructType = NS_EVENT;
event.message = NS_XUL_CLOSE;
rv = globalObject->HandleDOMEvent(presContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status);
if (NS_FAILED(rv) || status == nsEventStatus_eConsumeNoDefault)
return PR_TRUE;
// else fall through and return PR_FALSE
}
}
}
}
return PR_FALSE;
} // ExecuteCloseHandler
//----------------------------------------------------------------
//-- nsIDocumentObserver
//----------------------------------------------------------------