OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // This file defines the methods useful for uninstalling Chrome. | 5 // This file defines the methods useful for uninstalling Chrome. |
6 | 6 |
7 #include "chrome/installer/setup/uninstall.h" | 7 #include "chrome/installer/setup/uninstall.h" |
8 | 8 |
9 #include <windows.h> | 9 #include <windows.h> |
10 | 10 |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
249 // We try to remove the standard desktop shortcut but if that fails we try | 249 // We try to remove the standard desktop shortcut but if that fails we try |
250 // to remove the alternate desktop shortcut. Only one of them should be | 250 // to remove the alternate desktop shortcut. Only one of them should be |
251 // present in a given install but at this point we don't know which one. | 251 // present in a given install but at this point we don't know which one. |
252 void DeleteChromeShortcuts(const InstallerState& installer_state, | 252 void DeleteChromeShortcuts(const InstallerState& installer_state, |
253 const Product& product) { | 253 const Product& product) { |
254 if (!product.is_chrome()) { | 254 if (!product.is_chrome()) { |
255 VLOG(1) << __FUNCTION__ " called for non-CHROME distribution"; | 255 VLOG(1) << __FUNCTION__ " called for non-CHROME distribution"; |
256 return; | 256 return; |
257 } | 257 } |
258 | 258 |
259 BrowserDistribution* dist = product.distribution(); | |
260 | |
261 uint32 options = | |
262 installer_state.system_install() ? ShellUtil::SHORTCUT_SYSTEM_LEVEL : | |
263 ShellUtil::SHORTCUT_NO_OPTIONS; | |
264 | |
265 VLOG(1) << "Deleting Desktop shortcut."; | |
266 if (!ShellUtil::RemoveChromeShortcut( | |
267 ShellUtil::SHORTCUT_DESKTOP, dist, options) && | |
268 !ShellUtil::RemoveChromeShortcut( | |
robertshield
2012/08/22 21:39:07
I suspect this will cause the second call to Remov
| |
269 ShellUtil::SHORTCUT_DESKTOP, dist, | |
270 options | ShellUtil::SHORTCUT_ALTERNATE)) { | |
271 LOG(WARNING) << "Failed to delete Desktop shortcut."; | |
272 } | |
273 | |
274 VLOG(1) << "Deleting Quick Launch shortcut."; | |
275 if (!ShellUtil::RemoveChromeShortcut( | |
276 ShellUtil::SHORTCUT_QUICK_LAUNCH, dist, options)) { | |
277 LOG(WARNING) << "Failed to delete Quick Launch shortcut."; | |
278 } | |
279 | |
259 FilePath shortcut_path; | 280 FilePath shortcut_path; |
260 if (installer_state.system_install()) { | 281 ShellUtil::GetShortcutPath( |
261 PathService::Get(base::DIR_COMMON_START_MENU, &shortcut_path); | 282 ShellUtil::SHORTCUT_START_MENU, installer_state.system_install(), |
262 if (!ShellUtil::RemoveChromeDesktopShortcut( | 283 &shortcut_path); |
263 product.distribution(), | |
264 ShellUtil::CURRENT_USER | ShellUtil::SYSTEM_LEVEL, | |
265 ShellUtil::SHORTCUT_NO_OPTIONS)) { | |
266 ShellUtil::RemoveChromeDesktopShortcut( | |
267 product.distribution(), | |
268 ShellUtil::CURRENT_USER | ShellUtil::SYSTEM_LEVEL, | |
269 ShellUtil::SHORTCUT_ALTERNATE); | |
270 } | |
271 | 284 |
272 ShellUtil::RemoveChromeQuickLaunchShortcut(product.distribution(), | 285 if (shortcut_path.empty()) { |
273 ShellUtil::CURRENT_USER | ShellUtil::SYSTEM_LEVEL); | 286 LOG(ERROR) << "Failed to get location for Start Menu shortcuts."; |
274 } else { | 287 } else { |
275 PathService::Get(base::DIR_START_MENU, &shortcut_path); | 288 const FilePath shortcut_link( |
276 if (!ShellUtil::RemoveChromeDesktopShortcut(product.distribution(), | 289 shortcut_path.Append(dist->GetAppShortCutName() + L".lnk")); |
277 ShellUtil::CURRENT_USER, ShellUtil::SHORTCUT_NO_OPTIONS)) { | |
278 ShellUtil::RemoveChromeDesktopShortcut(product.distribution(), | |
279 ShellUtil::CURRENT_USER, ShellUtil::SHORTCUT_ALTERNATE); | |
280 } | |
281 | |
282 ShellUtil::RemoveChromeQuickLaunchShortcut(product.distribution(), | |
283 ShellUtil::CURRENT_USER); | |
284 } | |
285 if (shortcut_path.empty()) { | |
286 LOG(ERROR) << "Failed to get location for shortcut."; | |
287 } else { | |
288 const string16 product_name(product.distribution()->GetAppShortCutName()); | |
289 shortcut_path = shortcut_path.Append(product_name); | |
290 | |
291 FilePath shortcut_link(shortcut_path.Append(product_name + L".lnk")); | |
292 | 290 |
293 VLOG(1) << "Unpinning shortcut at " << shortcut_link.value() | 291 VLOG(1) << "Unpinning shortcut at " << shortcut_link.value() |
294 << " from taskbar"; | 292 << " from taskbar"; |
295 // Ignore return value: keep uninstalling if the unpin fails. | 293 // Ignore return value: keep uninstalling if the unpin fails. |
296 file_util::TaskbarUnpinShortcutLink(shortcut_link.value().c_str()); | 294 file_util::TaskbarUnpinShortcutLink(shortcut_link.value().c_str()); |
297 | 295 |
298 VLOG(1) << "Deleting shortcut " << shortcut_path.value(); | 296 VLOG(1) << "Deleting Start Menu shortcuts folder " << shortcut_path.value(); |
299 if (!file_util::Delete(shortcut_path, true)) | 297 if (!file_util::Delete(shortcut_path, true)) |
300 LOG(ERROR) << "Failed to delete folder: " << shortcut_path.value(); | 298 LOG(ERROR) << "Failed to delete folder: " << shortcut_path.value(); |
301 } | 299 } |
302 } | 300 } |
303 | 301 |
304 bool ScheduleParentAndGrandparentForDeletion(const FilePath& path) { | 302 bool ScheduleParentAndGrandparentForDeletion(const FilePath& path) { |
305 FilePath parent_dir = path.DirName(); | 303 FilePath parent_dir = path.DirName(); |
306 bool ret = ScheduleFileSystemEntityForDeletion(parent_dir.value().c_str()); | 304 bool ret = ScheduleFileSystemEntityForDeletion(parent_dir.value().c_str()); |
307 if (!ret) { | 305 if (!ret) { |
308 LOG(ERROR) << "Failed to schedule parent dir for deletion: " | 306 LOG(ERROR) << "Failed to schedule parent dir for deletion: " |
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1180 | 1178 |
1181 // Try and delete the preserved local state once the post-install | 1179 // Try and delete the preserved local state once the post-install |
1182 // operations are complete. | 1180 // operations are complete. |
1183 if (!backup_state_file.empty()) | 1181 if (!backup_state_file.empty()) |
1184 file_util::Delete(backup_state_file, false); | 1182 file_util::Delete(backup_state_file, false); |
1185 | 1183 |
1186 return ret; | 1184 return ret; |
1187 } | 1185 } |
1188 | 1186 |
1189 } // namespace installer | 1187 } // namespace installer |
OLD | NEW |