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 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 // These entries need to be registered in HKLM prior to Win8. | 209 // These entries need to be registered in HKLM prior to Win8. |
210 static void GetProgIdEntries(BrowserDistribution* dist, | 210 static void GetProgIdEntries(BrowserDistribution* dist, |
211 const string16& chrome_exe, | 211 const string16& chrome_exe, |
212 const string16& suffix, | 212 const string16& suffix, |
213 ScopedVector<RegistryEntry>* entries) { | 213 ScopedVector<RegistryEntry>* entries) { |
214 string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe)); | 214 string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe)); |
215 string16 open_cmd(ShellUtil::GetChromeShellOpenCmd(chrome_exe)); | 215 string16 open_cmd(ShellUtil::GetChromeShellOpenCmd(chrome_exe)); |
216 string16 delegate_command(ShellUtil::GetChromeDelegateCommand(chrome_exe)); | 216 string16 delegate_command(ShellUtil::GetChromeDelegateCommand(chrome_exe)); |
217 // For user-level installs: entries for the app id and DelegateExecute verb | 217 // For user-level installs: entries for the app id and DelegateExecute verb |
218 // handler will be in HKCU; thus we do not need a suffix on those entries. | 218 // handler will be in HKCU; thus we do not need a suffix on those entries. |
219 string16 app_id(ShellUtil::GetBrowserModelId(dist, chrome_exe)); | 219 string16 app_id( |
| 220 ShellUtil::GetBrowserModelId( |
| 221 dist, InstallUtil::IsPerUserInstall(chrome_exe.c_str()))); |
220 string16 delegate_guid; | 222 string16 delegate_guid; |
221 // TODO(grt): remove HasDelegateExecuteHandler when the exe is ever-present; | 223 // TODO(grt): remove HasDelegateExecuteHandler when the exe is ever-present; |
222 // see also install_worker.cc's AddDelegateExecuteWorkItems. | 224 // see also install_worker.cc's AddDelegateExecuteWorkItems. |
223 bool set_delegate_execute = | 225 bool set_delegate_execute = |
224 IsChromeMetroSupported() && | 226 IsChromeMetroSupported() && |
225 dist->GetCommandExecuteImplClsid(&delegate_guid) && | 227 dist->GetCommandExecuteImplClsid(&delegate_guid) && |
226 InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe); | 228 InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe); |
227 | 229 |
228 // DelegateExecute ProgId. Needed for Chrome Metro in Windows 8. | 230 // DelegateExecute ProgId. Needed for Chrome Metro in Windows 8. |
229 if (set_delegate_execute) { | 231 if (set_delegate_execute) { |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 // also become irrelevant sometime after Windows 8 RC (thus the aforementioned | 747 // also become irrelevant sometime after Windows 8 RC (thus the aforementioned |
746 // removal date remains correct). | 748 // removal date remains correct). |
747 void RemoveBadWindows8RegistrationIfNeeded( | 749 void RemoveBadWindows8RegistrationIfNeeded( |
748 BrowserDistribution* dist, | 750 BrowserDistribution* dist, |
749 const string16& chrome_exe) { | 751 const string16& chrome_exe) { |
750 if (dist->GetCommandExecuteImplClsid(NULL) && | 752 if (dist->GetCommandExecuteImplClsid(NULL) && |
751 (!InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe) || | 753 (!InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe) || |
752 !IsChromeMetroSupported())) { | 754 !IsChromeMetroSupported())) { |
753 // There's no need to rollback, so forgo the usual work item lists and just | 755 // There's no need to rollback, so forgo the usual work item lists and just |
754 // remove the values from the registry. | 756 // remove the values from the registry. |
755 const HKEY root_key = InstallUtil::IsPerUserInstall(chrome_exe.c_str()) ? | 757 bool is_per_user_install = |
756 HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; | 758 InstallUtil::IsPerUserInstall(chrome_exe.c_str()); |
| 759 const HKEY root_key = is_per_user_install ? HKEY_CURRENT_USER : |
| 760 HKEY_LOCAL_MACHINE; |
757 // Use the current installation's suffix, not the about-to-be-installed | 761 // Use the current installation's suffix, not the about-to-be-installed |
758 // suffix. | 762 // suffix. |
759 const string16 installation_suffix( | 763 const string16 installation_suffix( |
760 ShellUtil::GetCurrentInstallationSuffix(dist, chrome_exe)); | 764 ShellUtil::GetCurrentInstallationSuffix(dist, chrome_exe)); |
761 const string16 app_id(ShellUtil::GetBrowserModelId(dist, chrome_exe)); | 765 const string16 app_id(ShellUtil::GetBrowserModelId(dist, |
| 766 is_per_user_install)); |
762 | 767 |
763 // <root hkey>\Software\Classes\<app_id> | 768 // <root hkey>\Software\Classes\<app_id> |
764 string16 key(ShellUtil::kRegClasses); | 769 string16 key(ShellUtil::kRegClasses); |
765 key.push_back(FilePath::kSeparators[0]); | 770 key.push_back(FilePath::kSeparators[0]); |
766 key.append(app_id); | 771 key.append(app_id); |
767 InstallUtil::DeleteRegistryKey(root_key, key); | 772 InstallUtil::DeleteRegistryKey(root_key, key); |
768 | 773 |
769 // <root hkey>\Software\Classes\ChromiumHTML[.user]\shell\open\command | 774 // <root hkey>\Software\Classes\ChromiumHTML[.user]\shell\open\command |
770 key = ShellUtil::kRegClasses; | 775 key = ShellUtil::kRegClasses; |
771 key.push_back(FilePath::kSeparators[0]); | 776 key.push_back(FilePath::kSeparators[0]); |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 } | 1211 } |
1207 | 1212 |
1208 string16 ShellUtil::GetApplicationName(BrowserDistribution* dist, | 1213 string16 ShellUtil::GetApplicationName(BrowserDistribution* dist, |
1209 const string16& chrome_exe) { | 1214 const string16& chrome_exe) { |
1210 string16 app_name = dist->GetBaseAppName(); | 1215 string16 app_name = dist->GetBaseAppName(); |
1211 app_name += GetCurrentInstallationSuffix(dist, chrome_exe); | 1216 app_name += GetCurrentInstallationSuffix(dist, chrome_exe); |
1212 return app_name; | 1217 return app_name; |
1213 } | 1218 } |
1214 | 1219 |
1215 string16 ShellUtil::GetBrowserModelId(BrowserDistribution* dist, | 1220 string16 ShellUtil::GetBrowserModelId(BrowserDistribution* dist, |
1216 const string16& chrome_exe) { | 1221 bool is_per_user_install) { |
1217 string16 app_id(dist->GetBaseAppId()); | 1222 string16 app_id(dist->GetBaseAppId()); |
1218 string16 suffix; | 1223 string16 suffix; |
1219 if (InstallUtil::IsPerUserInstall(chrome_exe.c_str()) && | 1224 if (is_per_user_install && !GetUserSpecificRegistrySuffix(&suffix)) { |
1220 !GetUserSpecificRegistrySuffix(&suffix)) { | |
1221 NOTREACHED(); | 1225 NOTREACHED(); |
1222 } | 1226 } |
1223 // There is only one component (i.e. the suffixed appid) in this case, but it | 1227 // There is only one component (i.e. the suffixed appid) in this case, but it |
1224 // is still necessary to go through the appid constructor to make sure the | 1228 // is still necessary to go through the appid constructor to make sure the |
1225 // returned appid is truncated if necessary. | 1229 // returned appid is truncated if necessary. |
1226 std::vector<string16> components(1, app_id.append(suffix)); | 1230 std::vector<string16> components(1, app_id.append(suffix)); |
1227 return BuildAppModelId(components); | 1231 return BuildAppModelId(components); |
1228 } | 1232 } |
1229 | 1233 |
1230 string16 ShellUtil::BuildAppModelId( | 1234 string16 ShellUtil::BuildAppModelId( |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 return; | 1629 return; |
1626 | 1630 |
1627 FilePath app_shortcuts_path; | 1631 FilePath app_shortcuts_path; |
1628 if (!PathService::Get(base::DIR_APP_SHORTCUTS, &app_shortcuts_path)) { | 1632 if (!PathService::Get(base::DIR_APP_SHORTCUTS, &app_shortcuts_path)) { |
1629 LOG(ERROR) << "Could not get application shortcuts location to delete" | 1633 LOG(ERROR) << "Could not get application shortcuts location to delete" |
1630 << " start screen shortcuts."; | 1634 << " start screen shortcuts."; |
1631 return; | 1635 return; |
1632 } | 1636 } |
1633 | 1637 |
1634 app_shortcuts_path = app_shortcuts_path.Append( | 1638 app_shortcuts_path = app_shortcuts_path.Append( |
1635 GetBrowserModelId(dist, chrome_exe)); | 1639 GetBrowserModelId(dist, |
| 1640 InstallUtil::IsPerUserInstall(chrome_exe.c_str()))); |
1636 if (!file_util::DirectoryExists(app_shortcuts_path)) { | 1641 if (!file_util::DirectoryExists(app_shortcuts_path)) { |
1637 VLOG(1) << "No start screen shortcuts to delete."; | 1642 VLOG(1) << "No start screen shortcuts to delete."; |
1638 return; | 1643 return; |
1639 } | 1644 } |
1640 | 1645 |
1641 VLOG(1) << "Removing start screen shortcuts from " | 1646 VLOG(1) << "Removing start screen shortcuts from " |
1642 << app_shortcuts_path.value(); | 1647 << app_shortcuts_path.value(); |
1643 if (!file_util::Delete(app_shortcuts_path, true)) { | 1648 if (!file_util::Delete(app_shortcuts_path, true)) { |
1644 LOG(ERROR) << "Failed to remove start screen shortcuts from " | 1649 LOG(ERROR) << "Failed to remove start screen shortcuts from " |
1645 << app_shortcuts_path.value(); | 1650 << app_shortcuts_path.value(); |
(...skipping 10 matching lines...) Expand all Loading... |
1656 uint32 options) { | 1661 uint32 options) { |
1657 const FilePath chrome_path(FilePath(chrome_exe).DirName()); | 1662 const FilePath chrome_path(FilePath(chrome_exe).DirName()); |
1658 | 1663 |
1659 installer::MasterPreferences prefs( | 1664 installer::MasterPreferences prefs( |
1660 chrome_path.AppendASCII(installer::kDefaultMasterPrefs)); | 1665 chrome_path.AppendASCII(installer::kDefaultMasterPrefs)); |
1661 if (FilePath::CompareEqualIgnoreCase(icon_path, chrome_exe)) { | 1666 if (FilePath::CompareEqualIgnoreCase(icon_path, chrome_exe)) { |
1662 prefs.GetInt(installer::master_preferences::kChromeShortcutIconIndex, | 1667 prefs.GetInt(installer::master_preferences::kChromeShortcutIconIndex, |
1663 &icon_index); | 1668 &icon_index); |
1664 } | 1669 } |
1665 | 1670 |
1666 const string16 app_id(GetBrowserModelId(dist, chrome_exe)); | 1671 const string16 app_id( |
| 1672 GetBrowserModelId(dist, |
| 1673 InstallUtil::IsPerUserInstall(chrome_exe.c_str()))); |
1667 const bool is_dual_mode = ((options & ShellUtil::SHORTCUT_DUAL_MODE) != 0); | 1674 const bool is_dual_mode = ((options & ShellUtil::SHORTCUT_DUAL_MODE) != 0); |
1668 const base::win::ShortcutOperation operation = | 1675 const base::win::ShortcutOperation operation = |
1669 (options & ShellUtil::SHORTCUT_CREATE_ALWAYS) != 0 ? | 1676 (options & ShellUtil::SHORTCUT_CREATE_ALWAYS) != 0 ? |
1670 base::win::SHORTCUT_CREATE_ALWAYS : | 1677 base::win::SHORTCUT_CREATE_ALWAYS : |
1671 base::win::SHORTCUT_UPDATE_EXISTING; | 1678 base::win::SHORTCUT_UPDATE_EXISTING; |
1672 | 1679 |
1673 // TODO(gab): The shell_util interface will also be refactored in an upcoming | 1680 // TODO(gab): The shell_util interface will also be refactored in an upcoming |
1674 // CL to use a ShortcutProperties like interface for its shortcut methods. | 1681 // CL to use a ShortcutProperties like interface for its shortcut methods. |
1675 base::win::ShortcutProperties shortcut_properties; | 1682 base::win::ShortcutProperties shortcut_properties; |
1676 shortcut_properties.set_target(FilePath(chrome_exe)); | 1683 shortcut_properties.set_target(FilePath(chrome_exe)); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1744 // are any left...). | 1751 // are any left...). |
1745 if (free_bits >= 8 && next_byte_index < size) { | 1752 if (free_bits >= 8 && next_byte_index < size) { |
1746 free_bits -= 8; | 1753 free_bits -= 8; |
1747 bit_stream += bytes[next_byte_index++] << free_bits; | 1754 bit_stream += bytes[next_byte_index++] << free_bits; |
1748 } | 1755 } |
1749 } | 1756 } |
1750 | 1757 |
1751 DCHECK_EQ(ret.length(), encoded_length); | 1758 DCHECK_EQ(ret.length(), encoded_length); |
1752 return ret; | 1759 return ret; |
1753 } | 1760 } |
OLD | NEW |