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