OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/lifetime/browser_close_manager.h" | 5 #include "chrome/browser/lifetime/browser_close_manager.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "chrome/browser/background/background_mode_manager.h" |
8 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
9 #include "chrome/browser/browser_shutdown.h" | 10 #include "chrome/browser/browser_shutdown.h" |
10 #include "chrome/browser/download/download_service.h" | 11 #include "chrome/browser/download/download_service.h" |
11 #include "chrome/browser/download/download_service_factory.h" | 12 #include "chrome/browser/download/download_service_factory.h" |
12 #include "chrome/browser/profiles/profile_manager.h" | 13 #include "chrome/browser/profiles/profile_manager.h" |
13 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
14 #include "chrome/browser/ui/browser_finder.h" | 15 #include "chrome/browser/ui/browser_finder.h" |
15 #include "chrome/browser/ui/browser_iterator.h" | 16 #include "chrome/browser/ui/browser_iterator.h" |
16 #include "chrome/browser/ui/browser_list.h" | 17 #include "chrome/browser/ui/browser_list.h" |
17 #include "chrome/browser/ui/browser_window.h" | 18 #include "chrome/browser/ui/browser_window.h" |
18 #include "chrome/browser/ui/chrome_pages.h" | 19 #include "chrome/browser/ui/chrome_pages.h" |
19 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
20 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
21 #include "content/public/browser/web_contents.h" | 22 #include "content/public/browser/web_contents.h" |
22 | 23 |
23 BrowserCloseManager::BrowserCloseManager() : current_browser_(NULL) {} | 24 BrowserCloseManager::BrowserCloseManager() : current_browser_(NULL) {} |
24 | 25 |
25 BrowserCloseManager::~BrowserCloseManager() {} | 26 BrowserCloseManager::~BrowserCloseManager() {} |
26 | 27 |
27 void BrowserCloseManager::StartClosingBrowsers() { | 28 void BrowserCloseManager::StartClosingBrowsers() { |
28 // If the session is ending or batch browser shutdown is disabled, skip | 29 // If the session is ending or batch browser shutdown is disabled, skip |
29 // straight to closing the browsers. In the former case, there's no time to | 30 // straight to closing the browsers. In the former case, there's no time to |
30 // wait for beforeunload dialogs; in the latter, the windows will manage | 31 // wait for beforeunload dialogs; in the latter, the windows will manage |
31 // showing their own dialogs. | 32 // showing their own dialogs. |
32 if (browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION || | 33 if (browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION || |
33 CommandLine::ForCurrentProcess()->HasSwitch( | 34 CommandLine::ForCurrentProcess()->HasSwitch( |
34 switches::kDisableBatchedShutdown)) { | 35 switches::kDisableBatchedShutdown)) { |
| 36 // Tell everyone that we are shutting down. |
| 37 browser_shutdown::SetTryingToQuit(true); |
35 CloseBrowsers(); | 38 CloseBrowsers(); |
36 return; | 39 return; |
37 } | 40 } |
38 TryToCloseBrowsers(); | 41 TryToCloseBrowsers(); |
39 } | 42 } |
40 | 43 |
41 void BrowserCloseManager::CancelBrowserClose() { | 44 void BrowserCloseManager::CancelBrowserClose() { |
42 browser_shutdown::SetTryingToQuit(false); | 45 browser_shutdown::SetTryingToQuit(false); |
43 for (chrome::BrowserIterator it; !it.done(); it.Next()) { | 46 for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
44 it->ResetBeforeUnloadHandlers(); | 47 it->ResetBeforeUnloadHandlers(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 if (download_service->NonMaliciousDownloadCount() > 0) { | 119 if (download_service->NonMaliciousDownloadCount() > 0) { |
117 Browser* browser = | 120 Browser* browser = |
118 chrome::FindOrCreateTabbedBrowser(*it, chrome::GetActiveDesktop()); | 121 chrome::FindOrCreateTabbedBrowser(*it, chrome::GetActiveDesktop()); |
119 DCHECK(browser); | 122 DCHECK(browser); |
120 chrome::ShowDownloads(browser); | 123 chrome::ShowDownloads(browser); |
121 } | 124 } |
122 } | 125 } |
123 } | 126 } |
124 | 127 |
125 void BrowserCloseManager::CloseBrowsers() { | 128 void BrowserCloseManager::CloseBrowsers() { |
126 // Tell everyone that we are shutting down. | |
127 browser_shutdown::SetTryingToQuit(true); | |
128 | |
129 #if defined(ENABLE_SESSION_SERVICE) | 129 #if defined(ENABLE_SESSION_SERVICE) |
130 // Before we close the browsers shutdown all session services. That way an | 130 // Before we close the browsers shutdown all session services. That way an |
131 // exit can restore all browsers open before exiting. | 131 // exit can restore all browsers open before exiting. |
132 ProfileManager::ShutdownSessionServices(); | 132 ProfileManager::ShutdownSessionServices(); |
133 #endif | 133 #endif |
| 134 if (!browser_shutdown::IsTryingToQuit()) { |
| 135 BackgroundModeManager* background_mode_manager = |
| 136 g_browser_process->background_mode_manager(); |
| 137 if (background_mode_manager) |
| 138 background_mode_manager->SuspendBackgroundMode(); |
| 139 } |
134 | 140 |
135 bool session_ending = | 141 bool session_ending = |
136 browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION; | 142 browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION; |
137 for (scoped_ptr<chrome::BrowserIterator> it_ptr( | 143 for (scoped_ptr<chrome::BrowserIterator> it_ptr( |
138 new chrome::BrowserIterator()); | 144 new chrome::BrowserIterator()); |
139 !it_ptr->done();) { | 145 !it_ptr->done();) { |
140 Browser* browser = **it_ptr; | 146 Browser* browser = **it_ptr; |
141 browser->window()->Close(); | 147 browser->window()->Close(); |
142 if (!session_ending) { | 148 if (!session_ending) { |
143 it_ptr->Next(); | 149 it_ptr->Next(); |
(...skipping 11 matching lines...) Expand all Loading... |
155 it_ptr.reset(new chrome::BrowserIterator()); | 161 it_ptr.reset(new chrome::BrowserIterator()); |
156 if (!it_ptr->done() && browser == **it_ptr) { | 162 if (!it_ptr->done() && browser == **it_ptr) { |
157 // Destroying the browser should have removed it from the browser list. | 163 // Destroying the browser should have removed it from the browser list. |
158 // We should never get here. | 164 // We should never get here. |
159 NOTREACHED(); | 165 NOTREACHED(); |
160 return; | 166 return; |
161 } | 167 } |
162 } | 168 } |
163 } | 169 } |
164 } | 170 } |
OLD | NEW |