Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: chrome/installer/util/shell_util.cc

Issue 1289333005: Change shortcut install location to non-subdir. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: added menu_root to cleanup code Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 functions that integrate Chrome in Windows shell. These 5 // This file defines functions that integrate Chrome in Windows shell. These
6 // functions can be used by Chrome as well as Chrome installer. All of the 6 // functions can be used by Chrome as well as Chrome installer. All of the
7 // work is done by the local functions defined in anonymous namespace in 7 // work is done by the local functions defined in anonymous namespace in
8 // this class. 8 // this class.
9 9
10 #include "chrome/installer/util/shell_util.h" 10 #include "chrome/installer/util/shell_util.h"
(...skipping 1558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 } 1569 }
1570 1570
1571 1571
1572 // If the folder specified by {|location|, |dist|, |level|} is empty, remove it. 1572 // If the folder specified by {|location|, |dist|, |level|} is empty, remove it.
1573 // Otherwise do nothing. Returns true on success, including the vacuous case 1573 // Otherwise do nothing. Returns true on success, including the vacuous case
1574 // where no deletion occurred because directory is non-empty. 1574 // where no deletion occurred because directory is non-empty.
1575 bool RemoveShortcutFolderIfEmpty(ShellUtil::ShortcutLocation location, 1575 bool RemoveShortcutFolderIfEmpty(ShellUtil::ShortcutLocation location,
1576 BrowserDistribution* dist, 1576 BrowserDistribution* dist,
1577 ShellUtil::ShellChange level) { 1577 ShellUtil::ShellChange level) {
1578 // Explicitly whitelist locations, since accidental calls can be very harmful. 1578 // Explicitly whitelist locations, since accidental calls can be very harmful.
1579 if (location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_DIR && 1579 if (location !=
1580 ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED &&
1580 location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR && 1581 location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR &&
1581 location != ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS) { 1582 location != ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS) {
1582 NOTREACHED(); 1583 NOTREACHED();
1583 return false; 1584 return false;
1584 } 1585 }
1585 1586
1586 base::FilePath shortcut_folder; 1587 base::FilePath shortcut_folder;
1587 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) { 1588 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) {
1588 LOG(WARNING) << "Cannot find path at location " << location; 1589 LOG(WARNING) << "Cannot find path at location " << location;
1589 return false; 1590 return false;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 return QuickIsChromeRegistered(dist, chrome_exe, suffix, 1655 return QuickIsChromeRegistered(dist, chrome_exe, suffix,
1655 CONFIRM_SHELL_REGISTRATION_IN_HKLM); 1656 CONFIRM_SHELL_REGISTRATION_IN_HKLM);
1656 } 1657 }
1657 1658
1658 bool ShellUtil::ShortcutLocationIsSupported( 1659 bool ShellUtil::ShortcutLocationIsSupported(
1659 ShellUtil::ShortcutLocation location) { 1660 ShellUtil::ShortcutLocation location) {
1660 switch (location) { 1661 switch (location) {
1661 case SHORTCUT_LOCATION_DESKTOP: // Falls through. 1662 case SHORTCUT_LOCATION_DESKTOP: // Falls through.
1662 case SHORTCUT_LOCATION_QUICK_LAUNCH: // Falls through. 1663 case SHORTCUT_LOCATION_QUICK_LAUNCH: // Falls through.
1663 case SHORTCUT_LOCATION_START_MENU_ROOT: // Falls through. 1664 case SHORTCUT_LOCATION_START_MENU_ROOT: // Falls through.
1664 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR: // Falls through. 1665 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED: // Falls through.
1665 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: 1666 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR:
1666 return true; 1667 return true;
1667 case SHORTCUT_LOCATION_TASKBAR_PINS: 1668 case SHORTCUT_LOCATION_TASKBAR_PINS:
1668 return base::win::GetVersion() >= base::win::VERSION_WIN7; 1669 return base::win::GetVersion() >= base::win::VERSION_WIN7;
1669 case SHORTCUT_LOCATION_APP_SHORTCUTS: 1670 case SHORTCUT_LOCATION_APP_SHORTCUTS:
1670 return base::win::GetVersion() >= base::win::VERSION_WIN8; 1671 return base::win::GetVersion() >= base::win::VERSION_WIN8;
1671 default: 1672 default:
1672 NOTREACHED(); 1673 NOTREACHED();
1673 return false; 1674 return false;
1674 } 1675 }
(...skipping 13 matching lines...) Expand all
1688 break; 1689 break;
1689 case SHORTCUT_LOCATION_QUICK_LAUNCH: 1690 case SHORTCUT_LOCATION_QUICK_LAUNCH:
1690 // There is no support for a system-level Quick Launch shortcut. 1691 // There is no support for a system-level Quick Launch shortcut.
1691 DCHECK_EQ(level, CURRENT_USER); 1692 DCHECK_EQ(level, CURRENT_USER);
1692 dir_key = base::DIR_USER_QUICK_LAUNCH; 1693 dir_key = base::DIR_USER_QUICK_LAUNCH;
1693 break; 1694 break;
1694 case SHORTCUT_LOCATION_START_MENU_ROOT: 1695 case SHORTCUT_LOCATION_START_MENU_ROOT:
1695 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : 1696 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU :
1696 base::DIR_COMMON_START_MENU; 1697 base::DIR_COMMON_START_MENU;
1697 break; 1698 break;
1698 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR: 1699 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED:
1699 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : 1700 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU :
1700 base::DIR_COMMON_START_MENU; 1701 base::DIR_COMMON_START_MENU;
1701 folder_to_append = dist->GetStartMenuShortcutSubfolder( 1702 folder_to_append = dist->GetStartMenuShortcutSubfolder(
1702 BrowserDistribution::SUBFOLDER_CHROME); 1703 BrowserDistribution::SUBFOLDER_CHROME);
1703 break; 1704 break;
1704 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: 1705 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR:
1705 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : 1706 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU :
1706 base::DIR_COMMON_START_MENU; 1707 base::DIR_COMMON_START_MENU;
1707 folder_to_append = dist->GetStartMenuShortcutSubfolder( 1708 folder_to_append = dist->GetStartMenuShortcutSubfolder(
1708 BrowserDistribution::SUBFOLDER_APPS); 1709 BrowserDistribution::SUBFOLDER_APPS);
(...skipping 14 matching lines...) Expand all
1723 NOTREACHED() << dir_key; 1724 NOTREACHED() << dir_key;
1724 return false; 1725 return false;
1725 } 1726 }
1726 1727
1727 if (!folder_to_append.empty()) 1728 if (!folder_to_append.empty())
1728 *path = path->Append(folder_to_append); 1729 *path = path->Append(folder_to_append);
1729 1730
1730 return true; 1731 return true;
1731 } 1732 }
1732 1733
1734 bool ShellUtil::MoveExistingShortcut(
grt (UTC plus 2) 2015/10/20 18:10:30 formatting nit: bool ShellUtil::MoveExistingShortc
bcwhite 2015/10/20 18:25:43 Done.
1735 ShortcutLocation old_location,
1736 ShortcutLocation new_location,
1737 BrowserDistribution* dist,
1738 const ShortcutProperties& properties) {
1739 // Explicitly whitelist locations to which this is applicable.
1740 if (old_location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED ||
1741 new_location != SHORTCUT_LOCATION_START_MENU_ROOT) {
1742 NOTREACHED();
1743 return false;
1744 }
1745
1746 base::string16 shortcut_name(
gab 2015/10/20 18:25:59 const
1747 ExtractShortcutNameFromProperties(dist, properties));
1748
1749 base::FilePath old_shortcut_path;
1750 base::FilePath new_shortcut_path;
1751 GetShortcutPath(
grt (UTC plus 2) 2015/10/20 18:10:30 nit: GetShortcutPath(old_location, dist, propert
bcwhite 2015/10/20 18:25:43 Done.
1752 old_location, dist, properties.level, &old_shortcut_path);
1753 GetShortcutPath(
1754 new_location, dist, properties.level, &new_shortcut_path);
1755 old_shortcut_path = old_shortcut_path.Append(shortcut_name);
1756 new_shortcut_path = new_shortcut_path.Append(shortcut_name);
1757
1758 bool result = base::Move(old_shortcut_path, new_shortcut_path);
1759
gab 2015/10/20 18:25:59 I'd say rm this empty line. (or otherwise add an
bcwhite 2015/10/20 19:03:12 Done.
1760 RemoveShortcutFolderIfEmpty(old_location, dist, properties.level);
1761 return result;
1762 }
1763
1733 bool ShellUtil::CreateOrUpdateShortcut( 1764 bool ShellUtil::CreateOrUpdateShortcut(
1734 ShellUtil::ShortcutLocation location, 1765 ShellUtil::ShortcutLocation location,
gab 2015/10/20 18:25:59 Seems like you're cleaning up those extra namespac
bcwhite 2015/10/20 19:03:12 I was a little hesitant about that. Done.
1735 BrowserDistribution* dist, 1766 BrowserDistribution* dist,
1736 const ShellUtil::ShortcutProperties& properties, 1767 const ShellUtil::ShortcutProperties& properties,
1737 ShellUtil::ShortcutOperation operation) { 1768 ShellUtil::ShortcutOperation operation) {
1738 // Explicitly whitelist locations to which this is applicable. 1769 // Explicitly whitelist locations to which this is applicable.
1739 if (location != SHORTCUT_LOCATION_DESKTOP && 1770 if (location != SHORTCUT_LOCATION_DESKTOP &&
1740 location != SHORTCUT_LOCATION_QUICK_LAUNCH && 1771 location != SHORTCUT_LOCATION_QUICK_LAUNCH &&
1741 location != SHORTCUT_LOCATION_START_MENU_ROOT && 1772 location != SHORTCUT_LOCATION_START_MENU_ROOT &&
1742 location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR && 1773 location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED &&
1743 location != SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR) { 1774 location != SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR) {
1744 NOTREACHED(); 1775 NOTREACHED();
1745 return false; 1776 return false;
1746 } 1777 }
1747 1778
1748 DCHECK(dist); 1779 DCHECK(dist);
1749 // |pin_to_taskbar| is only acknowledged when first creating the shortcut. 1780 // |pin_to_taskbar| is only acknowledged when first creating the shortcut.
1750 DCHECK(!properties.pin_to_taskbar || 1781 DCHECK(!properties.pin_to_taskbar ||
1751 operation == SHELL_SHORTCUT_CREATE_ALWAYS || 1782 operation == SHELL_SHORTCUT_CREATE_ALWAYS ||
1752 operation == SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL); 1783 operation == SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL);
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
2393 // Main operation to apply to each shortcut in the directory specified. 2424 // Main operation to apply to each shortcut in the directory specified.
2394 ShortcutOperationCallback shortcut_operation( 2425 ShortcutOperationCallback shortcut_operation(
2395 location == SHORTCUT_LOCATION_TASKBAR_PINS 2426 location == SHORTCUT_LOCATION_TASKBAR_PINS
2396 ? base::Bind(&ShortcutOpUnpinFromTaskbar) 2427 ? base::Bind(&ShortcutOpUnpinFromTaskbar)
2397 : base::Bind(&ShortcutOpDelete)); 2428 : base::Bind(&ShortcutOpDelete));
2398 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), 2429 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(),
2399 shortcut_operation, location, dist, level, 2430 shortcut_operation, location, dist, level,
2400 NULL); 2431 NULL);
2401 // Remove chrome-specific shortcut folders if they are now empty. 2432 // Remove chrome-specific shortcut folders if they are now empty.
2402 if (success && 2433 if (success &&
2403 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR || 2434 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED ||
2404 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR || 2435 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR ||
2405 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { 2436 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) {
2406 success = RemoveShortcutFolderIfEmpty(location, dist, level); 2437 success = RemoveShortcutFolderIfEmpty(location, dist, level);
2407 } 2438 }
2408 return success; 2439 return success;
2409 } 2440 }
2410 2441
2411 // static 2442 // static
2412 bool ShellUtil::RetargetShortcutsWithArgs( 2443 bool ShellUtil::RetargetShortcutsWithArgs(
2413 ShellUtil::ShortcutLocation location, 2444 ShellUtil::ShortcutLocation location,
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
2559 base::string16 key_path(ShellUtil::kRegClasses); 2590 base::string16 key_path(ShellUtil::kRegClasses);
2560 key_path.push_back(base::FilePath::kSeparators[0]); 2591 key_path.push_back(base::FilePath::kSeparators[0]);
2561 key_path.append(prog_id); 2592 key_path.append(prog_id);
2562 return InstallUtil::DeleteRegistryKey( 2593 return InstallUtil::DeleteRegistryKey(
2563 HKEY_CURRENT_USER, key_path, WorkItem::kWow64Default); 2594 HKEY_CURRENT_USER, key_path, WorkItem::kWow64Default);
2564 2595
2565 // TODO(mgiuca): Remove the extension association entries. This requires that 2596 // TODO(mgiuca): Remove the extension association entries. This requires that
2566 // the extensions associated with a particular prog_id are stored in that 2597 // the extensions associated with a particular prog_id are stored in that
2567 // prog_id's key. 2598 // prog_id's key.
2568 } 2599 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698