OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h" |
| 6 |
| 7 #include "apps/app_window.h" |
| 8 #include "apps/app_window_registry.h" |
| 9 #include "apps/ui/native_app_window.h" |
| 10 #include "base/command_line.h" |
| 11 #include "base/i18n/number_formatting.h" |
| 12 #include "base/prefs/pref_registry_simple.h" |
| 13 #include "base/prefs/pref_service.h" |
| 14 #include "base/strings/sys_string_conversions.h" |
| 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "chrome/browser/browser_process.h" |
| 17 #include "chrome/browser/notifications/notification.h" |
| 18 #include "chrome/browser/notifications/notification_ui_manager.h" |
| 19 #include "chrome/browser/profiles/profile_manager.h" |
| 20 #include "chrome/browser/ui/browser_iterator.h" |
| 21 #include "chrome/common/chrome_switches.h" |
| 22 #include "chrome/common/pref_names.h" |
| 23 #include "extensions/common/extension.h" |
| 24 #include "grit/chromium_strings.h" |
| 25 #include "grit/generated_resources.h" |
| 26 #include "grit/google_chrome_strings.h" |
| 27 #include "grit/theme_resources.h" |
| 28 #include "ui/base/l10n/l10n_util.h" |
| 29 #include "ui/base/l10n/l10n_util_mac.h" |
| 30 #include "ui/base/resource/resource_bundle.h" |
| 31 |
| 32 const char kQuitWithAppsOriginUrl[] = "chrome://quit-with-apps"; |
| 33 const int kQuitAllAppsButtonIndex = 0; |
| 34 const int kDontShowAgainButtonIndex = 1; |
| 35 |
| 36 const char QuitWithAppsController::kQuitWithAppsNotificationID[] = |
| 37 "quit-with-apps"; |
| 38 |
| 39 QuitWithAppsController::QuitWithAppsController() |
| 40 : suppress_for_session_(false) { |
| 41 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 42 |
| 43 // There is only ever one notification to replace, so use the same replace_id |
| 44 // each time. |
| 45 base::string16 replace_id = base::UTF8ToUTF16(id()); |
| 46 |
| 47 message_center::ButtonInfo quit_apps_button_info( |
| 48 l10n_util::GetStringUTF16(IDS_QUIT_WITH_APPS_QUIT_LABEL)); |
| 49 message_center::ButtonInfo suppression_button_info( |
| 50 l10n_util::GetStringUTF16(IDS_QUIT_WITH_APPS_SUPPRESSION_LABEL)); |
| 51 message_center::RichNotificationData rich_notification_data; |
| 52 rich_notification_data.buttons.push_back(quit_apps_button_info); |
| 53 rich_notification_data.buttons.push_back(suppression_button_info); |
| 54 |
| 55 notification_.reset(new Notification( |
| 56 message_center::NOTIFICATION_TYPE_SIMPLE, |
| 57 GURL(kQuitWithAppsOriginUrl), |
| 58 l10n_util::GetStringUTF16(IDS_QUIT_WITH_APPS_TITLE), |
| 59 l10n_util::GetStringUTF16(IDS_QUIT_WITH_APPS_EXPLANATION), |
| 60 ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| 61 IDR_APP_DEFAULT_ICON), |
| 62 blink::WebTextDirectionDefault, |
| 63 message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT, |
| 64 kQuitWithAppsNotificationID), |
| 65 l10n_util::GetStringUTF16(IDS_QUIT_WITH_APPS_NOTIFICATION_DISPLAY_SOURCE), |
| 66 replace_id, |
| 67 rich_notification_data, |
| 68 this)); |
| 69 } |
| 70 |
| 71 QuitWithAppsController::~QuitWithAppsController() {} |
| 72 |
| 73 void QuitWithAppsController::Display() {} |
| 74 |
| 75 void QuitWithAppsController::Error() {} |
| 76 |
| 77 void QuitWithAppsController::Close(bool by_user) { |
| 78 if (by_user) |
| 79 suppress_for_session_ = true; |
| 80 } |
| 81 |
| 82 void QuitWithAppsController::Click() { |
| 83 g_browser_process->notification_ui_manager()->CancelById(id()); |
| 84 } |
| 85 |
| 86 void QuitWithAppsController::ButtonClick(int button_index) { |
| 87 typedef apps::AppWindowRegistry::AppWindowList AppWindowList; |
| 88 |
| 89 g_browser_process->notification_ui_manager()->CancelById(id()); |
| 90 if (button_index == kQuitAllAppsButtonIndex) { |
| 91 apps::AppWindowRegistry::CloseAllAppWindows(); |
| 92 } else if (button_index == kDontShowAgainButtonIndex) { |
| 93 g_browser_process->local_state()->SetBoolean( |
| 94 prefs::kNotifyWhenAppsKeepChromeAlive, false); |
| 95 } |
| 96 } |
| 97 |
| 98 content::WebContents* QuitWithAppsController::GetWebContents() const { |
| 99 return NULL; |
| 100 } |
| 101 |
| 102 std::string QuitWithAppsController::id() const { |
| 103 return kQuitWithAppsNotificationID; |
| 104 } |
| 105 |
| 106 bool QuitWithAppsController::ShouldQuit() { |
| 107 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 108 |
| 109 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| 110 switches::kAppsKeepChromeAlive)) { |
| 111 g_browser_process->local_state()->ClearPref( |
| 112 prefs::kNotifyWhenAppsKeepChromeAlive); |
| 113 return true; |
| 114 } |
| 115 |
| 116 // Quit immediately if there are no windows or the confirmation has been |
| 117 // suppressed. |
| 118 if (!apps::AppWindowRegistry::IsAppWindowRegisteredInAnyProfile(0)) |
| 119 return true; |
| 120 |
| 121 // If there are browser windows, and this notification has been suppressed for |
| 122 // this session or permanently, then just return false to prevent Chrome from |
| 123 // quitting. If there are no browser windows, always show the notification. |
| 124 bool suppress_always = !g_browser_process->local_state()->GetBoolean( |
| 125 prefs::kNotifyWhenAppsKeepChromeAlive); |
| 126 if (!chrome::BrowserIterator().done() && |
| 127 (suppress_for_session_ || suppress_always)) { |
| 128 return false; |
| 129 } |
| 130 |
| 131 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 132 DCHECK(profile_manager); |
| 133 |
| 134 std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles()); |
| 135 DCHECK(profiles.size()); |
| 136 |
| 137 // Delete any existing notification to ensure this one is shown. |
| 138 g_browser_process->notification_ui_manager()->CancelById(id()); |
| 139 g_browser_process->notification_ui_manager()->Add(*notification_, |
| 140 profiles[0]); |
| 141 |
| 142 // Always return false, the notification UI can be used to quit all apps which |
| 143 // will cause Chrome to quit. |
| 144 return false; |
| 145 } |
| 146 |
| 147 // static |
| 148 void QuitWithAppsController::RegisterPrefs(PrefRegistrySimple* registry) { |
| 149 registry->RegisterBooleanPref(prefs::kNotifyWhenAppsKeepChromeAlive, true); |
| 150 } |
OLD | NEW |