Index: chrome/installer/setup/uninstall.cc |
diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc |
index 8693dfa834d46f353876cf4909977a942142f695..0ba3187db181db0534288b4412a0fd215693ae85 100644 |
--- a/chrome/installer/setup/uninstall.cc |
+++ b/chrome/installer/setup/uninstall.cc |
@@ -328,52 +328,56 @@ void CloseChromeFrameHelperProcess() { |
} |
} |
-// Updates shortcuts to |old_target_exe| to target |new_target_exe| instead. If |
-// |require_args| is set, then only updates shortcuts with non-empty targets. |
-// This should only be called from user-level. |
-void RetargetShortcuts(const InstallerState& installer_state, |
- const Product& product, |
- const base::FilePath& old_target_exe, |
- const base::FilePath& new_target_exe, |
- bool require_args) { |
+// Updates shortcuts to |old_target_exe| that have non-empty args, making them |
+// target |new_target_exe| instead. The non-empty args requirement is a |
+// heuristic to determine whether a shortcut is "user-generated". This routine |
+// can only be called for user-level installs. |
+void RetargetUserShortcutsWithArgs(const InstallerState& installer_state, |
+ const Product& product, |
+ const base::FilePath& old_target_exe, |
+ const base::FilePath& new_target_exe) { |
+ if (installer_state.system_install()) { |
+ NOTREACHED(); |
+ return; |
+ } |
BrowserDistribution* dist = product.distribution(); |
- DCHECK(!installer_state.system_install()); |
ShellUtil::ShellChange install_level = ShellUtil::CURRENT_USER; |
ShellUtil::ShortcutProperties updated_properties(install_level); |
updated_properties.set_target(new_target_exe); |
+ // TODO(huangs): Make this data-driven, along with DeleteShortcuts(). |
VLOG(1) << "Retargeting Desktop shortcuts."; |
- if (!ShellUtil::UpdateShortcuts(ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist, |
- install_level, old_target_exe, require_args, |
- updated_properties)) { |
+ if (!ShellUtil::UpdateShortcutsWithArgs( |
+ ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist, install_level, |
+ old_target_exe, updated_properties)) { |
LOG(WARNING) << "Failed to retarget Desktop shortcuts."; |
} |
VLOG(1) << "Retargeting Quick Launch shortcuts."; |
- if (!ShellUtil::UpdateShortcuts(ShellUtil::SHORTCUT_LOCATION_QUICK_LAUNCH, |
- dist, install_level, old_target_exe, |
- require_args, updated_properties)) { |
+ if (!ShellUtil::UpdateShortcutsWithArgs( |
+ ShellUtil::SHORTCUT_LOCATION_QUICK_LAUNCH, dist, install_level, |
+ old_target_exe, updated_properties)) { |
LOG(WARNING) << "Failed to retarget Quick Launch shortcuts."; |
} |
VLOG(1) << "Retargeting Start Menu shortcuts."; |
- if (!ShellUtil::UpdateShortcuts(ShellUtil::SHORTCUT_LOCATION_START_MENU, dist, |
- install_level, old_target_exe, require_args, |
- updated_properties)) { |
+ if (!ShellUtil::UpdateShortcutsWithArgs( |
+ ShellUtil::SHORTCUT_LOCATION_START_MENU, dist, install_level, |
+ old_target_exe, updated_properties)) { |
LOG(WARNING) << "Failed to retarget Start Menu shortcuts."; |
} |
// Retarget pinned-to-taskbar shortcuts that point to |chrome_exe|. |
- if (!ShellUtil::UpdateShortcuts(ShellUtil::SHORTCUT_LOCATION_TASKBAR_PINS, |
- dist, ShellUtil::CURRENT_USER, old_target_exe, |
- require_args, updated_properties)) { |
+ if (!ShellUtil::UpdateShortcutsWithArgs( |
+ ShellUtil::SHORTCUT_LOCATION_TASKBAR_PINS, dist, |
+ ShellUtil::CURRENT_USER, old_target_exe, updated_properties)) { |
LOG(WARNING) << "Failed to retarget taskbar shortcuts at user-level."; |
} |
// Retarget the folder of secondary tiles from the start screen for |dist|. |
- if (!ShellUtil::UpdateShortcuts(ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS, |
- dist, install_level, old_target_exe, |
- require_args, updated_properties)) { |
+ if (!ShellUtil::UpdateShortcutsWithArgs( |
+ ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS, dist, install_level, |
+ old_target_exe, updated_properties)) { |
LOG(WARNING) << "Failed to retarget start-screen shortcuts."; |
} |
} |
@@ -1186,8 +1190,9 @@ InstallStatus UninstallProduct(const InstallationState& original_state, |
auto_launch_util::DisableAllAutoStartFeatures( |
ASCIIToUTF16(chrome::kInitialProfile)); |
- // Self-destruct flow: removing user-level Chrome because system-level |
- // Chrome exists. |
+ // If user-level chrome is self-destructing as a result of encountering a |
+ // system-level chrome, retarget owned non-default shortcuts (app shortcuts, |
+ // profile shortcuts, etc.) to the system-level chrome. |
if (cmd_line.HasSwitch(installer::switches::kSelfDestruct) && |
!installer_state.system_install()) { |
const base::FilePath system_chrome_path( |
@@ -1195,14 +1200,11 @@ InstallStatus UninstallProduct(const InstallationState& original_state, |
Append(installer::kChromeExe)); |
VLOG(1) << "Retargeting user-generated Chrome shortcuts."; |
if (base::PathExists(system_chrome_path)) { |
- // Retarget all user-generated shortcuts to user-level chrome.exe to |
- // system-level chrome.exe. Heuristic: consider only shortcuts that have |
- // non-empty args. Therefore the main user-level chrome.exe will not get |
- // retarged, and will get deleted by DeleteShortcuts() below. |
- RetargetShortcuts(installer_state, product, base::FilePath(chrome_exe), |
- system_chrome_path, true); |
+ RetargetUserShortcutsWithArgs(installer_state, product, |
+ base::FilePath(chrome_exe), |
+ system_chrome_path); |
} else { |
- VLOG(1) << "Retarget failed: system-level Chrome not found."; |
+ LOG(ERROR) << "Retarget failed: system-level Chrome not found."; |
} |
} |