// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/base_paths.h" #include "base/command_line.h" #include "base/file_path.h" #include "base/logging.h" #include "base/path_service.h" #include "base/task.h" #include "base/utf_string_conversions.h" #include "base/win/registry.h" #include "chrome/browser/background_mode_manager.h" #include "chrome/common/chrome_switches.h" #include "content/browser/browser_thread.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" namespace { class DisableLaunchOnStartupTask : public Task { public: virtual void Run(); }; class EnableLaunchOnStartupTask : public Task { public: virtual void Run(); }; const HKEY kBackgroundModeRegistryRootKey = HKEY_CURRENT_USER; const wchar_t* kBackgroundModeRegistrySubkey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; const wchar_t* kBackgroundModeRegistryKeyName = L"chromium"; void DisableLaunchOnStartupTask::Run() { const wchar_t* key_name = kBackgroundModeRegistryKeyName; base::win::RegKey read_key(kBackgroundModeRegistryRootKey, kBackgroundModeRegistrySubkey, KEY_READ); base::win::RegKey write_key(kBackgroundModeRegistryRootKey, kBackgroundModeRegistrySubkey, KEY_WRITE); if (read_key.ValueExists(key_name)) { LONG result = write_key.DeleteValue(key_name); DCHECK_EQ(ERROR_SUCCESS, result) << "Failed to deregister launch on login. error: " << result; } } void EnableLaunchOnStartupTask::Run() { // TODO(rickcam): Bug 53597: Make RegKey mockable. // TODO(rickcam): Bug 53600: Use distinct registry keys per flavor+profile. const wchar_t* key_name = kBackgroundModeRegistryKeyName; base::win::RegKey read_key(kBackgroundModeRegistryRootKey, kBackgroundModeRegistrySubkey, KEY_READ); base::win::RegKey write_key(kBackgroundModeRegistryRootKey, kBackgroundModeRegistrySubkey, KEY_WRITE); FilePath executable; if (!PathService::Get(base::FILE_EXE, &executable)) return; std::wstring new_value = executable.value() + L" --" + ASCIIToUTF16(switches::kNoStartupWindow); if (read_key.ValueExists(key_name)) { std::wstring current_value; if ((read_key.ReadValue(key_name, ¤t_value) == ERROR_SUCCESS) && (current_value == new_value)) { return; } } LONG result = write_key.WriteValue(key_name, new_value.c_str()); DCHECK_EQ(ERROR_SUCCESS, result) << "Failed to register launch on login. error: " << result; } } // namespace void BackgroundModeManager::EnableLaunchOnStartup(bool should_launch) { // This functionality is only defined for default profile, currently. if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUserDataDir)) return; if (should_launch) { BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, new EnableLaunchOnStartupTask()); } else { BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, new DisableLaunchOnStartupTask()); } } void BackgroundModeManager::DisplayAppInstalledNotification( const Extension* extension) { // Create a status tray notification balloon explaining to the user that // a background app has been installed. CreateStatusTrayIcon(); status_icon_->DisplayBalloon( l10n_util::GetStringUTF16(IDS_BACKGROUND_APP_INSTALLED_BALLOON_TITLE), l10n_util::GetStringFUTF16( IDS_BACKGROUND_APP_INSTALLED_BALLOON_BODY, UTF8ToUTF16(extension->name()), l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); } string16 BackgroundModeManager::GetPreferencesMenuLabel() { return l10n_util::GetStringUTF16(IDS_OPTIONS); }