browser_distribution.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/file_path.h"
15#include "base/path_service.h"
16#include "base/logging.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 kCommandExecuteImplUuid[] =
37    L"{A2DF06F9-A21A-44A8-8A99-8B9C84F29160}";
38
39// The BrowserDistribution objects are never freed.
40BrowserDistribution* g_browser_distribution = NULL;
41BrowserDistribution* g_chrome_frame_distribution = NULL;
42BrowserDistribution* g_binaries_distribution = NULL;
43BrowserDistribution* g_chrome_app_host_distribution = NULL;
44
45// Returns true if currently running in npchrome_frame.dll
46bool IsChromeFrameModule() {
47  FilePath module_path;
48  PathService::Get(base::FILE_MODULE, &module_path);
49  return FilePath::CompareEqualIgnoreCase(module_path.BaseName().value(),
50                                          installer::kChromeFrameDll);
51}
52
53BrowserDistribution::Type GetCurrentDistributionType() {
54  // TODO(erikwright): If the app host is installed, but not Chrome, perhaps
55  // this should return CHROME_APP_HOST.
56  static BrowserDistribution::Type type =
57      (MasterPreferences::ForCurrentProcess().install_chrome_frame() ||
58       IsChromeFrameModule()) ?
59          BrowserDistribution::CHROME_FRAME :
60          BrowserDistribution::CHROME_BROWSER;
61  return type;
62}
63
64}  // end namespace
65
66BrowserDistribution::BrowserDistribution()
67    : type_(CHROME_BROWSER) {
68}
69
70BrowserDistribution::BrowserDistribution(Type type)
71    : type_(type) {
72}
73
74template<class DistributionClass>
75BrowserDistribution* BrowserDistribution::GetOrCreateBrowserDistribution(
76    BrowserDistribution** dist) {
77  if (!*dist) {
78    DistributionClass* temp = new DistributionClass();
79    if (base::subtle::NoBarrier_CompareAndSwap(
80            reinterpret_cast<base::subtle::AtomicWord*>(dist), NULL,
81            reinterpret_cast<base::subtle::AtomicWord>(temp)) != NULL)
82      delete temp;
83  }
84
85  return *dist;
86}
87
88BrowserDistribution* BrowserDistribution::GetDistribution() {
89  return GetSpecificDistribution(GetCurrentDistributionType());
90}
91
92// static
93BrowserDistribution* BrowserDistribution::GetSpecificDistribution(
94    BrowserDistribution::Type type) {
95  BrowserDistribution* dist = NULL;
96
97  switch (type) {
98    case CHROME_BROWSER:
99#if defined(GOOGLE_CHROME_BUILD)
100      if (InstallUtil::IsChromeSxSProcess()) {
101        dist = GetOrCreateBrowserDistribution<GoogleChromeSxSDistribution>(
102            &g_browser_distribution);
103      } else {
104        dist = GetOrCreateBrowserDistribution<GoogleChromeDistribution>(
105            &g_browser_distribution);
106      }
107#else
108      dist = GetOrCreateBrowserDistribution<BrowserDistribution>(
109          &g_browser_distribution);
110#endif
111      break;
112
113    case CHROME_FRAME:
114      dist = GetOrCreateBrowserDistribution<ChromeFrameDistribution>(
115          &g_chrome_frame_distribution);
116      break;
117
118    case CHROME_APP_HOST:
119      dist = GetOrCreateBrowserDistribution<ChromeAppHostDistribution>(
120          &g_chrome_app_host_distribution);
121      break;
122
123    default:
124      DCHECK_EQ(CHROME_BINARIES, type);
125#if defined(GOOGLE_CHROME_BUILD)
126      dist = GetOrCreateBrowserDistribution<GoogleChromeBinariesDistribution>(
127          &g_binaries_distribution);
128#else
129      dist = GetOrCreateBrowserDistribution<ChromiumBinariesDistribution>(
130          &g_binaries_distribution);
131#endif
132  }
133
134  return dist;
135}
136
137void BrowserDistribution::DoPostUninstallOperations(
138    const Version& version, const FilePath& local_data_path,
139    const string16& distribution_data) {
140}
141
142string16 BrowserDistribution::GetAppGuid() {
143  return L"";
144}
145
146string16 BrowserDistribution::GetBaseAppName() {
147  return L"Chromium";
148}
149
150string16 BrowserDistribution::GetAppShortCutName() {
151  return GetBaseAppName();
152}
153
154string16 BrowserDistribution::GetAlternateApplicationName() {
155  return L"The Internet";
156}
157
158string16 BrowserDistribution::GetBaseAppId() {
159  return L"Chromium";
160}
161
162string16 BrowserDistribution::GetInstallSubDir() {
163  return L"Chromium";
164}
165
166string16 BrowserDistribution::GetPublisherName() {
167  return L"Chromium";
168}
169
170string16 BrowserDistribution::GetAppDescription() {
171  return L"Browse the web";
172}
173
174string16 BrowserDistribution::GetLongAppDescription() {
175  const string16& app_description =
176      installer::GetLocalizedString(IDS_PRODUCT_DESCRIPTION_BASE);
177  return app_description;
178}
179
180std::string BrowserDistribution::GetSafeBrowsingName() {
181  return "chromium";
182}
183
184string16 BrowserDistribution::GetStateKey() {
185  return L"Software\\Chromium";
186}
187
188string16 BrowserDistribution::GetStateMediumKey() {
189  return L"Software\\Chromium";
190}
191
192string16 BrowserDistribution::GetStatsServerURL() {
193  return L"";
194}
195
196std::string BrowserDistribution::GetNetworkStatsServer() const {
197  return "";
198}
199
200std::string BrowserDistribution::GetHttpPipeliningTestServer() const {
201  return "";
202}
203
204string16 BrowserDistribution::GetDistributionData(HKEY root_key) {
205  return L"";
206}
207
208string16 BrowserDistribution::GetUninstallLinkName() {
209  return L"Uninstall Chromium";
210}
211
212string16 BrowserDistribution::GetUninstallRegPath() {
213  return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium";
214}
215
216string16 BrowserDistribution::GetVersionKey() {
217  return L"Software\\Chromium";
218}
219
220bool BrowserDistribution::CanSetAsDefault() {
221  return true;
222}
223
224bool BrowserDistribution::CanCreateDesktopShortcuts() {
225  return true;
226}
227
228int BrowserDistribution::GetIconIndex() {
229  return 0;
230}
231
232bool BrowserDistribution::GetChromeChannel(string16* channel) {
233  return false;
234}
235
236bool BrowserDistribution::GetCommandExecuteImplClsid(
237    string16* handler_class_uuid) {
238  if (handler_class_uuid)
239    *handler_class_uuid = kCommandExecuteImplUuid;
240  return true;
241}
242
243void BrowserDistribution::UpdateInstallStatus(bool system_install,
244    installer::ArchiveType archive_type,
245    installer::InstallStatus install_status) {
246}
247
248bool BrowserDistribution::GetExperimentDetails(
249    UserExperiment* experiment, int flavor) {
250  return false;
251}
252
253void BrowserDistribution::LaunchUserExperiment(
254    const FilePath& setup_path, installer::InstallStatus status,
255    const Version& version, const installer::Product& product,
256    bool system_level) {
257}
258
259
260void BrowserDistribution::InactiveUserToastExperiment(int flavor,
261    const string16& experiment_group,
262    const installer::Product& installation,
263    const FilePath& application_path) {
264}
265