browser_distribution.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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/chrome_icon_resources_win.h" 20#include "chrome/common/env_vars.h" 21#include "chrome/installer/util/chrome_app_host_distribution.h" 22#include "chrome/installer/util/chrome_frame_distribution.h" 23#include "chrome/installer/util/chromium_binaries_distribution.h" 24#include "chrome/installer/util/google_chrome_binaries_distribution.h" 25#include "chrome/installer/util/google_chrome_distribution.h" 26#include "chrome/installer/util/google_chrome_sxs_distribution.h" 27#include "chrome/installer/util/install_util.h" 28#include "chrome/installer/util/l10n_string_util.h" 29#include "chrome/installer/util/master_preferences.h" 30 31#include "installer_util_strings.h" // NOLINT 32 33using installer::MasterPreferences; 34 35namespace { 36 37const wchar_t kChromiumActiveSetupGuid[] = 38 L"{7D2B3E1D-D096-4594-9D8F-A6667F12E0AC}"; 39 40const wchar_t kCommandExecuteImplUuid[] = 41 L"{A2DF06F9-A21A-44A8-8A99-8B9C84F29160}"; 42 43// The BrowserDistribution objects are never freed. 44BrowserDistribution* g_browser_distribution = NULL; 45BrowserDistribution* g_chrome_frame_distribution = NULL; 46BrowserDistribution* g_binaries_distribution = NULL; 47BrowserDistribution* g_chrome_app_host_distribution = NULL; 48 49BrowserDistribution::Type GetCurrentDistributionType() { 50 // TODO(erikwright): If the app host is installed, but not Chrome, perhaps 51 // this should return CHROME_APP_HOST. 52 return BrowserDistribution::CHROME_BROWSER; 53} 54 55} // end namespace 56 57BrowserDistribution::BrowserDistribution() 58 : type_(CHROME_BROWSER) { 59} 60 61BrowserDistribution::BrowserDistribution(Type type) 62 : type_(type) { 63} 64 65template<class DistributionClass> 66BrowserDistribution* BrowserDistribution::GetOrCreateBrowserDistribution( 67 BrowserDistribution** dist) { 68 if (!*dist) { 69 DistributionClass* temp = new DistributionClass(); 70 if (base::subtle::NoBarrier_CompareAndSwap( 71 reinterpret_cast<base::subtle::AtomicWord*>(dist), NULL, 72 reinterpret_cast<base::subtle::AtomicWord>(temp)) != NULL) 73 delete temp; 74 } 75 76 return *dist; 77} 78 79BrowserDistribution* BrowserDistribution::GetDistribution() { 80 return GetSpecificDistribution(GetCurrentDistributionType()); 81} 82 83// static 84BrowserDistribution* BrowserDistribution::GetSpecificDistribution( 85 BrowserDistribution::Type type) { 86 BrowserDistribution* dist = NULL; 87 88 switch (type) { 89 case CHROME_BROWSER: 90#if defined(GOOGLE_CHROME_BUILD) 91 if (InstallUtil::IsChromeSxSProcess()) { 92 dist = GetOrCreateBrowserDistribution<GoogleChromeSxSDistribution>( 93 &g_browser_distribution); 94 } else { 95 dist = GetOrCreateBrowserDistribution<GoogleChromeDistribution>( 96 &g_browser_distribution); 97 } 98#else 99 dist = GetOrCreateBrowserDistribution<BrowserDistribution>( 100 &g_browser_distribution); 101#endif 102 break; 103 104 case CHROME_FRAME: 105 dist = GetOrCreateBrowserDistribution<ChromeFrameDistribution>( 106 &g_chrome_frame_distribution); 107 break; 108 109 case CHROME_APP_HOST: 110 dist = GetOrCreateBrowserDistribution<ChromeAppHostDistribution>( 111 &g_chrome_app_host_distribution); 112 break; 113 114 default: 115 DCHECK_EQ(CHROME_BINARIES, type); 116#if defined(GOOGLE_CHROME_BUILD) 117 dist = GetOrCreateBrowserDistribution<GoogleChromeBinariesDistribution>( 118 &g_binaries_distribution); 119#else 120 dist = GetOrCreateBrowserDistribution<ChromiumBinariesDistribution>( 121 &g_binaries_distribution); 122#endif 123 } 124 125 return dist; 126} 127 128void BrowserDistribution::DoPostUninstallOperations( 129 const Version& version, const base::FilePath& local_data_path, 130 const base::string16& distribution_data) { 131} 132 133base::string16 BrowserDistribution::GetActiveSetupGuid() { 134 return kChromiumActiveSetupGuid; 135} 136 137base::string16 BrowserDistribution::GetAppGuid() { 138 return L""; 139} 140 141base::string16 BrowserDistribution::GetBaseAppName() { 142 return L"Chromium"; 143} 144 145base::string16 BrowserDistribution::GetDisplayName() { 146 return GetShortcutName(SHORTCUT_CHROME); 147} 148 149base::string16 BrowserDistribution::GetShortcutName( 150 ShortcutType shortcut_type) { 151 switch (shortcut_type) { 152 case SHORTCUT_CHROME_ALTERNATE: 153 // TODO(calamity): Change IDS_OEM_MAIN_SHORTCUT_NAME in 154 // chromium_strings.grd to "The Internet" (so that it doesn't collide with 155 // the value in google_chrome_strings.grd) then change this to 156 // installer::GetLocalizedString(IDS_OEM_MAIN_SHORTCUT_NAME_BASE) 157 return L"The Internet"; 158 case SHORTCUT_APP_LAUNCHER: 159 return installer::GetLocalizedString(IDS_APP_LIST_SHORTCUT_NAME_BASE); 160 default: 161 DCHECK_EQ(shortcut_type, SHORTCUT_CHROME); 162 return GetBaseAppName(); 163 } 164} 165 166int BrowserDistribution::GetIconIndex(ShortcutType shortcut_type) { 167 if (shortcut_type == SHORTCUT_APP_LAUNCHER) 168 return icon_resources::kAppLauncherIndex; 169 DCHECK(shortcut_type == SHORTCUT_CHROME || 170 shortcut_type == SHORTCUT_CHROME_ALTERNATE) << shortcut_type; 171 return icon_resources::kApplicationIndex; 172} 173 174base::string16 BrowserDistribution::GetIconFilename() { 175 return installer::kChromeExe; 176} 177 178base::string16 BrowserDistribution::GetStartMenuShortcutSubfolder( 179 Subfolder subfolder_type) { 180 switch (subfolder_type) { 181 case SUBFOLDER_APPS: 182 return installer::GetLocalizedString(IDS_APP_SHORTCUTS_SUBDIR_NAME_BASE); 183 default: 184 DCHECK_EQ(subfolder_type, SUBFOLDER_CHROME); 185 return GetShortcutName(SHORTCUT_CHROME); 186 } 187} 188 189base::string16 BrowserDistribution::GetBaseAppId() { 190 return L"Chromium"; 191} 192 193base::string16 BrowserDistribution::GetBrowserProgIdPrefix() { 194 // This used to be "ChromiumHTML", but was forced to become "ChromiumHTM" 195 // because of http://crbug.com/153349. See the declaration of this function 196 // in the header file for more details. 197 return L"ChromiumHTM"; 198} 199 200base::string16 BrowserDistribution::GetBrowserProgIdDesc() { 201 return L"Chromium HTML Document"; 202} 203 204 205base::string16 BrowserDistribution::GetInstallSubDir() { 206 return L"Chromium"; 207} 208 209base::string16 BrowserDistribution::GetPublisherName() { 210 return L"Chromium"; 211} 212 213base::string16 BrowserDistribution::GetAppDescription() { 214 return L"Browse the web"; 215} 216 217base::string16 BrowserDistribution::GetLongAppDescription() { 218 const base::string16& app_description = 219 installer::GetLocalizedString(IDS_PRODUCT_DESCRIPTION_BASE); 220 return app_description; 221} 222 223std::string BrowserDistribution::GetSafeBrowsingName() { 224 return "chromium"; 225} 226 227base::string16 BrowserDistribution::GetStateKey() { 228 return L"Software\\Chromium"; 229} 230 231base::string16 BrowserDistribution::GetStateMediumKey() { 232 return L"Software\\Chromium"; 233} 234 235std::string BrowserDistribution::GetNetworkStatsServer() const { 236 return ""; 237} 238 239std::string BrowserDistribution::GetHttpPipeliningTestServer() const { 240 return ""; 241} 242 243base::string16 BrowserDistribution::GetDistributionData(HKEY root_key) { 244 return L""; 245} 246 247base::string16 BrowserDistribution::GetUninstallLinkName() { 248 return L"Uninstall Chromium"; 249} 250 251base::string16 BrowserDistribution::GetUninstallRegPath() { 252 return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium"; 253} 254 255base::string16 BrowserDistribution::GetVersionKey() { 256 return L"Software\\Chromium"; 257} 258 259BrowserDistribution::DefaultBrowserControlPolicy 260 BrowserDistribution::GetDefaultBrowserControlPolicy() { 261 return DEFAULT_BROWSER_FULL_CONTROL; 262} 263 264bool BrowserDistribution::CanCreateDesktopShortcuts() { 265 return true; 266} 267 268bool BrowserDistribution::GetChromeChannel(base::string16* channel) { 269 return false; 270} 271 272bool BrowserDistribution::GetCommandExecuteImplClsid( 273 base::string16* handler_class_uuid) { 274 if (handler_class_uuid) 275 *handler_class_uuid = kCommandExecuteImplUuid; 276 return true; 277} 278 279bool BrowserDistribution::AppHostIsSupported() { 280 return false; 281} 282 283void BrowserDistribution::UpdateInstallStatus(bool system_install, 284 installer::ArchiveType archive_type, 285 installer::InstallStatus install_status) { 286} 287 288bool BrowserDistribution::ShouldSetExperimentLabels() { 289 return false; 290} 291 292bool BrowserDistribution::HasUserExperiments() { 293 return false; 294} 295