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/base_paths.h"
6 #include "base/command_line.h"
7 #include "base/file_path.h"
8 #include "base/logging.h"
9 #include "base/path_service.h"
10 #include "base/task.h"
11 #include "base/utf_string_conversions.h"
12 #include "base/win/registry.h"
13 #include "chrome/browser/background_mode_manager.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "content/browser/browser_thread.h"
16 #include "grit/chromium_strings.h"
17 #include "grit/generated_resources.h"
18 #include "ui/base/l10n/l10n_util.h"
19
20 namespace {
21
22 class DisableLaunchOnStartupTask : public Task {
23 public:
24 virtual void Run();
25 };
26
27 class EnableLaunchOnStartupTask : public Task {
28 public:
29 virtual void Run();
30 };
31
32 const HKEY kBackgroundModeRegistryRootKey = HKEY_CURRENT_USER;
33 const wchar_t* kBackgroundModeRegistrySubkey =
34 L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
35 const wchar_t* kBackgroundModeRegistryKeyName = L"chromium";
36
Run()37 void DisableLaunchOnStartupTask::Run() {
38 const wchar_t* key_name = kBackgroundModeRegistryKeyName;
39 base::win::RegKey read_key(kBackgroundModeRegistryRootKey,
40 kBackgroundModeRegistrySubkey, KEY_READ);
41 base::win::RegKey write_key(kBackgroundModeRegistryRootKey,
42 kBackgroundModeRegistrySubkey, KEY_WRITE);
43 if (read_key.ValueExists(key_name)) {
44 LONG result = write_key.DeleteValue(key_name);
45 DCHECK_EQ(ERROR_SUCCESS, result) <<
46 "Failed to deregister launch on login. error: " << result;
47 }
48 }
49
Run()50 void EnableLaunchOnStartupTask::Run() {
51 // TODO(rickcam): Bug 53597: Make RegKey mockable.
52 // TODO(rickcam): Bug 53600: Use distinct registry keys per flavor+profile.
53 const wchar_t* key_name = kBackgroundModeRegistryKeyName;
54 base::win::RegKey read_key(kBackgroundModeRegistryRootKey,
55 kBackgroundModeRegistrySubkey, KEY_READ);
56 base::win::RegKey write_key(kBackgroundModeRegistryRootKey,
57 kBackgroundModeRegistrySubkey, KEY_WRITE);
58 FilePath executable;
59 if (!PathService::Get(base::FILE_EXE, &executable))
60 return;
61 std::wstring new_value = executable.value() +
62 L" --" + ASCIIToUTF16(switches::kNoStartupWindow);
63 if (read_key.ValueExists(key_name)) {
64 std::wstring current_value;
65 if ((read_key.ReadValue(key_name, ¤t_value) == ERROR_SUCCESS) &&
66 (current_value == new_value)) {
67 return;
68 }
69 }
70 LONG result = write_key.WriteValue(key_name, new_value.c_str());
71 DCHECK_EQ(ERROR_SUCCESS, result) <<
72 "Failed to register launch on login. error: " << result;
73 }
74
75 } // namespace
76
EnableLaunchOnStartup(bool should_launch)77 void BackgroundModeManager::EnableLaunchOnStartup(bool should_launch) {
78 // This functionality is only defined for default profile, currently.
79 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUserDataDir))
80 return;
81 if (should_launch) {
82 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
83 new EnableLaunchOnStartupTask());
84 } else {
85 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
86 new DisableLaunchOnStartupTask());
87 }
88 }
89
DisplayAppInstalledNotification(const Extension * extension)90 void BackgroundModeManager::DisplayAppInstalledNotification(
91 const Extension* extension) {
92 // Create a status tray notification balloon explaining to the user that
93 // a background app has been installed.
94 CreateStatusTrayIcon();
95 status_icon_->DisplayBalloon(
96 l10n_util::GetStringUTF16(IDS_BACKGROUND_APP_INSTALLED_BALLOON_TITLE),
97 l10n_util::GetStringFUTF16(
98 IDS_BACKGROUND_APP_INSTALLED_BALLOON_BODY,
99 UTF8ToUTF16(extension->name()),
100 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
101 }
102
GetPreferencesMenuLabel()103 string16 BackgroundModeManager::GetPreferencesMenuLabel() {
104 return l10n_util::GetStringUTF16(IDS_OPTIONS);
105 }
106