Chromium Code Reviews| 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 1185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1196 return true; | 1196 return true; |
| 1197 } | 1197 } |
| 1198 | 1198 |
| 1199 // Shortcut filters for BatchShortcutAction(). | 1199 // Shortcut filters for BatchShortcutAction(). |
| 1200 | 1200 |
| 1201 typedef base::Callback<bool(const base::FilePath& /*shortcut_path*/, | 1201 typedef base::Callback<bool(const base::FilePath& /*shortcut_path*/, |
| 1202 const string16& /*args*/)> | 1202 const string16& /*args*/)> |
| 1203 ShortcutFilterCallback; | 1203 ShortcutFilterCallback; |
| 1204 | 1204 |
| 1205 // FilterTargetEq is a shortcut filter that matches only shortcuts that have a | 1205 // FilterTargetEq is a shortcut filter that matches only shortcuts that have a |
| 1206 // specific target. | 1206 // specific target, and optionally matches shortcuts that have non-empty |
| 1207 // arguments. | |
| 1207 class FilterTargetEq { | 1208 class FilterTargetEq { |
| 1208 public: | 1209 public: |
| 1209 explicit FilterTargetEq(const base::FilePath& desired_target_exe); | 1210 FilterTargetEq(const base::FilePath& desired_target_exe, bool require_args); |
| 1210 | 1211 |
| 1211 // Returns true if filter rules are satisfied, i.e.: | 1212 // Returns true if filter rules are satisfied, i.e.: |
| 1212 // - |target_path| matches |desired_target_compare_|. | 1213 // - |target_path|'s target == |desired_target_compare_|, and |
| 1214 // - |args| is non-empty (if |require_args_| == true). | |
| 1213 bool Match(const base::FilePath& target_path, const string16& args) const; | 1215 bool Match(const base::FilePath& target_path, const string16& args) const; |
| 1214 | 1216 |
| 1215 // A convenience routine to create a callback to call Match(). | 1217 // A convenience routine to create a callback to call Match(). |
| 1216 // The callback is only valid during the lifetime of the FilterTargetEq | 1218 // The callback is only valid during the lifetime of the FilterTargetEq |
| 1217 // instance. | 1219 // instance. |
| 1218 ShortcutFilterCallback AsShortcutFilterCallback(); | 1220 ShortcutFilterCallback AsShortcutFilterCallback(); |
| 1219 | 1221 |
| 1220 private: | 1222 private: |
| 1221 InstallUtil::ProgramCompare desired_target_compare_; | 1223 InstallUtil::ProgramCompare desired_target_compare_; |
| 1224 | |
| 1225 bool require_args_; | |
| 1222 }; | 1226 }; |
| 1223 | 1227 |
| 1224 FilterTargetEq::FilterTargetEq(const base::FilePath& desired_target_exe) | 1228 FilterTargetEq::FilterTargetEq(const base::FilePath& desired_target_exe, |
| 1225 : desired_target_compare_(desired_target_exe) {} | 1229 bool require_args) |
| 1230 : desired_target_compare_(desired_target_exe), | |
| 1231 require_args_(require_args) {} | |
| 1226 | 1232 |
| 1227 bool FilterTargetEq::Match(const base::FilePath& target_path, | 1233 bool FilterTargetEq::Match(const base::FilePath& target_path, |
| 1228 const string16& args) const { | 1234 const string16& args) const { |
| 1229 return desired_target_compare_.EvaluatePath(target_path); | 1235 if (!desired_target_compare_.EvaluatePath(target_path)) |
| 1236 return false; | |
| 1237 if (require_args_ && args.empty()) | |
| 1238 return false; | |
| 1239 return true; | |
| 1230 } | 1240 } |
| 1231 | 1241 |
| 1232 ShortcutFilterCallback FilterTargetEq::AsShortcutFilterCallback() { | 1242 ShortcutFilterCallback FilterTargetEq::AsShortcutFilterCallback() { |
| 1233 return base::Bind(&FilterTargetEq::Match, base::Unretained(this)); | 1243 return base::Bind(&FilterTargetEq::Match, base::Unretained(this)); |
| 1234 } | 1244 } |
| 1235 | 1245 |
| 1236 // Shortcut operations for BatchShortcutAction(). | 1246 // Shortcut operations for BatchShortcutAction(). |
| 1237 | 1247 |
| 1238 typedef base::Callback<bool(const base::FilePath& /*shortcut_path*/)> | 1248 typedef base::Callback<bool(const base::FilePath& /*shortcut_path*/)> |
| 1239 ShortcutOperationCallback; | 1249 ShortcutOperationCallback; |
| (...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2035 } | 2045 } |
| 2036 | 2046 |
| 2037 // static | 2047 // static |
| 2038 bool ShellUtil::RemoveShortcuts(ShellUtil::ShortcutLocation location, | 2048 bool ShellUtil::RemoveShortcuts(ShellUtil::ShortcutLocation location, |
| 2039 BrowserDistribution* dist, | 2049 BrowserDistribution* dist, |
| 2040 ShellChange level, | 2050 ShellChange level, |
| 2041 const base::FilePath& target_exe) { | 2051 const base::FilePath& target_exe) { |
| 2042 if (!ShellUtil::ShortcutLocationIsSupported(location)) | 2052 if (!ShellUtil::ShortcutLocationIsSupported(location)) |
| 2043 return true; // Vacuous success. | 2053 return true; // Vacuous success. |
| 2044 | 2054 |
| 2045 FilterTargetEq shortcut_filter(target_exe); | 2055 FilterTargetEq shortcut_filter(target_exe, false); |
| 2046 // Main operation to apply to each shortcut in the directory specified. | 2056 // Main operation to apply to each shortcut in the directory specified. |
| 2047 ShortcutOperationCallback shortcut_operation( | 2057 ShortcutOperationCallback shortcut_operation( |
| 2048 location == SHORTCUT_LOCATION_TASKBAR_PINS ? | 2058 location == SHORTCUT_LOCATION_TASKBAR_PINS ? |
| 2049 base::Bind(&ShortcutOpUnpin) : base::Bind(&ShortcutOpDelete)); | 2059 base::Bind(&ShortcutOpUnpin) : base::Bind(&ShortcutOpDelete)); |
| 2050 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2060 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
| 2051 shortcut_operation, location, dist, level); | 2061 shortcut_operation, location, dist, level); |
| 2052 // Remove chrome-specific shortcut folders if they are now empty. | 2062 // Remove chrome-specific shortcut folders if they are now empty. |
| 2053 if (success && | 2063 if (success && |
| 2054 (location == SHORTCUT_LOCATION_START_MENU || | 2064 (location == SHORTCUT_LOCATION_START_MENU || |
| 2055 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { | 2065 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { |
| 2056 success = RemoveShortcutFolderIfEmpty(location, dist, level); | 2066 success = RemoveShortcutFolderIfEmpty(location, dist, level); |
| 2057 } | 2067 } |
| 2058 return success; | 2068 return success; |
| 2059 } | 2069 } |
| 2060 | 2070 |
| 2061 // static | 2071 // static |
| 2062 bool ShellUtil::UpdateShortcuts( | 2072 bool ShellUtil::UpdateShortcuts( |
| 2063 ShellUtil::ShortcutLocation location, | 2073 ShellUtil::ShortcutLocation location, |
| 2064 BrowserDistribution* dist, | 2074 BrowserDistribution* dist, |
| 2065 ShellChange level, | 2075 ShellChange level, |
| 2066 const base::FilePath& target_exe, | 2076 const base::FilePath& target_exe, |
| 2077 bool require_args, | |
|
gab
2013/09/09 13:00:31
I don't see a case where setting |require_args| to
huangs
2013/09/11 19:02:52
The purpose of |require_args| is keep UpdateShortc
gab
2013/09/11 20:23:06
sgtm.
| |
| 2067 const ShellUtil::ShortcutProperties& properties) { | 2078 const ShellUtil::ShortcutProperties& properties) { |
| 2068 if (!ShellUtil::ShortcutLocationIsSupported(location)) | 2079 if (!ShellUtil::ShortcutLocationIsSupported(location)) |
| 2069 return true; // Vacuous success. | 2080 return true; // Vacuous success. |
| 2070 | 2081 |
| 2071 FilterTargetEq shortcut_filter(target_exe); | 2082 FilterTargetEq shortcut_filter(target_exe, require_args); |
| 2072 ShortcutOperationCallback shortcut_operation( | 2083 ShortcutOperationCallback shortcut_operation( |
| 2073 base::Bind(&ShortcutOpUpdate, TranslateShortcutProperties(properties))); | 2084 base::Bind(&ShortcutOpUpdate, TranslateShortcutProperties(properties))); |
| 2074 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2085 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
| 2075 shortcut_operation, location, dist, level); | 2086 shortcut_operation, location, dist, level); |
| 2076 } | 2087 } |
| 2077 | 2088 |
| 2078 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) { | 2089 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) { |
| 2079 // Use a thread-safe cache for the user's suffix. | 2090 // Use a thread-safe cache for the user's suffix. |
| 2080 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance = | 2091 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance = |
| 2081 LAZY_INSTANCE_INITIALIZER; | 2092 LAZY_INSTANCE_INITIALIZER; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2135 // are any left...). | 2146 // are any left...). |
| 2136 if (free_bits >= 8 && next_byte_index < size) { | 2147 if (free_bits >= 8 && next_byte_index < size) { |
| 2137 free_bits -= 8; | 2148 free_bits -= 8; |
| 2138 bit_stream += bytes[next_byte_index++] << free_bits; | 2149 bit_stream += bytes[next_byte_index++] << free_bits; |
| 2139 } | 2150 } |
| 2140 } | 2151 } |
| 2141 | 2152 |
| 2142 DCHECK_EQ(ret.length(), encoded_length); | 2153 DCHECK_EQ(ret.length(), encoded_length); |
| 2143 return ret; | 2154 return ret; |
| 2144 } | 2155 } |
| OLD | NEW |