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