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