1 // Copyright (c) 2011 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 "base/command_line.h" 6 #include "base/mac/mac_util.h" 7 #include "chrome/browser/background_mode_manager.h" 8 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/prefs/pref_service.h" 10 #include "chrome/common/app_mode_common_mac.h" 11 #include "chrome/common/chrome_switches.h" 12 #include "chrome/common/pref_names.h" 13 #include "content/browser/browser_thread.h" 14 #include "grit/generated_resources.h" 15 #include "ui/base/l10n/l10n_util.h" 16 17 namespace { 18 19 class DisableLaunchOnStartupTask : public Task { 20 public: 21 virtual void Run(); 22 }; 23 24 class EnableLaunchOnStartupTask : public Task { 25 public: 26 virtual void Run(); 27 }; 28 29 class SetUserCreatedLoginItemPrefTask : public Task { 30 public: 31 virtual void Run(); 32 }; 33 34 void DisableLaunchOnStartupTask::Run() { 35 // Check if Chrome is not a login Item, or is a Login Item but w/o 'hidden' 36 // flag - most likely user has modified the setting, don't override it. 37 bool is_hidden = false; 38 if (!base::mac::CheckLoginItemStatus(&is_hidden) || !is_hidden) 39 return; 40 41 base::mac::RemoveFromLoginItems(); 42 } 43 44 void EnableLaunchOnStartupTask::Run() { 45 // Return if Chrome is already a Login Item (avoid overriding user choice). 46 if (base::mac::CheckLoginItemStatus(NULL)) { 47 // Call back to the UI thread to set our preference so we don't delete the 48 // user's login item when we disable launch on startup. There's a race 49 // condition here if the user disables launch on startup before our callback 50 // is run, but the user can manually disable "Open At Login" via the dock if 51 // this happens. 52 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 53 new SetUserCreatedLoginItemPrefTask()); 54 return; 55 } 56 57 base::mac::AddToLoginItems(true); // Hide on startup. 58 } 59 60 void SetUserCreatedLoginItemPrefTask::Run() { 61 PrefService* service = g_browser_process->local_state(); 62 service->SetBoolean(prefs::kUserCreatedLoginItem, true); 63 } 64 65 } // namespace 66 67 void BackgroundModeManager::EnableLaunchOnStartup(bool should_launch) { 68 // This functionality is only defined for default profile, currently. 69 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUserDataDir)) 70 return; 71 72 if (should_launch) { 73 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 74 new EnableLaunchOnStartupTask()); 75 } else { 76 PrefService* service = g_browser_process->local_state(); 77 if (service->GetBoolean(prefs::kUserCreatedLoginItem)) { 78 // We didn't create the login item, so nothing to do here. 79 service->ClearPref(prefs::kUserCreatedLoginItem); 80 return; 81 } 82 // Call to the File thread to remove the login item since it requires 83 // accessing the disk. 84 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 85 new DisableLaunchOnStartupTask()); 86 } 87 } 88 89 void BackgroundModeManager::DisplayAppInstalledNotification( 90 const Extension* extension) { 91 // TODO(atwilson): Display a platform-appropriate notification here. 92 // http://crbug.com/74970 93 } 94 95 string16 BackgroundModeManager::GetPreferencesMenuLabel() { 96 return l10n_util::GetStringUTF16(IDS_OPTIONS); 97 } 98