Bug 968804 - Part b: Add outer window assertions to {Can,Force,Final}Close; r=peterv

This commit is contained in:
Ms2ger 2014-05-20 21:50:58 +02:00
parent d02b9c0ccb
commit 529d64e30b
4 changed files with 24 additions and 14 deletions

View File

@ -8218,8 +8218,11 @@ public:
bool
nsGlobalWindow::CanClose()
{
if (!mDocShell)
MOZ_ASSERT(IsOuterWindow());
if (!mDocShell) {
return true;
}
// Ask the content viewer whether the toplevel window can close.
// If the content viewer returns false, it is responsible for calling
@ -8313,7 +8316,7 @@ nsGlobalWindow::Close(ErrorResult& aError)
return;
}
aError = FinalClose();
FinalClose();
}
NS_IMETHODIMP
@ -8325,32 +8328,35 @@ nsGlobalWindow::Close()
return rv.ErrorCode();
}
nsresult
void
nsGlobalWindow::ForceClose()
{
MOZ_ASSERT(IsOuterWindow());
if (IsFrame() || !mDocShell) {
// This may be a frame in a frameset, or a window that's already closed.
// Ignore such calls.
return NS_OK;
return;
}
if (mHavePendingClose) {
// We're going to be closed anyway; do nothing since we don't want
// to double-close
return NS_OK;
return;
}
mInClose = true;
DispatchCustomEvent("DOMWindowClose");
return FinalClose();
FinalClose();
}
nsresult
void
nsGlobalWindow::FinalClose()
{
MOZ_ASSERT(IsOuterWindow());
// Flag that we were closed.
mIsClosed = true;
@ -8374,8 +8380,6 @@ nsGlobalWindow::FinalClose()
} else {
mHavePendingClose = true;
}
return NS_OK;
}

View File

@ -470,8 +470,9 @@ public:
virtual NS_HIDDEN_(void) EnterModalState();
virtual NS_HIDDEN_(void) LeaveModalState();
// Outer windows only.
virtual NS_HIDDEN_(bool) CanClose();
virtual NS_HIDDEN_(nsresult) ForceClose();
virtual NS_HIDDEN_(void) ForceClose();
virtual NS_HIDDEN_(void) MaybeUpdateTouchState();
virtual NS_HIDDEN_(void) UpdateTouchState();
@ -1045,7 +1046,8 @@ protected:
void DropOuterWindowDocs();
void CleanUp();
void ClearControllers();
nsresult FinalClose();
// Outer windows only.
void FinalClose();
inline void MaybeClearInnerWindow(nsGlobalWindow* aExpectedInner)
{

View File

@ -424,8 +424,9 @@ public:
virtual void EnterModalState() = 0;
virtual void LeaveModalState() = 0;
// Outer windows only.
virtual bool CanClose() = 0;
virtual nsresult ForceClose() = 0;
virtual void ForceClose() = 0;
bool IsModalContentWindow() const
{

View File

@ -363,6 +363,7 @@ nsAppStartup::Quit(uint32_t aMode)
windowEnumerator->GetNext(getter_AddRefs(window));
nsCOMPtr<nsPIDOMWindow> domWindow(do_QueryInterface(window));
if (domWindow) {
MOZ_ASSERT(domWindow->IsOuterWindow());
if (!domWindow->CanClose())
return NS_OK;
}
@ -504,9 +505,11 @@ nsAppStartup::CloseAllWindows()
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(isupports);
NS_ASSERTION(window, "not an nsPIDOMWindow");
if (window)
if (window) {
MOZ_ASSERT(window->IsOuterWindow());
window->ForceClose();
}
}
}
NS_IMETHODIMP