Bug 636374 - don't show multiple onbeforeunload prompts, r=bz

This commit is contained in:
Gijs Kruitbosch
2013-12-18 18:36:12 +00:00
parent d41addacc8
commit 5f7da39efb
2 changed files with 31 additions and 5 deletions

View File

@@ -1054,7 +1054,19 @@ nsDocumentViewer::LoadComplete(nsresult aStatus)
}
NS_IMETHODIMP
nsDocumentViewer::PermitUnload(bool aCallerClosesWindow, bool *aPermitUnload)
nsDocumentViewer::PermitUnload(bool aCallerClosesWindow,
bool *aPermitUnload)
{
bool shouldPrompt = true;
return PermitUnloadInternal(aCallerClosesWindow, &shouldPrompt,
aPermitUnload);
}
nsresult
nsDocumentViewer::PermitUnloadInternal(bool aCallerClosesWindow,
bool *aShouldPrompt,
bool *aPermitUnload)
{
*aPermitUnload = true;
@@ -1133,8 +1145,8 @@ nsDocumentViewer::PermitUnload(bool aCallerClosesWindow, bool *aPermitUnload)
nsCOMPtr<nsIDocShellTreeNode> docShellNode(mContainer);
nsAutoString text;
beforeUnload->GetReturnValue(text);
if (event->GetInternalNSEvent()->mFlags.mDefaultPrevented ||
!text.IsEmpty()) {
if (*aShouldPrompt && (event->GetInternalNSEvent()->mFlags.mDefaultPrevented ||
!text.IsEmpty())) {
// Ask the user if it's ok to unload the current page
nsCOMPtr<nsIPrompt> prompt = do_GetInterface(docShellNode);
@@ -1186,6 +1198,11 @@ nsDocumentViewer::PermitUnload(bool aCallerClosesWindow, bool *aPermitUnload)
// Button 0 == leave, button 1 == stay
*aPermitUnload = (buttonPressed == 0);
// If the user decided to go ahead, make sure not to prompt the user again
// by toggling the internal prompting bool to false:
if (*aPermitUnload) {
*aShouldPrompt = false;
}
}
}
@@ -1204,7 +1221,8 @@ nsDocumentViewer::PermitUnload(bool aCallerClosesWindow, bool *aPermitUnload)
docShell->GetContentViewer(getter_AddRefs(cv));
if (cv) {
cv->PermitUnload(aCallerClosesWindow, aPermitUnload);
cv->PermitUnloadInternal(aCallerClosesWindow, aShouldPrompt,
aPermitUnload);
}
}
}