Home | History | Annotate | Download | only in browser
      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 
     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 
     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, &current_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 
     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 
     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 
    103 string16 BackgroundModeManager::GetPreferencesMenuLabel() {
    104   return l10n_util::GetStringUTF16(IDS_OPTIONS);
    105 }
    106