From 4f43c30eb193179bb45b6a0e2b46529fbb1d7643 Mon Sep 17 00:00:00 2001 From: "danm%netscape.com" Date: Fri, 4 Jan 2002 02:34:02 +0000 Subject: [PATCH] refuse to spawn new windows if you're currently being destroyed. bug 115969 r=jaggernaut,jst --- xpfe/appshell/src/nsXULWindow.cpp | 14 ++++++++++++-- xpfe/appshell/src/nsXULWindow.h | 17 +++++++++-------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/xpfe/appshell/src/nsXULWindow.cpp b/xpfe/appshell/src/nsXULWindow.cpp index 321f0dff1e73..d1c761577ac3 100644 --- a/xpfe/appshell/src/nsXULWindow.cpp +++ b/xpfe/appshell/src/nsXULWindow.cpp @@ -97,10 +97,12 @@ static NS_DEFINE_CID(kWindowMediatorCID, NS_WINDOWMEDIATOR_CID); nsXULWindow::nsXULWindow() : mChromeTreeOwner(nsnull), mContentTreeOwner(nsnull), mPrimaryContentTreeOwner(nsnull), - mContinueModalLoop(PR_FALSE), mModalStatus(NS_OK), mChromeLoaded(PR_FALSE), + mModalStatus(NS_OK), mContinueModalLoop(PR_FALSE), + mDebuting(PR_FALSE), mChromeLoaded(PR_FALSE), mShowAfterLoad(PR_FALSE), mIntrinsicallySized(PR_FALSE), mCenterAfterLoad(PR_FALSE), mIsHiddenWindow(PR_FALSE), - mHadChildWindow(PR_FALSE), mZlevel(nsIXULWindow::normalZ) + mHadChildWindow(PR_FALSE), mBeingDestroyed(PR_FALSE), + mZlevel(nsIXULWindow::normalZ) { NS_INIT_REFCNT(); } @@ -306,6 +308,7 @@ NS_IMETHODIMP nsXULWindow::Create() NS_IMETHODIMP nsXULWindow::Destroy() { + mBeingDestroyed = PR_TRUE; if(!mWindow) return NS_OK; @@ -1265,6 +1268,13 @@ NS_IMETHODIMP nsXULWindow::CreateNewWindow(PRInt32 aChromeFlags, { NS_ENSURE_ARG_POINTER(_retval); + /* Prevent windows being shut down from opening new windows in their + onUnload handler. This is abused by many websites (you're thinking + porn sites, but I should also mention CNN) and in my opinion just + shouldn't work. If you think it should, see bugzilla bug 115969). */ + if (mBeingDestroyed) + return NS_ERROR_FAILURE; + if (aChromeFlags & nsIWebBrowserChrome::CHROME_OPENAS_CHROME) return CreateNewChromeWindow(aChromeFlags, _retval); return CreateNewContentWindow(aChromeFlags, _retval); diff --git a/xpfe/appshell/src/nsXULWindow.h b/xpfe/appshell/src/nsXULWindow.h index 5dbfa2bd95f9..1924e9a6c5d3 100644 --- a/xpfe/appshell/src/nsXULWindow.h +++ b/xpfe/appshell/src/nsXULWindow.h @@ -111,15 +111,16 @@ protected: nsCOMPtr mPrompter; nsCOMPtr mAuthPrompter; nsVoidArray mContentShells; - PRBool mContinueModalLoop; nsresult mModalStatus; - PRBool mDebuting; // being made visible right now - PRBool mChromeLoaded; // True when chrome has loaded - PRBool mShowAfterLoad; - PRBool mIntrinsicallySized; - PRBool mCenterAfterLoad; - PRBool mIsHiddenWindow; - PRBool mHadChildWindow; + PRPackedBool mContinueModalLoop; + PRPackedBool mDebuting; // being made visible right now + PRPackedBool mChromeLoaded; // True when chrome has loaded + PRPackedBool mShowAfterLoad; + PRPackedBool mIntrinsicallySized; + PRPackedBool mCenterAfterLoad; + PRPackedBool mIsHiddenWindow; + PRPackedBool mHadChildWindow; + PRPackedBool mBeingDestroyed; unsigned long mZlevel; };