| 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 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 1519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 } | 1530 } |
| 1531 | 1531 |
| 1532 | 1532 |
| 1533 // If the folder specified by {|location|, |dist|, |level|} is empty, remove it. | 1533 // If the folder specified by {|location|, |dist|, |level|} is empty, remove it. |
| 1534 // Otherwise do nothing. Returns true on success, including the vacuous case | 1534 // Otherwise do nothing. Returns true on success, including the vacuous case |
| 1535 // where no deletion occurred because directory is non-empty. | 1535 // where no deletion occurred because directory is non-empty. |
| 1536 bool RemoveShortcutFolderIfEmpty(ShellUtil::ShortcutLocation location, | 1536 bool RemoveShortcutFolderIfEmpty(ShellUtil::ShortcutLocation location, |
| 1537 BrowserDistribution* dist, | 1537 BrowserDistribution* dist, |
| 1538 ShellUtil::ShellChange level) { | 1538 ShellUtil::ShellChange level) { |
| 1539 // Explicitly whitelist locations, since accidental calls can be very harmful. | 1539 // Explicitly whitelist locations, since accidental calls can be very harmful. |
| 1540 if (location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_DIR && | 1540 if (location != |
| 1541 ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED && |
| 1541 location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR && | 1542 location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR && |
| 1542 location != ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS) { | 1543 location != ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS) { |
| 1543 NOTREACHED(); | 1544 NOTREACHED(); |
| 1544 return false; | 1545 return false; |
| 1545 } | 1546 } |
| 1546 | 1547 |
| 1547 base::FilePath shortcut_folder; | 1548 base::FilePath shortcut_folder; |
| 1548 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) { | 1549 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) { |
| 1549 LOG(WARNING) << "Cannot find path at location " << location; | 1550 LOG(WARNING) << "Cannot find path at location " << location; |
| 1550 return false; | 1551 return false; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1609 ShellUtil::ShortcutProperties::~ShortcutProperties() { | 1610 ShellUtil::ShortcutProperties::~ShortcutProperties() { |
| 1610 } | 1611 } |
| 1611 | 1612 |
| 1612 bool ShellUtil::QuickIsChromeRegisteredInHKLM(BrowserDistribution* dist, | 1613 bool ShellUtil::QuickIsChromeRegisteredInHKLM(BrowserDistribution* dist, |
| 1613 const base::FilePath& chrome_exe, | 1614 const base::FilePath& chrome_exe, |
| 1614 const base::string16& suffix) { | 1615 const base::string16& suffix) { |
| 1615 return QuickIsChromeRegistered(dist, chrome_exe, suffix, | 1616 return QuickIsChromeRegistered(dist, chrome_exe, suffix, |
| 1616 CONFIRM_SHELL_REGISTRATION_IN_HKLM); | 1617 CONFIRM_SHELL_REGISTRATION_IN_HKLM); |
| 1617 } | 1618 } |
| 1618 | 1619 |
| 1619 bool ShellUtil::ShortcutLocationIsSupported( | 1620 bool ShellUtil::ShortcutLocationIsSupported(ShortcutLocation location) { |
| 1620 ShellUtil::ShortcutLocation location) { | |
| 1621 switch (location) { | 1621 switch (location) { |
| 1622 case SHORTCUT_LOCATION_DESKTOP: // Falls through. | 1622 case SHORTCUT_LOCATION_DESKTOP: // Falls through. |
| 1623 case SHORTCUT_LOCATION_QUICK_LAUNCH: // Falls through. | 1623 case SHORTCUT_LOCATION_QUICK_LAUNCH: // Falls through. |
| 1624 case SHORTCUT_LOCATION_START_MENU_ROOT: // Falls through. | 1624 case SHORTCUT_LOCATION_START_MENU_ROOT: // Falls through. |
| 1625 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR: // Falls through. | 1625 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED: // Falls through. |
| 1626 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: | 1626 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: |
| 1627 return true; | 1627 return true; |
| 1628 case SHORTCUT_LOCATION_TASKBAR_PINS: | 1628 case SHORTCUT_LOCATION_TASKBAR_PINS: |
| 1629 return base::win::GetVersion() >= base::win::VERSION_WIN7; | 1629 return base::win::GetVersion() >= base::win::VERSION_WIN7; |
| 1630 case SHORTCUT_LOCATION_APP_SHORTCUTS: | 1630 case SHORTCUT_LOCATION_APP_SHORTCUTS: |
| 1631 return base::win::GetVersion() >= base::win::VERSION_WIN8; | 1631 return base::win::GetVersion() >= base::win::VERSION_WIN8; |
| 1632 default: | 1632 default: |
| 1633 NOTREACHED(); | 1633 NOTREACHED(); |
| 1634 return false; | 1634 return false; |
| 1635 } | 1635 } |
| 1636 } | 1636 } |
| 1637 | 1637 |
| 1638 bool ShellUtil::GetShortcutPath(ShellUtil::ShortcutLocation location, | 1638 bool ShellUtil::GetShortcutPath(ShortcutLocation location, |
| 1639 BrowserDistribution* dist, | 1639 BrowserDistribution* dist, |
| 1640 ShellChange level, | 1640 ShellChange level, |
| 1641 base::FilePath* path) { | 1641 base::FilePath* path) { |
| 1642 DCHECK(path); | 1642 DCHECK(path); |
| 1643 int dir_key = -1; | 1643 int dir_key = -1; |
| 1644 base::string16 folder_to_append; | 1644 base::string16 folder_to_append; |
| 1645 switch (location) { | 1645 switch (location) { |
| 1646 case SHORTCUT_LOCATION_DESKTOP: | 1646 case SHORTCUT_LOCATION_DESKTOP: |
| 1647 dir_key = (level == CURRENT_USER) ? base::DIR_USER_DESKTOP : | 1647 dir_key = (level == CURRENT_USER) ? base::DIR_USER_DESKTOP : |
| 1648 base::DIR_COMMON_DESKTOP; | 1648 base::DIR_COMMON_DESKTOP; |
| 1649 break; | 1649 break; |
| 1650 case SHORTCUT_LOCATION_QUICK_LAUNCH: | 1650 case SHORTCUT_LOCATION_QUICK_LAUNCH: |
| 1651 // There is no support for a system-level Quick Launch shortcut. | 1651 // There is no support for a system-level Quick Launch shortcut. |
| 1652 DCHECK_EQ(level, CURRENT_USER); | 1652 DCHECK_EQ(level, CURRENT_USER); |
| 1653 dir_key = base::DIR_USER_QUICK_LAUNCH; | 1653 dir_key = base::DIR_USER_QUICK_LAUNCH; |
| 1654 break; | 1654 break; |
| 1655 case SHORTCUT_LOCATION_START_MENU_ROOT: | 1655 case SHORTCUT_LOCATION_START_MENU_ROOT: |
| 1656 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : | 1656 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : |
| 1657 base::DIR_COMMON_START_MENU; | 1657 base::DIR_COMMON_START_MENU; |
| 1658 break; | 1658 break; |
| 1659 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR: | 1659 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED: |
| 1660 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : | 1660 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : |
| 1661 base::DIR_COMMON_START_MENU; | 1661 base::DIR_COMMON_START_MENU; |
| 1662 folder_to_append = dist->GetStartMenuShortcutSubfolder( | 1662 folder_to_append = dist->GetStartMenuShortcutSubfolder( |
| 1663 BrowserDistribution::SUBFOLDER_CHROME); | 1663 BrowserDistribution::SUBFOLDER_CHROME); |
| 1664 break; | 1664 break; |
| 1665 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: | 1665 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: |
| 1666 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : | 1666 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : |
| 1667 base::DIR_COMMON_START_MENU; | 1667 base::DIR_COMMON_START_MENU; |
| 1668 folder_to_append = dist->GetStartMenuShortcutSubfolder( | 1668 folder_to_append = dist->GetStartMenuShortcutSubfolder( |
| 1669 BrowserDistribution::SUBFOLDER_APPS); | 1669 BrowserDistribution::SUBFOLDER_APPS); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1684 NOTREACHED() << dir_key; | 1684 NOTREACHED() << dir_key; |
| 1685 return false; | 1685 return false; |
| 1686 } | 1686 } |
| 1687 | 1687 |
| 1688 if (!folder_to_append.empty()) | 1688 if (!folder_to_append.empty()) |
| 1689 *path = path->Append(folder_to_append); | 1689 *path = path->Append(folder_to_append); |
| 1690 | 1690 |
| 1691 return true; | 1691 return true; |
| 1692 } | 1692 } |
| 1693 | 1693 |
| 1694 bool ShellUtil::MoveExistingShortcut(ShortcutLocation old_location, |
| 1695 ShortcutLocation new_location, |
| 1696 BrowserDistribution* dist, |
| 1697 const ShortcutProperties& properties) { |
| 1698 // Explicitly whitelist locations to which this is applicable. |
| 1699 if (old_location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED || |
| 1700 new_location != SHORTCUT_LOCATION_START_MENU_ROOT) { |
| 1701 NOTREACHED(); |
| 1702 return false; |
| 1703 } |
| 1704 |
| 1705 base::string16 shortcut_name( |
| 1706 ExtractShortcutNameFromProperties(dist, properties)); |
| 1707 |
| 1708 base::FilePath old_shortcut_path; |
| 1709 base::FilePath new_shortcut_path; |
| 1710 GetShortcutPath(old_location, dist, properties.level, &old_shortcut_path); |
| 1711 GetShortcutPath(new_location, dist, properties.level, &new_shortcut_path); |
| 1712 old_shortcut_path = old_shortcut_path.Append(shortcut_name); |
| 1713 new_shortcut_path = new_shortcut_path.Append(shortcut_name); |
| 1714 |
| 1715 bool result = base::Move(old_shortcut_path, new_shortcut_path); |
| 1716 RemoveShortcutFolderIfEmpty(old_location, dist, properties.level); |
| 1717 return result; |
| 1718 } |
| 1719 |
| 1694 bool ShellUtil::CreateOrUpdateShortcut( | 1720 bool ShellUtil::CreateOrUpdateShortcut( |
| 1695 ShellUtil::ShortcutLocation location, | 1721 ShortcutLocation location, |
| 1696 BrowserDistribution* dist, | 1722 BrowserDistribution* dist, |
| 1697 const ShellUtil::ShortcutProperties& properties, | 1723 const ShortcutProperties& properties, |
| 1698 ShellUtil::ShortcutOperation operation) { | 1724 ShortcutOperation operation) { |
| 1699 // Explicitly whitelist locations to which this is applicable. | 1725 // Explicitly whitelist locations to which this is applicable. |
| 1700 if (location != SHORTCUT_LOCATION_DESKTOP && | 1726 if (location != SHORTCUT_LOCATION_DESKTOP && |
| 1701 location != SHORTCUT_LOCATION_QUICK_LAUNCH && | 1727 location != SHORTCUT_LOCATION_QUICK_LAUNCH && |
| 1702 location != SHORTCUT_LOCATION_START_MENU_ROOT && | 1728 location != SHORTCUT_LOCATION_START_MENU_ROOT && |
| 1703 location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR && | 1729 location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED && |
| 1704 location != SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR) { | 1730 location != SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR) { |
| 1705 NOTREACHED(); | 1731 NOTREACHED(); |
| 1706 return false; | 1732 return false; |
| 1707 } | 1733 } |
| 1708 | 1734 |
| 1709 DCHECK(dist); | 1735 DCHECK(dist); |
| 1710 // |pin_to_taskbar| is only acknowledged when first creating the shortcut. | 1736 // |pin_to_taskbar| is only acknowledged when first creating the shortcut. |
| 1711 DCHECK(!properties.pin_to_taskbar || | 1737 DCHECK(!properties.pin_to_taskbar || |
| 1712 operation == SHELL_SHORTCUT_CREATE_ALWAYS || | 1738 operation == SHELL_SHORTCUT_CREATE_ALWAYS || |
| 1713 operation == SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL); | 1739 operation == SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1802 const base::FilePath& chrome_exe) { | 1828 const base::FilePath& chrome_exe) { |
| 1803 return L"\"" + chrome_exe.value() + L"\" -- %*"; | 1829 return L"\"" + chrome_exe.value() + L"\" -- %*"; |
| 1804 } | 1830 } |
| 1805 | 1831 |
| 1806 void ShellUtil::GetRegisteredBrowsers( | 1832 void ShellUtil::GetRegisteredBrowsers( |
| 1807 BrowserDistribution* dist, | 1833 BrowserDistribution* dist, |
| 1808 std::map<base::string16, base::string16>* browsers) { | 1834 std::map<base::string16, base::string16>* browsers) { |
| 1809 DCHECK(dist); | 1835 DCHECK(dist); |
| 1810 DCHECK(browsers); | 1836 DCHECK(browsers); |
| 1811 | 1837 |
| 1812 const base::string16 base_key(ShellUtil::kRegStartMenuInternet); | 1838 const base::string16 base_key(kRegStartMenuInternet); |
| 1813 base::string16 client_path; | 1839 base::string16 client_path; |
| 1814 RegKey key; | 1840 RegKey key; |
| 1815 base::string16 name; | 1841 base::string16 name; |
| 1816 base::string16 command; | 1842 base::string16 command; |
| 1817 | 1843 |
| 1818 // HKCU has precedence over HKLM for these registrations: http://goo.gl/xjczJ. | 1844 // HKCU has precedence over HKLM for these registrations: http://goo.gl/xjczJ. |
| 1819 // Look in HKCU second to override any identical values found in HKLM. | 1845 // Look in HKCU second to override any identical values found in HKLM. |
| 1820 const HKEY roots[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }; | 1846 const HKEY roots[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }; |
| 1821 for (int i = 0; i < arraysize(roots); ++i) { | 1847 for (int i = 0; i < arraysize(roots); ++i) { |
| 1822 const HKEY root = roots[i]; | 1848 const HKEY root = roots[i]; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1942 // No spaces are allowed in the AppUserModelId according to MSDN. | 1968 // No spaces are allowed in the AppUserModelId according to MSDN. |
| 1943 base::ReplaceChars(app_id, base::ASCIIToUTF16(" "), base::ASCIIToUTF16("_"), | 1969 base::ReplaceChars(app_id, base::ASCIIToUTF16(" "), base::ASCIIToUTF16("_"), |
| 1944 &app_id); | 1970 &app_id); |
| 1945 return app_id; | 1971 return app_id; |
| 1946 } | 1972 } |
| 1947 | 1973 |
| 1948 ShellUtil::DefaultState ShellUtil::GetChromeDefaultState() { | 1974 ShellUtil::DefaultState ShellUtil::GetChromeDefaultState() { |
| 1949 base::FilePath app_path; | 1975 base::FilePath app_path; |
| 1950 if (!PathService::Get(base::FILE_EXE, &app_path)) { | 1976 if (!PathService::Get(base::FILE_EXE, &app_path)) { |
| 1951 NOTREACHED(); | 1977 NOTREACHED(); |
| 1952 return ShellUtil::UNKNOWN_DEFAULT; | 1978 return UNKNOWN_DEFAULT; |
| 1953 } | 1979 } |
| 1954 | 1980 |
| 1955 return GetChromeDefaultStateFromPath(app_path); | 1981 return GetChromeDefaultStateFromPath(app_path); |
| 1956 } | 1982 } |
| 1957 | 1983 |
| 1958 ShellUtil::DefaultState ShellUtil::GetChromeDefaultStateFromPath( | 1984 ShellUtil::DefaultState ShellUtil::GetChromeDefaultStateFromPath( |
| 1959 const base::FilePath& chrome_exe) { | 1985 const base::FilePath& chrome_exe) { |
| 1960 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); | 1986 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); |
| 1961 if (distribution->GetDefaultBrowserControlPolicy() == | 1987 if (distribution->GetDefaultBrowserControlPolicy() == |
| 1962 BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) { | 1988 BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1985 BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) { | 2011 BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) { |
| 1986 return NOT_DEFAULT; | 2012 return NOT_DEFAULT; |
| 1987 } | 2013 } |
| 1988 | 2014 |
| 1989 if (protocol.empty()) | 2015 if (protocol.empty()) |
| 1990 return UNKNOWN_DEFAULT; | 2016 return UNKNOWN_DEFAULT; |
| 1991 | 2017 |
| 1992 base::FilePath chrome_exe; | 2018 base::FilePath chrome_exe; |
| 1993 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { | 2019 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { |
| 1994 NOTREACHED(); | 2020 NOTREACHED(); |
| 1995 return ShellUtil::UNKNOWN_DEFAULT; | 2021 return UNKNOWN_DEFAULT; |
| 1996 } | 2022 } |
| 1997 | 2023 |
| 1998 const wchar_t* const protocols[] = { protocol.c_str() }; | 2024 const wchar_t* const protocols[] = { protocol.c_str() }; |
| 1999 return ProbeProtocolHandlers(chrome_exe, | 2025 return ProbeProtocolHandlers(chrome_exe, |
| 2000 protocols, | 2026 protocols, |
| 2001 arraysize(protocols)); | 2027 arraysize(protocols)); |
| 2002 } | 2028 } |
| 2003 | 2029 |
| 2004 // static | 2030 // static |
| 2005 bool ShellUtil::CanMakeChromeDefaultUnattended() { | 2031 bool ShellUtil::CanMakeChromeDefaultUnattended() { |
| 2006 return base::win::GetVersion() < base::win::VERSION_WIN8; | 2032 return base::win::GetVersion() < base::win::VERSION_WIN8; |
| 2007 } | 2033 } |
| 2008 | 2034 |
| 2009 bool ShellUtil::MakeChromeDefault(BrowserDistribution* dist, | 2035 bool ShellUtil::MakeChromeDefault(BrowserDistribution* dist, |
| 2010 int shell_change, | 2036 int shell_change, |
| 2011 const base::FilePath& chrome_exe, | 2037 const base::FilePath& chrome_exe, |
| 2012 bool elevate_if_not_admin) { | 2038 bool elevate_if_not_admin) { |
| 2013 DCHECK(!(shell_change & ShellUtil::SYSTEM_LEVEL) || IsUserAnAdmin()); | 2039 DCHECK(!(shell_change & SYSTEM_LEVEL) || IsUserAnAdmin()); |
| 2014 | 2040 |
| 2015 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); | 2041 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); |
| 2016 if (distribution->GetDefaultBrowserControlPolicy() != | 2042 if (distribution->GetDefaultBrowserControlPolicy() != |
| 2017 BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) { | 2043 BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) { |
| 2018 return false; | 2044 return false; |
| 2019 } | 2045 } |
| 2020 | 2046 |
| 2021 // Windows 8 does not permit making a browser default just like that. | 2047 // Windows 8 does not permit making a browser default just like that. |
| 2022 // This process needs to be routed through the system's UI. Use | 2048 // This process needs to be routed through the system's UI. Use |
| 2023 // ShowMakeChromeDefaultSystemUI instead (below). | 2049 // ShowMakeChromeDefaultSystemUI instead (below). |
| 2024 if (!CanMakeChromeDefaultUnattended()) { | 2050 if (!CanMakeChromeDefaultUnattended()) { |
| 2025 return false; | 2051 return false; |
| 2026 } | 2052 } |
| 2027 | 2053 |
| 2028 if (!ShellUtil::RegisterChromeBrowser( | 2054 if (!RegisterChromeBrowser( |
| 2029 dist, chrome_exe, base::string16(), elevate_if_not_admin)) { | 2055 dist, chrome_exe, base::string16(), elevate_if_not_admin)) { |
| 2030 return false; | 2056 return false; |
| 2031 } | 2057 } |
| 2032 | 2058 |
| 2033 bool ret = true; | 2059 bool ret = true; |
| 2034 // First use the new "recommended" way on Vista to make Chrome default | 2060 // First use the new "recommended" way on Vista to make Chrome default |
| 2035 // browser. | 2061 // browser. |
| 2036 base::string16 app_name = GetApplicationName(dist, chrome_exe); | 2062 base::string16 app_name = GetApplicationName(dist, chrome_exe); |
| 2037 | 2063 |
| 2038 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { | 2064 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { |
| 2039 // On Windows Vista and Win7 we still can set ourselves via the | 2065 // On Windows Vista and Win7 we still can set ourselves via the |
| 2040 // the IApplicationAssociationRegistration interface. | 2066 // the IApplicationAssociationRegistration interface. |
| 2041 VLOG(1) << "Registering Chrome as default browser on Vista."; | 2067 VLOG(1) << "Registering Chrome as default browser on Vista."; |
| 2042 base::win::ScopedComPtr<IApplicationAssociationRegistration> pAAR; | 2068 base::win::ScopedComPtr<IApplicationAssociationRegistration> pAAR; |
| 2043 HRESULT hr = pAAR.CreateInstance(CLSID_ApplicationAssociationRegistration, | 2069 HRESULT hr = pAAR.CreateInstance(CLSID_ApplicationAssociationRegistration, |
| 2044 NULL, CLSCTX_INPROC); | 2070 NULL, CLSCTX_INPROC); |
| 2045 if (SUCCEEDED(hr)) { | 2071 if (SUCCEEDED(hr)) { |
| 2046 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) { | 2072 for (int i = 0; kBrowserProtocolAssociations[i] != NULL; i++) { |
| 2047 hr = pAAR->SetAppAsDefault(app_name.c_str(), | 2073 hr = pAAR->SetAppAsDefault(app_name.c_str(), |
| 2048 ShellUtil::kBrowserProtocolAssociations[i], AT_URLPROTOCOL); | 2074 kBrowserProtocolAssociations[i], AT_URLPROTOCOL); |
| 2049 if (!SUCCEEDED(hr)) { | 2075 if (!SUCCEEDED(hr)) { |
| 2050 ret = false; | 2076 ret = false; |
| 2051 LOG(ERROR) << "Failed to register as default for protocol " | 2077 LOG(ERROR) << "Failed to register as default for protocol " |
| 2052 << ShellUtil::kBrowserProtocolAssociations[i] | 2078 << kBrowserProtocolAssociations[i] |
| 2053 << " (" << hr << ")"; | 2079 << " (" << hr << ")"; |
| 2054 } | 2080 } |
| 2055 } | 2081 } |
| 2056 | 2082 |
| 2057 for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != NULL; i++) { | 2083 for (int i = 0; kDefaultFileAssociations[i] != NULL; i++) { |
| 2058 hr = pAAR->SetAppAsDefault(app_name.c_str(), | 2084 hr = pAAR->SetAppAsDefault(app_name.c_str(), |
| 2059 ShellUtil::kDefaultFileAssociations[i], AT_FILEEXTENSION); | 2085 kDefaultFileAssociations[i], AT_FILEEXTENSION); |
| 2060 if (!SUCCEEDED(hr)) { | 2086 if (!SUCCEEDED(hr)) { |
| 2061 ret = false; | 2087 ret = false; |
| 2062 LOG(ERROR) << "Failed to register as default for file extension " | 2088 LOG(ERROR) << "Failed to register as default for file extension " |
| 2063 << ShellUtil::kDefaultFileAssociations[i] | 2089 << kDefaultFileAssociations[i] |
| 2064 << " (" << hr << ")"; | 2090 << " (" << hr << ")"; |
| 2065 } | 2091 } |
| 2066 } | 2092 } |
| 2067 } | 2093 } |
| 2068 } | 2094 } |
| 2069 | 2095 |
| 2070 if (!RegisterChromeAsDefaultXPStyle(dist, shell_change, chrome_exe)) | 2096 if (!RegisterChromeAsDefaultXPStyle(dist, shell_change, chrome_exe)) |
| 2071 ret = false; | 2097 ret = false; |
| 2072 | 2098 |
| 2073 // Send Windows notification event so that it can update icons for | 2099 // Send Windows notification event so that it can update icons for |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2336 base::win::GetVersion() >= base::win::VERSION_VISTA) { | 2362 base::win::GetVersion() >= base::win::VERSION_VISTA) { |
| 2337 // Elevate to do the whole job | 2363 // Elevate to do the whole job |
| 2338 return ElevateAndRegisterChrome(dist, chrome_exe, suffix, protocol); | 2364 return ElevateAndRegisterChrome(dist, chrome_exe, suffix, protocol); |
| 2339 } else { | 2365 } else { |
| 2340 // Admin rights are required to register capabilities before Windows 8. | 2366 // Admin rights are required to register capabilities before Windows 8. |
| 2341 return false; | 2367 return false; |
| 2342 } | 2368 } |
| 2343 } | 2369 } |
| 2344 | 2370 |
| 2345 // static | 2371 // static |
| 2346 bool ShellUtil::RemoveShortcuts(ShellUtil::ShortcutLocation location, | 2372 bool ShellUtil::RemoveShortcuts(ShortcutLocation location, |
| 2347 BrowserDistribution* dist, | 2373 BrowserDistribution* dist, |
| 2348 ShellChange level, | 2374 ShellChange level, |
| 2349 const base::FilePath& target_exe) { | 2375 const base::FilePath& target_exe) { |
| 2350 if (!ShellUtil::ShortcutLocationIsSupported(location)) | 2376 if (!ShortcutLocationIsSupported(location)) |
| 2351 return true; // Vacuous success. | 2377 return true; // Vacuous success. |
| 2352 | 2378 |
| 2353 FilterTargetEq shortcut_filter(target_exe, false); | 2379 FilterTargetEq shortcut_filter(target_exe, false); |
| 2354 // Main operation to apply to each shortcut in the directory specified. | 2380 // Main operation to apply to each shortcut in the directory specified. |
| 2355 ShortcutOperationCallback shortcut_operation( | 2381 ShortcutOperationCallback shortcut_operation( |
| 2356 location == SHORTCUT_LOCATION_TASKBAR_PINS | 2382 location == SHORTCUT_LOCATION_TASKBAR_PINS |
| 2357 ? base::Bind(&ShortcutOpUnpinFromTaskbar) | 2383 ? base::Bind(&ShortcutOpUnpinFromTaskbar) |
| 2358 : base::Bind(&ShortcutOpDelete)); | 2384 : base::Bind(&ShortcutOpDelete)); |
| 2359 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2385 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
| 2360 shortcut_operation, location, dist, level, | 2386 shortcut_operation, location, dist, level, |
| 2361 NULL); | 2387 NULL); |
| 2362 // Remove chrome-specific shortcut folders if they are now empty. | 2388 // Remove chrome-specific shortcut folders if they are now empty. |
| 2363 if (success && | 2389 if (success && |
| 2364 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR || | 2390 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR_DEPRECATED || |
| 2365 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR || | 2391 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR || |
| 2366 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { | 2392 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { |
| 2367 success = RemoveShortcutFolderIfEmpty(location, dist, level); | 2393 success = RemoveShortcutFolderIfEmpty(location, dist, level); |
| 2368 } | 2394 } |
| 2369 return success; | 2395 return success; |
| 2370 } | 2396 } |
| 2371 | 2397 |
| 2372 // static | 2398 // static |
| 2373 bool ShellUtil::RetargetShortcutsWithArgs( | 2399 bool ShellUtil::RetargetShortcutsWithArgs( |
| 2374 ShellUtil::ShortcutLocation location, | 2400 ShortcutLocation location, |
| 2375 BrowserDistribution* dist, | 2401 BrowserDistribution* dist, |
| 2376 ShellChange level, | 2402 ShellChange level, |
| 2377 const base::FilePath& old_target_exe, | 2403 const base::FilePath& old_target_exe, |
| 2378 const base::FilePath& new_target_exe) { | 2404 const base::FilePath& new_target_exe) { |
| 2379 if (!ShellUtil::ShortcutLocationIsSupported(location)) | 2405 if (!ShortcutLocationIsSupported(location)) |
| 2380 return true; // Vacuous success. | 2406 return true; // Vacuous success. |
| 2381 | 2407 |
| 2382 FilterTargetEq shortcut_filter(old_target_exe, true); | 2408 FilterTargetEq shortcut_filter(old_target_exe, true); |
| 2383 ShortcutOperationCallback shortcut_operation( | 2409 ShortcutOperationCallback shortcut_operation( |
| 2384 base::Bind(&ShortcutOpRetarget, old_target_exe, new_target_exe)); | 2410 base::Bind(&ShortcutOpRetarget, old_target_exe, new_target_exe)); |
| 2385 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2411 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
| 2386 shortcut_operation, location, dist, level, NULL); | 2412 shortcut_operation, location, dist, level, NULL); |
| 2387 } | 2413 } |
| 2388 | 2414 |
| 2389 // static | 2415 // static |
| 2390 bool ShellUtil::ShortcutListMaybeRemoveUnknownArgs( | 2416 bool ShellUtil::ShortcutListMaybeRemoveUnknownArgs( |
| 2391 ShellUtil::ShortcutLocation location, | 2417 ShortcutLocation location, |
| 2392 BrowserDistribution* dist, | 2418 BrowserDistribution* dist, |
| 2393 ShellChange level, | 2419 ShellChange level, |
| 2394 const base::FilePath& chrome_exe, | 2420 const base::FilePath& chrome_exe, |
| 2395 bool do_removal, | 2421 bool do_removal, |
| 2396 const scoped_refptr<SharedCancellationFlag>& cancel, | 2422 const scoped_refptr<SharedCancellationFlag>& cancel, |
| 2397 std::vector<std::pair<base::FilePath, base::string16> >* shortcuts) { | 2423 std::vector<std::pair<base::FilePath, base::string16> >* shortcuts) { |
| 2398 if (!ShellUtil::ShortcutLocationIsSupported(location)) | 2424 if (!ShortcutLocationIsSupported(location)) |
| 2399 return false; | 2425 return false; |
| 2400 DCHECK(dist); | 2426 DCHECK(dist); |
| 2401 FilterTargetEq shortcut_filter(chrome_exe, true); | 2427 FilterTargetEq shortcut_filter(chrome_exe, true); |
| 2402 ShortcutOperationCallback shortcut_operation( | 2428 ShortcutOperationCallback shortcut_operation( |
| 2403 base::Bind(&ShortcutOpListOrRemoveUnknownArgs, do_removal, shortcuts)); | 2429 base::Bind(&ShortcutOpListOrRemoveUnknownArgs, do_removal, shortcuts)); |
| 2404 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2430 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
| 2405 shortcut_operation, location, dist, level, cancel); | 2431 shortcut_operation, location, dist, level, cancel); |
| 2406 } | 2432 } |
| 2407 | 2433 |
| 2408 bool ShellUtil::GetUserSpecificRegistrySuffix(base::string16* suffix) { | 2434 bool ShellUtil::GetUserSpecificRegistrySuffix(base::string16* suffix) { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2510 RegistryEntry::GetAppDefaultRegistrationEntries( | 2536 RegistryEntry::GetAppDefaultRegistrationEntries( |
| 2511 prog_id, ext, false, &entries); | 2537 prog_id, ext, false, &entries); |
| 2512 } | 2538 } |
| 2513 | 2539 |
| 2514 return AddRegistryEntries(HKEY_CURRENT_USER, entries); | 2540 return AddRegistryEntries(HKEY_CURRENT_USER, entries); |
| 2515 } | 2541 } |
| 2516 | 2542 |
| 2517 // static | 2543 // static |
| 2518 bool ShellUtil::DeleteFileAssociations(const base::string16& prog_id) { | 2544 bool ShellUtil::DeleteFileAssociations(const base::string16& prog_id) { |
| 2519 // Delete the key HKEY_CURRENT_USER\Software\Classes\PROGID. | 2545 // Delete the key HKEY_CURRENT_USER\Software\Classes\PROGID. |
| 2520 base::string16 key_path(ShellUtil::kRegClasses); | 2546 base::string16 key_path(kRegClasses); |
| 2521 key_path.push_back(base::FilePath::kSeparators[0]); | 2547 key_path.push_back(base::FilePath::kSeparators[0]); |
| 2522 key_path.append(prog_id); | 2548 key_path.append(prog_id); |
| 2523 return InstallUtil::DeleteRegistryKey( | 2549 return InstallUtil::DeleteRegistryKey( |
| 2524 HKEY_CURRENT_USER, key_path, WorkItem::kWow64Default); | 2550 HKEY_CURRENT_USER, key_path, WorkItem::kWow64Default); |
| 2525 | 2551 |
| 2526 // TODO(mgiuca): Remove the extension association entries. This requires that | 2552 // TODO(mgiuca): Remove the extension association entries. This requires that |
| 2527 // the extensions associated with a particular prog_id are stored in that | 2553 // the extensions associated with a particular prog_id are stored in that |
| 2528 // prog_id's key. | 2554 // prog_id's key. |
| 2529 } | 2555 } |
| OLD | NEW |