browser_distribution.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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
199string16 BrowserDistribution::GetStatsServerURL() {
200  return L"";
201}
202
203std::string BrowserDistribution::GetNetworkStatsServer() const {
204  return "";
205}
206
207std::string BrowserDistribution::GetHttpPipeliningTestServer() const {
208  return "";
209}
210
211string16 BrowserDistribution::GetDistributionData(HKEY root_key) {
212  return L"";
213}
214
215string16 BrowserDistribution::GetUninstallLinkName() {
216  return L"Uninstall Chromium";
217}
218
219string16 BrowserDistribution::GetUninstallRegPath() {
220  return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium";
221}
222
223string16 BrowserDistribution::GetVersionKey() {
224  return L"Software\\Chromium";
225}
226
227bool BrowserDistribution::CanSetAsDefault() {
228  return true;
229}
230
231bool BrowserDistribution::CanCreateDesktopShortcuts() {
232  return true;
233}
234
235string16 BrowserDistribution::GetIconFilename() {
236  return string16();
237}
238
239int BrowserDistribution::GetIconIndex() {
240  // Assuming that main icon appears first alphabetically in the resource file
241  // for GetIconFilename().
242  return 0;
243}
244
245bool BrowserDistribution::GetChromeChannel(string16* channel) {
246  return false;
247}
248
249bool BrowserDistribution::GetCommandExecuteImplClsid(
250    string16* handler_class_uuid) {
251  if (handler_class_uuid)
252    *handler_class_uuid = kCommandExecuteImplUuid;
253  return true;
254}
255
256bool BrowserDistribution::AppHostIsSupported() {
257  return false;
258}
259
260void BrowserDistribution::UpdateInstallStatus(bool system_install,
261    installer::ArchiveType archive_type,
262    installer::InstallStatus install_status) {
263}
264
265bool BrowserDistribution::ShouldSetExperimentLabels() {
266  return false;
267}
268
269bool BrowserDistribution::HasUserExperiments() {
270  return false;
271}
272