Home | History | Annotate | Download | only in util
      1 // Copyright (c) 2012 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 // This file defines a class that contains various method related to branding.
      6 // It provides only default implementations of these methods. Usually to add
      7 // specific branding, we will need to extend this class with a custom
      8 // implementation.
      9 
     10 #include "chrome/installer/util/browser_distribution.h"
     11 
     12 #include "base/atomicops.h"
     13 #include "base/command_line.h"
     14 #include "base/files/file_path.h"
     15 #include "base/logging.h"
     16 #include "base/path_service.h"
     17 #include "base/win/registry.h"
     18 #include "base/win/windows_version.h"
     19 #include "chrome/common/env_vars.h"
     20 #include "chrome/installer/util/chrome_app_host_distribution.h"
     21 #include "chrome/installer/util/chrome_frame_distribution.h"
     22 #include "chrome/installer/util/chromium_binaries_distribution.h"
     23 #include "chrome/installer/util/google_chrome_binaries_distribution.h"
     24 #include "chrome/installer/util/google_chrome_distribution.h"
     25 #include "chrome/installer/util/google_chrome_sxs_distribution.h"
     26 #include "chrome/installer/util/install_util.h"
     27 #include "chrome/installer/util/l10n_string_util.h"
     28 #include "chrome/installer/util/master_preferences.h"
     29 
     30 #include "installer_util_strings.h"  // NOLINT
     31 
     32 using installer::MasterPreferences;
     33 
     34 namespace {
     35 
     36 const wchar_t kChromiumActiveSetupGuid[] =
     37     L"{7D2B3E1D-D096-4594-9D8F-A6667F12E0AC}";
     38 
     39 const wchar_t kCommandExecuteImplUuid[] =
     40     L"{A2DF06F9-A21A-44A8-8A99-8B9C84F29160}";
     41 
     42 // The BrowserDistribution objects are never freed.
     43 BrowserDistribution* g_browser_distribution = NULL;
     44 BrowserDistribution* g_chrome_frame_distribution = NULL;
     45 BrowserDistribution* g_binaries_distribution = NULL;
     46 BrowserDistribution* g_chrome_app_host_distribution = NULL;
     47 
     48 // Returns true if currently running in npchrome_frame.dll
     49 bool IsChromeFrameModule() {
     50   base::FilePath module_path;
     51   PathService::Get(base::FILE_MODULE, &module_path);
     52   return base::FilePath::CompareEqualIgnoreCase(module_path.BaseName().value(),
     53                                           installer::kChromeFrameDll);
     54 }
     55 
     56 BrowserDistribution::Type GetCurrentDistributionType() {
     57   // TODO(erikwright): If the app host is installed, but not Chrome, perhaps
     58   // this should return CHROME_APP_HOST.
     59   static BrowserDistribution::Type type =
     60       (MasterPreferences::ForCurrentProcess().install_chrome_frame() ||
     61        IsChromeFrameModule()) ?
     62           BrowserDistribution::CHROME_FRAME :
     63           BrowserDistribution::CHROME_BROWSER;
     64   return type;
     65 }
     66 
     67 }  // end namespace
     68 
     69 BrowserDistribution::BrowserDistribution()
     70     : type_(CHROME_BROWSER) {
     71 }
     72 
     73 BrowserDistribution::BrowserDistribution(Type type)
     74     : type_(type) {
     75 }
     76 
     77 template<class DistributionClass>
     78 BrowserDistribution* BrowserDistribution::GetOrCreateBrowserDistribution(
     79     BrowserDistribution** dist) {
     80   if (!*dist) {
     81     DistributionClass* temp = new DistributionClass();
     82     if (base::subtle::NoBarrier_CompareAndSwap(
     83             reinterpret_cast<base::subtle::AtomicWord*>(dist), NULL,
     84             reinterpret_cast<base::subtle::AtomicWord>(temp)) != NULL)
     85       delete temp;
     86   }
     87 
     88   return *dist;
     89 }
     90 
     91 BrowserDistribution* BrowserDistribution::GetDistribution() {
     92   return GetSpecificDistribution(GetCurrentDistributionType());
     93 }
     94 
     95 // static
     96 BrowserDistribution* BrowserDistribution::GetSpecificDistribution(
     97     BrowserDistribution::Type type) {
     98   BrowserDistribution* dist = NULL;
     99 
    100   switch (type) {
    101     case CHROME_BROWSER:
    102 #if defined(GOOGLE_CHROME_BUILD)
    103       if (InstallUtil::IsChromeSxSProcess()) {
    104         dist = GetOrCreateBrowserDistribution<GoogleChromeSxSDistribution>(
    105             &g_browser_distribution);
    106       } else {
    107         dist = GetOrCreateBrowserDistribution<GoogleChromeDistribution>(
    108             &g_browser_distribution);
    109       }
    110 #else
    111       dist = GetOrCreateBrowserDistribution<BrowserDistribution>(
    112           &g_browser_distribution);
    113 #endif
    114       break;
    115 
    116     case CHROME_FRAME:
    117       dist = GetOrCreateBrowserDistribution<ChromeFrameDistribution>(
    118           &g_chrome_frame_distribution);
    119       break;
    120 
    121     case CHROME_APP_HOST:
    122       dist = GetOrCreateBrowserDistribution<ChromeAppHostDistribution>(
    123           &g_chrome_app_host_distribution);
    124       break;
    125 
    126     default:
    127       DCHECK_EQ(CHROME_BINARIES, type);
    128 #if defined(GOOGLE_CHROME_BUILD)
    129       dist = GetOrCreateBrowserDistribution<GoogleChromeBinariesDistribution>(
    130           &g_binaries_distribution);
    131 #else
    132       dist = GetOrCreateBrowserDistribution<ChromiumBinariesDistribution>(
    133           &g_binaries_distribution);
    134 #endif
    135   }
    136 
    137   return dist;
    138 }
    139 
    140 void BrowserDistribution::DoPostUninstallOperations(
    141     const Version& version, const base::FilePath& local_data_path,
    142     const string16& distribution_data) {
    143 }
    144 
    145 string16 BrowserDistribution::GetActiveSetupGuid() {
    146   return kChromiumActiveSetupGuid;
    147 }
    148 
    149 string16 BrowserDistribution::GetAppGuid() {
    150   return L"";
    151 }
    152 
    153 string16 BrowserDistribution::GetBaseAppName() {
    154   return L"Chromium";
    155 }
    156 
    157 string16 BrowserDistribution::GetAppShortCutName() {
    158   return GetBaseAppName();
    159 }
    160 
    161 string16 BrowserDistribution::GetAlternateApplicationName() {
    162   return L"The Internet";
    163 }
    164 
    165 string16 BrowserDistribution::GetBaseAppId() {
    166   return L"Chromium";
    167 }
    168 
    169 string16 BrowserDistribution::GetInstallSubDir() {
    170   return L"Chromium";
    171 }
    172 
    173 string16 BrowserDistribution::GetPublisherName() {
    174   return L"Chromium";
    175 }
    176 
    177 string16 BrowserDistribution::GetAppDescription() {
    178   return L"Browse the web";
    179 }
    180 
    181 string16 BrowserDistribution::GetLongAppDescription() {
    182   const string16& app_description =
    183       installer::GetLocalizedString(IDS_PRODUCT_DESCRIPTION_BASE);
    184   return app_description;
    185 }
    186 
    187 std::string BrowserDistribution::GetSafeBrowsingName() {
    188   return "chromium";
    189 }
    190 
    191 string16 BrowserDistribution::GetStateKey() {
    192   return L"Software\\Chromium";
    193 }
    194 
    195 string16 BrowserDistribution::GetStateMediumKey() {
    196   return L"Software\\Chromium";
    197 }
    198 
    199 std::string BrowserDistribution::GetNetworkStatsServer() const {
    200   return "";
    201 }
    202 
    203 std::string BrowserDistribution::GetHttpPipeliningTestServer() const {
    204   return "";
    205 }
    206 
    207 string16 BrowserDistribution::GetDistributionData(HKEY root_key) {
    208   return L"";
    209 }
    210 
    211 string16 BrowserDistribution::GetUninstallLinkName() {
    212   return L"Uninstall Chromium";
    213 }
    214 
    215 string16 BrowserDistribution::GetUninstallRegPath() {
    216   return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium";
    217 }
    218 
    219 string16 BrowserDistribution::GetVersionKey() {
    220   return L"Software\\Chromium";
    221 }
    222 
    223 bool BrowserDistribution::CanSetAsDefault() {
    224   return true;
    225 }
    226 
    227 bool BrowserDistribution::CanCreateDesktopShortcuts() {
    228   return true;
    229 }
    230 
    231 string16 BrowserDistribution::GetIconFilename() {
    232   return string16();
    233 }
    234 
    235 int BrowserDistribution::GetIconIndex() {
    236   // Assuming that main icon appears first alphabetically in the resource file
    237   // for GetIconFilename().
    238   return 0;
    239 }
    240 
    241 bool BrowserDistribution::GetChromeChannel(string16* channel) {
    242   return false;
    243 }
    244 
    245 bool BrowserDistribution::GetCommandExecuteImplClsid(
    246     string16* handler_class_uuid) {
    247   if (handler_class_uuid)
    248     *handler_class_uuid = kCommandExecuteImplUuid;
    249   return true;
    250 }
    251 
    252 bool BrowserDistribution::AppHostIsSupported() {
    253   return false;
    254 }
    255 
    256 void BrowserDistribution::UpdateInstallStatus(bool system_install,
    257     installer::ArchiveType archive_type,
    258     installer::InstallStatus install_status) {
    259 }
    260 
    261 bool BrowserDistribution::ShouldSetExperimentLabels() {
    262   return false;
    263 }
    264 
    265 bool BrowserDistribution::HasUserExperiments() {
    266   return false;
    267 }
    268