summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/background_mode_manager.cc5
-rw-r--r--chrome/browser/background_mode_manager.h1
-rw-r--r--chrome/browser/background_mode_manager_mac.mm45
-rw-r--r--chrome/browser/prefs/browser_prefs.cc1
-rw-r--r--chrome/common/pref_names.cc5
-rw-r--r--chrome/common/pref_names.h2
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_