| Index: chrome/installer/util/shell_util.cc
|
| ===================================================================
|
| --- chrome/installer/util/shell_util.cc (revision 174984)
|
| +++ chrome/installer/util/shell_util.cc (working copy)
|
| @@ -1154,6 +1154,35 @@
|
| return ProbeOpenCommandHandlers(protocols, num_protocols);
|
| }
|
|
|
| +// Removes shortcut at |shortcut_path| if it is a shortcut that points to
|
| +// |target_exe|. If |delete_folder| is true, deletes the parent folder of
|
| +// the shortcut completely. Returns true if either the shortcut was deleted
|
| +// successfully or if the shortcut did not point to |target_exe|.
|
| +bool MaybeRemoveShortcutAtPath(const FilePath& shortcut_path,
|
| + const FilePath& target_exe,
|
| + bool delete_folder) {
|
| + FilePath target_path;
|
| + if (!base::win::ResolveShortcut(shortcut_path, &target_path, NULL))
|
| + return false;
|
| +
|
| + if (InstallUtil::ProgramCompare(target_exe).EvaluatePath(target_path)) {
|
| + // Unpin the shortcut if it was ever pinned by the user or the installer.
|
| + VLOG(1) << "Trying to unpin " << shortcut_path.value();
|
| + if (!base::win::TaskbarUnpinShortcutLink(shortcut_path.value().c_str())) {
|
| + VLOG(1) << shortcut_path.value()
|
| + << " wasn't pinned (or the unpin failed).";
|
| + }
|
| + if (delete_folder)
|
| + return file_util::Delete(shortcut_path.DirName(), true);
|
| + else
|
| + return file_util::Delete(shortcut_path, false);
|
| + }
|
| +
|
| + // The shortcut at |shortcut_path| doesn't point to |target_exe|, act as if
|
| + // our shortcut had been deleted.
|
| + return true;
|
| +}
|
| +
|
| } // namespace
|
|
|
| const wchar_t* ShellUtil::kRegDefaultIcon = L"\\DefaultIcon";
|
| @@ -1277,13 +1306,13 @@
|
| user_shortcut_path = user_shortcut_path.Append(shortcut_name);
|
| system_shortcut_path = system_shortcut_path.Append(shortcut_name);
|
|
|
| - FilePath *chosen_path;
|
| + FilePath* chosen_path;
|
| bool should_install_shortcut = true;
|
| if (properties.level == SYSTEM_LEVEL) {
|
| // Install the system-level shortcut if requested.
|
| chosen_path = &system_shortcut_path;
|
| } else if (operation != SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL ||
|
| - !file_util::PathExists(system_shortcut_path)){
|
| + !file_util::PathExists(system_shortcut_path)) {
|
| // Otherwise install the user-level shortcut, unless the system-level
|
| // variant of this shortcut is present on the machine and |operation| states
|
| // not to create a user-level shortcut in that case.
|
| @@ -1795,10 +1824,10 @@
|
|
|
| bool ShellUtil::RemoveShortcut(ShellUtil::ShortcutLocation location,
|
| BrowserDistribution* dist,
|
| - const string16& target_exe,
|
| + const FilePath& target_exe,
|
| ShellChange level,
|
| const string16* shortcut_name) {
|
| - bool delete_folder = (location == SHORTCUT_LOCATION_START_MENU);
|
| + const bool delete_folder = (location == SHORTCUT_LOCATION_START_MENU);
|
|
|
| FilePath shortcut_folder;
|
| if (!GetShortcutPath(location, dist, level, &shortcut_folder) ||
|
| @@ -1807,43 +1836,29 @@
|
| return false;
|
| }
|
|
|
| - string16 shortcut_base_name(
|
| + if (!delete_folder && !shortcut_name) {
|
| + file_util::FileEnumerator enumerator(shortcut_folder, false,
|
| + file_util::FileEnumerator::FILES);
|
| + bool had_failures = false;
|
| + for (FilePath path = enumerator.Next(); !path.empty();
|
| + path = enumerator.Next()) {
|
| + if (path.Extension() != installer::kLnkExt)
|
| + continue;
|
| +
|
| + if (!MaybeRemoveShortcutAtPath(path, target_exe, delete_folder))
|
| + had_failures = true;
|
| + }
|
| + return !had_failures;
|
| + }
|
| +
|
| + const string16 shortcut_base_name(
|
| (shortcut_name ? *shortcut_name : dist->GetAppShortCutName()) +
|
| installer::kLnkExt);
|
| - FilePath shortcut_path(shortcut_folder.Append(shortcut_base_name));
|
| -
|
| + const FilePath shortcut_path(shortcut_folder.Append(shortcut_base_name));
|
| if (!file_util::PathExists(shortcut_path))
|
| return true;
|
|
|
| - base::win::ScopedComPtr<IShellLink> i_shell_link;
|
| - base::win::ScopedComPtr<IPersistFile> i_persist_file;
|
| - wchar_t read_target[MAX_PATH] = {};
|
| - if (FAILED(i_shell_link.CreateInstance(CLSID_ShellLink, NULL,
|
| - CLSCTX_INPROC_SERVER)) ||
|
| - FAILED(i_persist_file.QueryFrom(i_shell_link)) ||
|
| - FAILED(i_persist_file->Load(shortcut_path.value().c_str(), STGM_READ)) ||
|
| - FAILED(i_shell_link->GetPath(read_target, MAX_PATH, NULL,
|
| - SLGP_SHORTPATH))) {
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -
|
| - if (InstallUtil::ProgramCompare(FilePath(target_exe)).Evaluate(read_target)) {
|
| - // Unpin the shortcut if it was ever pinned by the user or the installer.
|
| - VLOG(1) << "Trying to unpin " << shortcut_path.value();
|
| - if (!base::win::TaskbarUnpinShortcutLink(shortcut_path.value().c_str())) {
|
| - VLOG(1) << shortcut_path.value()
|
| - << " wasn't pinned (or the unpin failed).";
|
| - }
|
| - if (delete_folder)
|
| - return file_util::Delete(shortcut_folder, true);
|
| - else
|
| - return file_util::Delete(shortcut_path, false);
|
| - }
|
| -
|
| - // The shortcut at |shortcut_path| doesn't point to |target_exe|, act as if
|
| - // our shortcut had been deleted.
|
| - return true;
|
| + return MaybeRemoveShortcutAtPath(shortcut_path, target_exe, delete_folder);
|
| }
|
|
|
| void ShellUtil::RemoveTaskbarShortcuts(const string16& target_exe) {
|
|
|