diff options
-rw-r--r-- | chrome/browser/background_mode_manager.cc | 5 | ||||
-rw-r--r-- | chrome/browser/background_mode_manager.h | 1 | ||||
-rw-r--r-- | chrome/browser/background_mode_manager_mac.mm | 45 | ||||
-rw-r--r-- | chrome/browser/prefs/browser_prefs.cc | 1 | ||||
-rw-r--r-- | chrome/common/pref_names.cc | 5 | ||||
-rw-r--r-- | chrome/common/pref_names.h | 2 |
6 files changed, 43 insertions, 16 deletions
diff --git a/chrome/browser/background_mode_manager.cc b/chrome/browser/background_mode_manager.cc index 161cb60..123e2f7 100644 --- a/chrome/browser/background_mode_manager.cc +++ b/chrome/browser/background_mode_manager.cc @@ -379,3 +379,8 @@ bool BackgroundModeManager::IsBackgroundModeEnabled( return background_mode_enabled; #endif } + +// static +void BackgroundModeManager::RegisterPrefs(PrefService* prefs) { + prefs->RegisterBooleanPref(prefs::kUserCreatedLoginItem, false); +} diff --git a/chrome/browser/background_mode_manager.h b/chrome/browser/background_mode_manager.h index d5b45a1..236637f 100644 --- a/chrome/browser/background_mode_manager.h +++ b/chrome/browser/background_mode_manager.h @@ -47,6 +47,7 @@ class BackgroundModeManager virtual ~BackgroundModeManager(); static bool IsBackgroundModeEnabled(const CommandLine* command_line); + static void RegisterPrefs(PrefService* prefs); private: friend class TestBackgroundModeManager; diff --git a/chrome/browser/background_mode_manager_mac.mm b/chrome/browser/background_mode_manager_mac.mm index d7a7142..1c47ae9 100644 --- a/chrome/browser/background_mode_manager_mac.mm +++ b/chrome/browser/background_mode_manager_mac.mm @@ -5,8 +5,11 @@ #include "base/command_line.h" #include "base/mac/mac_util.h" #include "chrome/browser/background_mode_manager.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/prefs/pref_service.h" #include "chrome/common/app_mode_common_mac.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/pref_names.h" #include "content/browser/browser_thread.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" @@ -23,20 +26,12 @@ class EnableLaunchOnStartupTask : public Task { virtual void Run(); }; -const CFStringRef kLaunchOnStartupResetAllowedPrefsKey = - CFSTR("LaunchOnStartupResetAllowed"); +class SetUserCreatedLoginItemPrefTask : public Task { + public: + virtual void Run(); +}; void DisableLaunchOnStartupTask::Run() { - Boolean key_exists_and_has_valid_format; // ignored - if (!CFPreferencesGetAppBooleanValue(kLaunchOnStartupResetAllowedPrefsKey, - app_mode::kAppPrefsID, - &key_exists_and_has_valid_format)) - return; - - CFPreferencesSetAppValue(kLaunchOnStartupResetAllowedPrefsKey, - kCFBooleanFalse, - app_mode::kAppPrefsID); - // Check if Chrome is not a login Item, or is a Login Item but w/o 'hidden' // flag - most likely user has modified the setting, don't override it. bool is_hidden = false; @@ -48,13 +43,23 @@ void DisableLaunchOnStartupTask::Run() { void EnableLaunchOnStartupTask::Run() { // Return if Chrome is already a Login Item (avoid overriding user choice). - if (base::mac::CheckLoginItemStatus(NULL)) + if (base::mac::CheckLoginItemStatus(NULL)) { + // Call back to the UI thread to set our preference so we don't delete the + // user's login item when we disable launch on startup. There's a race + // condition here if the user disables launch on startup before our callback + // is run, but the user can manually disable "Open At Login" via the dock if + // this happens. + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + new SetUserCreatedLoginItemPrefTask()); return; + } base::mac::AddToLoginItems(true); // Hide on startup. - CFPreferencesSetAppValue(kLaunchOnStartupResetAllowedPrefsKey, - kCFBooleanTrue, - app_mode::kAppPrefsID); +} + +void SetUserCreatedLoginItemPrefTask::Run() { + PrefService* service = g_browser_process->local_state(); + service->SetBoolean(prefs::kUserCreatedLoginItem, true); } } // namespace @@ -68,6 +73,14 @@ void BackgroundModeManager::EnableLaunchOnStartup(bool should_launch) { BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, new EnableLaunchOnStartupTask()); } else { + PrefService* service = g_browser_process->local_state(); + if (service->GetBoolean(prefs::kUserCreatedLoginItem)) { + // We didn't create the login item, so nothing to do here. + service->ClearPref(prefs::kUserCreatedLoginItem); + return; + } + // Call to the File thread to remove the login item since it requires + // accessing the disk. BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, new DisableLaunchOnStartupTask()); } diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 39d55fe9..a86b787 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc @@ -102,6 +102,7 @@ void RegisterLocalState(PrefService* local_state) { TaskManager::RegisterPrefs(local_state); geolocation::RegisterPrefs(local_state); AutofillManager::RegisterBrowserPrefs(local_state); + BackgroundModeManager::RegisterPrefs(local_state); BackgroundPageTracker::RegisterPrefs(local_state); NotificationUIManager::RegisterPrefs(local_state); PrefProxyConfigService::RegisterPrefs(local_state); diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index aa73805..26d43c4 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -1323,4 +1323,9 @@ const char kKnownBackgroundPages[] = "background_pages.known"; // Dictionary that maps URL schemes (protocols) to URL handlers. const char kRegisteredProtocolHandlers[] = "registered_protocol_handlers"; + +// Set to true if the user created a login item so we should not modify it when +// uninstalling background apps. +const char kUserCreatedLoginItem[] = "background_mode.user_created_login_item"; + } // namespace prefs diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 5155675..dc10567 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -489,6 +489,8 @@ extern const char kKnownBackgroundPages[]; extern const char kRegisteredProtocolHandlers[]; +extern const char kUserCreatedLoginItem[]; + } // namespace prefs #endif // CHROME_COMMON_PREF_NAMES_H_ |