Index: chrome/browser/browser_list.cc |
diff --git a/chrome/browser/browser_list.cc b/chrome/browser/browser_list.cc |
index 0ce399d7eec6e1aa6cca674a1576751c823e3b74..31e09ccf6b0962889d63613f1c04756e55dd1dfe 100644 |
--- a/chrome/browser/browser_list.cc |
+++ b/chrome/browser/browser_list.cc |
@@ -223,7 +223,15 @@ void BrowserList::RemoveObserver(BrowserList::Observer* observer) { |
} |
// static |
-void BrowserList::CloseAllBrowsers(bool use_post) { |
+void BrowserList::CloseAllBrowsers() { |
+ bool session_ending = |
+ browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION; |
+ bool use_post = !session_ending; |
+ bool force_exit = false; |
+#if defined(USE_X11) |
+ if (session_ending) |
+ force_exit = true; |
+#endif |
// Tell everyone that we are shutting down. |
browser_shutdown::SetTryingToQuit(true); |
@@ -233,7 +241,7 @@ void BrowserList::CloseAllBrowsers(bool use_post) { |
// If there are no browsers, send the APP_TERMINATING action here. Otherwise, |
// it will be sent by RemoveBrowser() when the last browser has closed. |
- if (browsers_.empty()) { |
+ if (force_exit || browsers_.empty()) { |
NotificationService::current()->Notify(NotificationType::APP_TERMINATING, |
NotificationService::AllSources(), |
NotificationService::NoDetails()); |
@@ -276,10 +284,10 @@ void BrowserList::CloseAllBrowsersAndExit() { |
#if !defined(OS_MACOSX) |
// On most platforms, closing all windows causes the application to exit. |
- CloseAllBrowsers(true); |
+ CloseAllBrowsers(); |
#else |
// On the Mac, the application continues to run once all windows are closed. |
- // Terminate will result in a CloseAllBrowsers(true) call, and once (and if) |
+ // Terminate will result in a CloseAllBrowsers() call, and once (and if) |
// that is done, will cause the application to exit cleanly. |
chrome_browser_application_mac::Terminate(); |
#endif |
@@ -303,8 +311,7 @@ void BrowserList::WindowsSessionEnding() { |
// Write important data first. |
g_browser_process->EndSession(); |
- // Close all the browsers. |
- BrowserList::CloseAllBrowsers(false); |
+ BrowserList::CloseAllBrowsers(); |
// Send out notification. This is used during testing so that the test harness |
// can properly shutdown before we exit. |
@@ -320,6 +327,8 @@ void BrowserList::WindowsSessionEnding() { |
// At this point the message loop is still running yet we've shut everything |
// down. If any messages are processed we'll likely crash. Exit now. |
ExitProcess(ResultCodes::NORMAL_EXIT); |
+#elif defined(OS_LINUX) |
+ _exit(ResultCodes::NORMAL_EXIT); |
#else |
NOTIMPLEMENTED(); |
#endif |
@@ -358,7 +367,7 @@ void BrowserList::EndKeepAlive() { |
// (MessageLoop::current() == null). |
if (browsers_.empty() && !browser_shutdown::IsTryingToQuit() && |
MessageLoop::current()) |
- CloseAllBrowsers(true); |
+ CloseAllBrowsers(); |
} |
} |