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

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

Issue 10914109: Refactoring and tests for the highly undertested file_util::CreateOrUpdateShortcutLink() method. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: namespace s/Win/win Created 8 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « chrome/installer/util/shell_util.h ('k') | chrome/installer/util/shell_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 14 matching lines...) Expand all
25 #include "base/memory/scoped_vector.h" 25 #include "base/memory/scoped_vector.h"
26 #include "base/path_service.h" 26 #include "base/path_service.h"
27 #include "base/string16.h" 27 #include "base/string16.h"
28 #include "base/string_number_conversions.h" 28 #include "base/string_number_conversions.h"
29 #include "base/string_split.h" 29 #include "base/string_split.h"
30 #include "base/string_util.h" 30 #include "base/string_util.h"
31 #include "base/utf_string_conversions.h" 31 #include "base/utf_string_conversions.h"
32 #include "base/values.h" 32 #include "base/values.h"
33 #include "base/win/registry.h" 33 #include "base/win/registry.h"
34 #include "base/win/scoped_comptr.h" 34 #include "base/win/scoped_comptr.h"
35 #include "base/win/shortcut.h"
35 #include "base/win/win_util.h" 36 #include "base/win/win_util.h"
36 #include "base/win/windows_version.h" 37 #include "base/win/windows_version.h"
37 #include "chrome/common/chrome_constants.h" 38 #include "chrome/common/chrome_constants.h"
38 #include "chrome/common/chrome_switches.h" 39 #include "chrome/common/chrome_switches.h"
39 #include "chrome/installer/util/browser_distribution.h" 40 #include "chrome/installer/util/browser_distribution.h"
40 #include "chrome/installer/util/install_util.h" 41 #include "chrome/installer/util/install_util.h"
41 #include "chrome/installer/util/master_preferences.h" 42 #include "chrome/installer/util/master_preferences.h"
42 #include "chrome/installer/util/master_preferences_constants.h" 43 #include "chrome/installer/util/master_preferences_constants.h"
43 44
44 using base::win::RegKey; 45 using base::win::RegKey;
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 // Windows 8. 724 // Windows 8.
724 bool LaunchApplicationAssociationDialog(const string16& app_id) { 725 bool LaunchApplicationAssociationDialog(const string16& app_id) {
725 base::win::ScopedComPtr<IApplicationAssociationRegistrationUI> aarui; 726 base::win::ScopedComPtr<IApplicationAssociationRegistrationUI> aarui;
726 HRESULT hr = aarui.CreateInstance(CLSID_ApplicationAssociationRegistrationUI); 727 HRESULT hr = aarui.CreateInstance(CLSID_ApplicationAssociationRegistrationUI);
727 if (FAILED(hr)) 728 if (FAILED(hr))
728 return false; 729 return false;
729 hr = aarui->LaunchAdvancedAssociationUI(app_id.c_str()); 730 hr = aarui->LaunchAdvancedAssociationUI(app_id.c_str());
730 return SUCCEEDED(hr); 731 return SUCCEEDED(hr);
731 } 732 }
732 733
733 uint32 ConvertShellUtilShortcutOptionsToFileUtil(uint32 options) {
734 uint32 converted_options = 0;
735 if (options & ShellUtil::SHORTCUT_DUAL_MODE)
736 converted_options |= file_util::SHORTCUT_DUAL_MODE;
737 if (options & ShellUtil::SHORTCUT_CREATE_ALWAYS)
738 converted_options |= file_util::SHORTCUT_CREATE_ALWAYS;
739 return converted_options;
740 }
741
742 // As of r133333, the DelegateExecute verb handler was being registered for 734 // As of r133333, the DelegateExecute verb handler was being registered for
743 // Google Chrome installs on Windows 8 even though the binary itself wasn't 735 // Google Chrome installs on Windows 8 even though the binary itself wasn't
744 // present. This affected Chrome 20.0.1115.1 on the dev channel (and anyone who 736 // present. This affected Chrome 20.0.1115.1 on the dev channel (and anyone who
745 // pulled a Canary >= 20.0.1112.0 and installed it manually as Google Chrome). 737 // pulled a Canary >= 20.0.1112.0 and installed it manually as Google Chrome).
746 // This egregious hack is here to remove the bad values for those installs, and 738 // This egregious hack is here to remove the bad values for those installs, and
747 // should be removed after a reasonable time, say 2012-08-01. Anyone on Win8 739 // should be removed after a reasonable time, say 2012-08-01. Anyone on Win8
748 // dev channel who hasn't been autoupdated or manually updated by then will have 740 // dev channel who hasn't been autoupdated or manually updated by then will have
749 // to uninstall and reinstall Chrome to repair. See http://crbug.com/124666 and 741 // to uninstall and reinstall Chrome to repair. See http://crbug.com/124666 and
750 // http://crbug.com/123994 for gory details. 742 // http://crbug.com/123994 for gory details.
751 // This function is also used to remove DelegateExecute verb handler 743 // This function is also used to remove DelegateExecute verb handler
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
1665 const FilePath chrome_path(FilePath(chrome_exe).DirName()); 1657 const FilePath chrome_path(FilePath(chrome_exe).DirName());
1666 1658
1667 installer::MasterPreferences prefs( 1659 installer::MasterPreferences prefs(
1668 chrome_path.AppendASCII(installer::kDefaultMasterPrefs)); 1660 chrome_path.AppendASCII(installer::kDefaultMasterPrefs));
1669 if (FilePath::CompareEqualIgnoreCase(icon_path, chrome_exe)) { 1661 if (FilePath::CompareEqualIgnoreCase(icon_path, chrome_exe)) {
1670 prefs.GetInt(installer::master_preferences::kChromeShortcutIconIndex, 1662 prefs.GetInt(installer::master_preferences::kChromeShortcutIconIndex,
1671 &icon_index); 1663 &icon_index);
1672 } 1664 }
1673 1665
1674 const string16 app_id(GetBrowserModelId(dist, chrome_exe)); 1666 const string16 app_id(GetBrowserModelId(dist, chrome_exe));
1667 const bool is_dual_mode = ((options & ShellUtil::SHORTCUT_DUAL_MODE) != 0);
1668 const base::win::ShortcutOperation operation =
1669 (options & ShellUtil::SHORTCUT_CREATE_ALWAYS) != 0 ?
1670 base::win::SHORTCUT_CREATE_ALWAYS :
1671 base::win::SHORTCUT_UPDATE_EXISTING;
1675 1672
1676 return file_util::CreateOrUpdateShortcutLink( 1673 // TODO(gab): The shell_util interface will also be refactored in an upcoming
1677 chrome_exe.c_str(), 1674 // CL to use a ShortcutProperties like interface for its shortcut methods.
1678 shortcut.c_str(), 1675 base::win::ShortcutProperties shortcut_properties;
1679 chrome_path.value().c_str(), 1676 shortcut_properties.set_target(FilePath(chrome_exe));
1680 arguments.c_str(), 1677 shortcut_properties.set_working_dir(chrome_path);
1681 description.c_str(), 1678 shortcut_properties.set_arguments(arguments);
1682 icon_path.c_str(), 1679 shortcut_properties.set_description(description);
1683 icon_index, 1680 shortcut_properties.set_icon(FilePath(icon_path), icon_index);
1684 app_id.c_str(), 1681 shortcut_properties.set_app_id(app_id);
1685 ConvertShellUtilShortcutOptionsToFileUtil(options)); 1682 shortcut_properties.set_dual_mode(is_dual_mode);
1686 } 1683 return base::win::CreateOrUpdateShortcutLink(
1687 1684 FilePath(shortcut), shortcut_properties, operation);
1688 ShellUtil::VerifyShortcutStatus ShellUtil::VerifyChromeShortcut(
1689 const string16& exe_path, const string16& shortcut,
1690 const string16& description, int icon_index) {
1691 base::win::ScopedComPtr<IShellLink> i_shell_link;
1692 base::win::ScopedComPtr<IPersistFile> i_persist_file;
1693 wchar_t long_path[MAX_PATH] = {0};
1694 wchar_t short_path[MAX_PATH] = {0};
1695 wchar_t file_path[MAX_PATH] = {0};
1696 wchar_t icon_path[MAX_PATH] = {0};
1697 wchar_t desc[MAX_PATH] = {0};
1698 int index = 0;
1699
1700 // Get the shortcut's properties.
1701 if (FAILED(i_shell_link.CreateInstance(CLSID_ShellLink, NULL,
1702 CLSCTX_INPROC_SERVER)) ||
1703 FAILED(i_persist_file.QueryFrom(i_shell_link)) ||
1704 FAILED(i_persist_file->Load(shortcut.c_str(), 0)) ||
1705 ::GetLongPathName(exe_path.c_str(), long_path, MAX_PATH) == 0 ||
1706 ::GetShortPathName(exe_path.c_str(), short_path, MAX_PATH) == 0 ||
1707 FAILED(i_shell_link->GetPath(file_path, MAX_PATH, NULL,
1708 SLGP_UNCPRIORITY)) ||
1709 FAILED(i_shell_link->GetIconLocation(icon_path, MAX_PATH, &index)) ||
1710 FAILED(i_shell_link->GetDescription(desc, MAX_PATH)) ||
1711 FAILED(i_shell_link->GetDescription(desc, MAX_PATH)))
1712 return VERIFY_SHORTCUT_FAILURE_UNEXPECTED;
1713
1714 FilePath path(file_path);
1715 if (path != FilePath(long_path) && path != FilePath(short_path))
1716 return VERIFY_SHORTCUT_FAILURE_PATH;
1717
1718 if (string16(desc) != string16(description))
1719 return VERIFY_SHORTCUT_FAILURE_DESCRIPTION;
1720
1721 if (index != icon_index)
1722 return VERIFY_SHORTCUT_FAILURE_ICON_INDEX;
1723
1724 return VERIFY_SHORTCUT_SUCCESS;
1725 } 1685 }
1726 1686
1727 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) { 1687 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) {
1728 // Use a thread-safe cache for the user's suffix. 1688 // Use a thread-safe cache for the user's suffix.
1729 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance = 1689 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance =
1730 LAZY_INSTANCE_INITIALIZER; 1690 LAZY_INSTANCE_INITIALIZER;
1731 return suffix_instance.Get().GetSuffix(suffix); 1691 return suffix_instance.Get().GetSuffix(suffix);
1732 } 1692 }
1733 1693
1734 bool ShellUtil::GetOldUserSpecificRegistrySuffix(string16* suffix) { 1694 bool ShellUtil::GetOldUserSpecificRegistrySuffix(string16* suffix) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1784 // are any left...). 1744 // are any left...).
1785 if (free_bits >= 8 && next_byte_index < size) { 1745 if (free_bits >= 8 && next_byte_index < size) {
1786 free_bits -= 8; 1746 free_bits -= 8;
1787 bit_stream += bytes[next_byte_index++] << free_bits; 1747 bit_stream += bytes[next_byte_index++] << free_bits;
1788 } 1748 }
1789 } 1749 }
1790 1750
1791 DCHECK_EQ(ret.length(), encoded_length); 1751 DCHECK_EQ(ret.length(), encoded_length);
1792 return ret; 1752 return ret;
1793 } 1753 }
OLDNEW
« no previous file with comments | « chrome/installer/util/shell_util.h ('k') | chrome/installer/util/shell_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698