From 91fd5ffa31b344f1ebe9e7f00d799e708934f2ca Mon Sep 17 00:00:00 2001 From: Honza Bambas Date: Tue, 4 Nov 2008 11:44:23 -0800 Subject: [PATCH] Bug 449308: Quitting doesn't work when onbeforeunload handler poses dialog. r=mossop, r+sr=bsmedberg --- .../components/startup/src/nsAppStartup.cpp | 27 ++++++++++++++++++- toolkit/components/startup/src/nsAppStartup.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/toolkit/components/startup/src/nsAppStartup.cpp b/toolkit/components/startup/src/nsAppStartup.cpp index 7b5add28777a..93038bfb6e9f 100644 --- a/toolkit/components/startup/src/nsAppStartup.cpp +++ b/toolkit/components/startup/src/nsAppStartup.cpp @@ -161,6 +161,16 @@ nsAppStartup::DestroyHiddenWindow() return appShellService->DestroyHiddenWindow(); } +PRInt32 +nsAppStartup::RealQuitStoppers() +{ +#ifdef XP_MACOSX + // When attempting quit is set we must subtract the hidden window + return mConsiderQuitStopper - (mAttemptingQuit ? 0 : 1); +#else + return mConsiderQuitStopper; +#endif +} NS_IMETHODIMP nsAppStartup::Run(void) @@ -368,8 +378,23 @@ nsAppStartup::CloseAllWindows() nsCOMPtr window = do_QueryInterface(isupports); NS_ASSERTION(window, "not an nsIDOMWindowInternal"); - if (window) + if (window) { +#ifdef XP_MACOSX + PRInt32 quitStoppers = RealQuitStoppers(); +#endif window->Close(); +#ifdef XP_MACOSX + if (!mAttemptingQuit) { + PRInt32 currentQuitStoppers = RealQuitStoppers(); + // If the current number of windows is smaller or same then the number + // recorded before window close, we must re-attempt quit. + // 'Or same' condition is here because the actual window deregisters + // later asynchronously. + if (currentQuitStoppers <= quitStoppers) + AttemptingQuit(PR_TRUE); + } +#endif + } } } diff --git a/toolkit/components/startup/src/nsAppStartup.h b/toolkit/components/startup/src/nsAppStartup.h index 3c0ab5f9430e..d3c4a88e8b8f 100644 --- a/toolkit/components/startup/src/nsAppStartup.h +++ b/toolkit/components/startup/src/nsAppStartup.h @@ -75,6 +75,7 @@ private: void AttemptingQuit(PRBool aAttempt); void CloseAllWindows(); + inline PRInt32 RealQuitStoppers(); friend class nsAppExitEvent;