browser_distribution.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
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 32using installer::MasterPreferences; 33 34namespace { 35 36const wchar_t kChromiumActiveSetupGuid[] = 37 L"{7D2B3E1D-D096-4594-9D8F-A6667F12E0AC}"; 38 39const wchar_t kCommandExecuteImplUuid[] = 40 L"{A2DF06F9-A21A-44A8-8A99-8B9C84F29160}"; 41 42// The BrowserDistribution objects are never freed. 43BrowserDistribution* g_browser_distribution = NULL; 44BrowserDistribution* g_chrome_frame_distribution = NULL; 45BrowserDistribution* g_binaries_distribution = NULL; 46BrowserDistribution* g_chrome_app_host_distribution = NULL; 47 48// Returns true if currently running in npchrome_frame.dll 49bool 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 56BrowserDistribution::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 69BrowserDistribution::BrowserDistribution() 70 : type_(CHROME_BROWSER) { 71} 72 73BrowserDistribution::BrowserDistribution(Type type) 74 : type_(type) { 75} 76 77template<class DistributionClass> 78BrowserDistribution* 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 91BrowserDistribution* BrowserDistribution::GetDistribution() { 92 return GetSpecificDistribution(GetCurrentDistributionType()); 93} 94 95// static 96BrowserDistribution* 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 140void BrowserDistribution::DoPostUninstallOperations( 141 const Version& version, const base::FilePath& local_data_path, 142 const string16& distribution_data) { 143} 144 145string16 BrowserDistribution::GetActiveSetupGuid() { 146 return kChromiumActiveSetupGuid; 147} 148 149string16 BrowserDistribution::GetAppGuid() { 150 return L""; 151} 152 153string16 BrowserDistribution::GetBaseAppName() { 154 return L"Chromium"; 155} 156 157string16 BrowserDistribution::GetAppShortCutName() { 158 return GetBaseAppName(); 159} 160 161string16 BrowserDistribution::GetAlternateApplicationName() { 162 return L"The Internet"; 163} 164 165string16 BrowserDistribution::GetBaseAppId() { 166 return L"Chromium"; 167} 168 169string16 BrowserDistribution::GetInstallSubDir() { 170 return L"Chromium"; 171} 172 173string16 BrowserDistribution::GetPublisherName() { 174 return L"Chromium"; 175} 176 177string16 BrowserDistribution::GetAppDescription() { 178 return L"Browse the web"; 179} 180 181string16 BrowserDistribution::GetLongAppDescription() { 182 const string16& app_description = 183 installer::GetLocalizedString(IDS_PRODUCT_DESCRIPTION_BASE); 184 return app_description; 185} 186 187std::string BrowserDistribution::GetSafeBrowsingName() { 188 return "chromium"; 189} 190 191string16 BrowserDistribution::GetStateKey() { 192 return L"Software\\Chromium"; 193} 194 195string16 BrowserDistribution::GetStateMediumKey() { 196 return L"Software\\Chromium"; 197} 198 199std::string BrowserDistribution::GetNetworkStatsServer() const { 200 return ""; 201} 202 203std::string BrowserDistribution::GetHttpPipeliningTestServer() const { 204 return ""; 205} 206 207string16 BrowserDistribution::GetDistributionData(HKEY root_key) { 208 return L""; 209} 210 211string16 BrowserDistribution::GetUninstallLinkName() { 212 return L"Uninstall Chromium"; 213} 214 215string16 BrowserDistribution::GetUninstallRegPath() { 216 return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium"; 217} 218 219string16 BrowserDistribution::GetVersionKey() { 220 return L"Software\\Chromium"; 221} 222 223bool BrowserDistribution::CanSetAsDefault() { 224 return true; 225} 226 227bool BrowserDistribution::CanCreateDesktopShortcuts() { 228 return true; 229} 230 231string16 BrowserDistribution::GetIconFilename() { 232 return string16(); 233} 234 235int BrowserDistribution::GetIconIndex() { 236 // Assuming that main icon appears first alphabetically in the resource file 237 // for GetIconFilename(). 238 return 0; 239} 240 241bool BrowserDistribution::GetChromeChannel(string16* channel) { 242 return false; 243} 244 245bool BrowserDistribution::GetCommandExecuteImplClsid( 246 string16* handler_class_uuid) { 247 if (handler_class_uuid) 248 *handler_class_uuid = kCommandExecuteImplUuid; 249 return true; 250} 251 252bool BrowserDistribution::AppHostIsSupported() { 253 return false; 254} 255 256void BrowserDistribution::UpdateInstallStatus(bool system_install, 257 installer::ArchiveType archive_type, 258 installer::InstallStatus install_status) { 259} 260 261bool BrowserDistribution::ShouldSetExperimentLabels() { 262 return false; 263} 264 265bool BrowserDistribution::HasUserExperiments() { 266 return false; 267} 268