OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #import "chrome/browser/app_controller_mac.h" | 5 #import "chrome/browser/app_controller_mac.h" |
6 | 6 |
7 #include "app/l10n_util_mac.h" | 7 #include "app/l10n_util_mac.h" |
8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/mac_util.h" | 10 #include "base/mac_util.h" |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 | 225 |
226 - (BOOL)tryToTerminateApplication:(NSApplication*)app { | 226 - (BOOL)tryToTerminateApplication:(NSApplication*)app { |
227 // Check for in-process downloads, and prompt the user if they really want | 227 // Check for in-process downloads, and prompt the user if they really want |
228 // to quit (and thus cancel downloads). Only check if we're not already | 228 // to quit (and thus cancel downloads). Only check if we're not already |
229 // shutting down, else the user might be prompted multiple times if the | 229 // shutting down, else the user might be prompted multiple times if the |
230 // download isn't stopped before terminate is called again. | 230 // download isn't stopped before terminate is called again. |
231 if (!browser_shutdown::IsTryingToQuit() && | 231 if (!browser_shutdown::IsTryingToQuit() && |
232 ![self shouldQuitWithInProgressDownloads]) | 232 ![self shouldQuitWithInProgressDownloads]) |
233 return NO; | 233 return NO; |
234 | 234 |
235 // Set the state to "trying to quit", so that closing all browser windows will | |
236 // lead to termination. | |
237 browser_shutdown::SetTryingToQuit(true); | |
238 | |
239 // TODO(viettrungluu): Remove Apple Event handlers here? (It's safe to leave | 235 // TODO(viettrungluu): Remove Apple Event handlers here? (It's safe to leave |
240 // them in, but I'm not sure about UX; we'd also want to disable other things | 236 // them in, but I'm not sure about UX; we'd also want to disable other things |
241 // though.) http://crbug.com/40861 | 237 // though.) http://crbug.com/40861 |
242 | 238 |
243 if (!BrowserList::size()) | 239 size_t num_browsers = BrowserList::size(); |
244 return YES; | |
245 | 240 |
246 // Try to close all the windows. | 241 // Initiate a shutdown (via BrowserList::CloseAllBrowsers()) if we aren't |
247 BrowserList::CloseAllBrowsers(true); | 242 // already shutting down. |
| 243 if (!browser_shutdown::IsTryingToQuit()) |
| 244 BrowserList::CloseAllBrowsers(true); |
248 | 245 |
249 return NO; | 246 return num_browsers == 0 ? YES : NO; |
250 } | 247 } |
251 | 248 |
252 - (void)stopTryingToTerminateApplication:(NSApplication*)app { | 249 - (void)stopTryingToTerminateApplication:(NSApplication*)app { |
253 if (browser_shutdown::IsTryingToQuit()) { | 250 if (browser_shutdown::IsTryingToQuit()) { |
254 // Reset the "trying to quit" state, so that closing all browser windows | 251 // Reset the "trying to quit" state, so that closing all browser windows |
255 // will no longer lead to termination. | 252 // will no longer lead to termination. |
256 browser_shutdown::SetTryingToQuit(false); | 253 browser_shutdown::SetTryingToQuit(false); |
257 | 254 |
258 // TODO(viettrungluu): Were we to remove Apple Event handlers above, we | 255 // TODO(viettrungluu): Were we to remove Apple Event handlers above, we |
259 // would have to reinstall them here. http://crbug.com/40861 | 256 // would have to reinstall them here. http://crbug.com/40861 |
260 } | 257 } |
261 } | 258 } |
262 | 259 |
263 // Called when the app is shutting down. Clean-up as appropriate. | 260 // Called when the app is shutting down. Clean-up as appropriate. |
264 - (void)applicationWillTerminate:(NSNotification*)aNotification { | 261 - (void)applicationWillTerminate:(NSNotification*)aNotification { |
265 NSAppleEventManager* em = [NSAppleEventManager sharedAppleEventManager]; | 262 NSAppleEventManager* em = [NSAppleEventManager sharedAppleEventManager]; |
266 [em removeEventHandlerForEventClass:kInternetEventClass | 263 [em removeEventHandlerForEventClass:kInternetEventClass |
267 andEventID:kAEGetURL]; | 264 andEventID:kAEGetURL]; |
268 [em removeEventHandlerForEventClass:'WWW!' | 265 [em removeEventHandlerForEventClass:'WWW!' |
269 andEventID:'OURL']; | 266 andEventID:'OURL']; |
270 | 267 |
271 // There better be no browser windows left at this point. | 268 // There better be no browser windows left at this point. |
272 CHECK_EQ(BrowserList::size(), 0u); | 269 CHECK_EQ(BrowserList::size(), 0u); |
273 | 270 |
274 // Release the reference to the browser process. Once all the browsers get | 271 // Tell BrowserList not to keep the browser process alive. Once all the |
275 // dealloc'd, it will stop the RunLoop and fall back into main(). | 272 // browsers get dealloc'd, it will stop the RunLoop and fall back into main(). |
276 g_browser_process->ReleaseModule(); | 273 BrowserList::EndKeepAlive(); |
277 | 274 |
278 // Close these off if they have open windows. | 275 // Close these off if they have open windows. |
279 [prefsController_ close]; | 276 [prefsController_ close]; |
280 [aboutController_ close]; | 277 [aboutController_ close]; |
281 | 278 |
282 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 279 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
283 } | 280 } |
284 | 281 |
285 - (void)didEndMainMessageLoop { | 282 - (void)didEndMainMessageLoop { |
286 DCHECK(!BrowserList::HasBrowserWithProfile([self defaultProfile])); | 283 DCHECK(!BrowserList::HasBrowserWithProfile([self defaultProfile])); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 NSNumber* value = [NSNumber numberWithFloat:fiveHoursInSeconds]; | 445 NSNumber* value = [NSNumber numberWithFloat:fiveHoursInSeconds]; |
449 CFPreferencesSetAppValue(checkInterval, value, app); | 446 CFPreferencesSetAppValue(checkInterval, value, app); |
450 CFPreferencesAppSynchronize(app); | 447 CFPreferencesAppSynchronize(app); |
451 } | 448 } |
452 #endif | 449 #endif |
453 } | 450 } |
454 | 451 |
455 // This is called after profiles have been loaded and preferences registered. | 452 // This is called after profiles have been loaded and preferences registered. |
456 // It is safe to access the default profile here. | 453 // It is safe to access the default profile here. |
457 - (void)applicationDidFinishLaunching:(NSNotification*)notify { | 454 - (void)applicationDidFinishLaunching:(NSNotification*)notify { |
458 // Hold an extra ref to the BrowserProcess singleton so it doesn't go away | 455 // Notify BrowserList to keep the application running so it doesn't go away |
459 // when all the browser windows get closed. We'll release it on quit which | 456 // when all the browser windows get closed. |
460 // will be the signal to exit. | 457 BrowserList::StartKeepAlive(); |
461 DCHECK(g_browser_process); | |
462 g_browser_process->AddRefModule(); | |
463 | 458 |
464 bookmarkMenuBridge_.reset(new BookmarkMenuBridge([self defaultProfile])); | 459 bookmarkMenuBridge_.reset(new BookmarkMenuBridge([self defaultProfile])); |
465 historyMenuBridge_.reset(new HistoryMenuBridge([self defaultProfile])); | 460 historyMenuBridge_.reset(new HistoryMenuBridge([self defaultProfile])); |
466 | 461 |
467 [self setUpdateCheckInterval]; | 462 [self setUpdateCheckInterval]; |
468 | 463 |
469 // Build up the encoding menu, the order of the items differs based on the | 464 // Build up the encoding menu, the order of the items differs based on the |
470 // current locale (see http://crbug.com/7647 for details). | 465 // current locale (see http://crbug.com/7647 for details). |
471 // We need a valid g_browser_process to get the profile which is why we can't | 466 // We need a valid g_browser_process to get the profile which is why we can't |
472 // call this from awakeFromNib. | 467 // call this from awakeFromNib. |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 [appController showPreferencesWindow:nil page:page profile:profile]; | 1060 [appController showPreferencesWindow:nil page:page profile:profile]; |
1066 } | 1061 } |
1067 | 1062 |
1068 namespace app_controller_mac { | 1063 namespace app_controller_mac { |
1069 | 1064 |
1070 bool IsOpeningNewWindow() { | 1065 bool IsOpeningNewWindow() { |
1071 return g_is_opening_new_window; | 1066 return g_is_opening_new_window; |
1072 } | 1067 } |
1073 | 1068 |
1074 } // namespace app_controller_mac | 1069 } // namespace app_controller_mac |
OLD | NEW |