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

Side by Side Diff: chrome/common/extensions/command.cc

Issue 12965009: Remove the limit of number of commands per extension, but keep the limit of 4 shortcuts per extensi… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 9 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
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 #include "chrome/common/extensions/command.h" 5 #include "chrome/common/extensions/command.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 ParseImpl(accelerator, Command::CommandPlatform(), 0, &error); 201 ParseImpl(accelerator, Command::CommandPlatform(), 0, &error);
202 return parsed; 202 return parsed;
203 } 203 }
204 204
205 bool Command::Parse(const DictionaryValue* command, 205 bool Command::Parse(const DictionaryValue* command,
206 const std::string& command_name, 206 const std::string& command_name,
207 int index, 207 int index,
208 string16* error) { 208 string16* error) {
209 DCHECK(!command_name.empty()); 209 DCHECK(!command_name.empty());
210 210
211 string16 description;
212 if (command_name != values::kPageActionCommandEvent &&
213 command_name != values::kBrowserActionCommandEvent &&
214 command_name != values::kScriptBadgeCommandEvent) {
215 if (!command->GetString(keys::kDescription, &description) ||
216 description.empty()) {
217 *error = ErrorUtils::FormatErrorMessageUTF16(
218 errors::kInvalidKeyBindingDescription,
219 base::IntToString(index));
220 return false;
221 }
222 }
223
211 // We'll build up a map of platform-to-shortcut suggestions. 224 // We'll build up a map of platform-to-shortcut suggestions.
212 typedef std::map<const std::string, std::string> SuggestionMap; 225 typedef std::map<const std::string, std::string> SuggestionMap;
213 SuggestionMap suggestions; 226 SuggestionMap suggestions;
214 227
215 // First try to parse the |suggested_key| as a dictionary. 228 // First try to parse the |suggested_key| as a dictionary.
216 const DictionaryValue* suggested_key_dict; 229 const DictionaryValue* suggested_key_dict;
217 if (command->GetDictionary(keys::kSuggestedKey, &suggested_key_dict)) { 230 if (command->GetDictionary(keys::kSuggestedKey, &suggested_key_dict)) {
218 for (DictionaryValue::Iterator iter(*suggested_key_dict); !iter.IsAtEnd(); 231 for (DictionaryValue::Iterator iter(*suggested_key_dict); !iter.IsAtEnd();
219 iter.Advance()) { 232 iter.Advance()) {
220 // For each item in the dictionary, extract the platforms specified. 233 // For each item in the dictionary, extract the platforms specified.
(...skipping 14 matching lines...) Expand all
235 } else { 248 } else {
236 // No dictionary was found, fall back to using just a string, so developers 249 // No dictionary was found, fall back to using just a string, so developers
237 // don't have to specify a dictionary if they just want to use one default 250 // don't have to specify a dictionary if they just want to use one default
238 // for all platforms. 251 // for all platforms.
239 std::string suggested_key_string; 252 std::string suggested_key_string;
240 if (command->GetString(keys::kSuggestedKey, &suggested_key_string) && 253 if (command->GetString(keys::kSuggestedKey, &suggested_key_string) &&
241 !suggested_key_string.empty()) { 254 !suggested_key_string.empty()) {
242 // If only a single string is provided, it must be default for all. 255 // If only a single string is provided, it must be default for all.
243 suggestions["default"] = suggested_key_string; 256 suggestions["default"] = suggested_key_string;
244 } else { 257 } else {
245 *error = ErrorUtils::FormatErrorMessageUTF16( 258 suggestions["default"] = "";
246 errors::kInvalidKeyBinding,
247 base::IntToString(index),
248 keys::kSuggestedKey,
249 kMissing);
250 return false;
251 } 259 }
252 } 260 }
253 261
254 // Normalize the suggestions. 262 // Normalize the suggestions.
255 for (SuggestionMap::iterator iter = suggestions.begin(); 263 for (SuggestionMap::iterator iter = suggestions.begin();
256 iter != suggestions.end(); ++iter) { 264 iter != suggestions.end(); ++iter) {
257 // Before we normalize Ctrl to Command we must detect when the developer 265 // Before we normalize Ctrl to Command we must detect when the developer
258 // specified Command in the Default section, which will work on Mac after 266 // specified Command in the Default section, which will work on Mac after
259 // normalization but only fail on other platforms when they try it out on 267 // normalization but only fail on other platforms when they try it out on
260 // other platforms, which is not what we want. 268 // other platforms, which is not what we want.
(...skipping 22 matching lines...) Expand all
283 keys::kSuggestedKey, 291 keys::kSuggestedKey,
284 platform); 292 platform);
285 return false; // No platform specified and no fallback. Bail. 293 return false; // No platform specified and no fallback. Bail.
286 } 294 }
287 295
288 // For developer convenience, we parse all the suggestions (and complain about 296 // For developer convenience, we parse all the suggestions (and complain about
289 // errors for platforms other than the current one) but use only what we need. 297 // errors for platforms other than the current one) but use only what we need.
290 std::map<const std::string, std::string>::const_iterator iter = 298 std::map<const std::string, std::string>::const_iterator iter =
291 suggestions.begin(); 299 suggestions.begin();
292 for ( ; iter != suggestions.end(); ++iter) { 300 for ( ; iter != suggestions.end(); ++iter) {
293 // Note that we pass iter->first to pretend we are on a platform we're not 301 ui::Accelerator accelerator;
294 // on. 302 if (!iter->second.empty()) {
295 ui::Accelerator accelerator = 303 // Note that we pass iter->first to pretend we are on a platform we're not
296 ParseImpl(iter->second, iter->first, index, error); 304 // on.
297 if (accelerator.key_code() == ui::VKEY_UNKNOWN) { 305 accelerator = ParseImpl(iter->second, iter->first, index, error);
298 *error = ErrorUtils::FormatErrorMessageUTF16( 306 if (accelerator.key_code() == ui::VKEY_UNKNOWN) {
299 errors::kInvalidKeyBinding, 307 *error = ErrorUtils::FormatErrorMessageUTF16(
300 base::IntToString(index), 308 errors::kInvalidKeyBinding,
301 iter->first, 309 base::IntToString(index),
302 iter->second); 310 iter->first,
303 return false; 311 iter->second);
312 return false;
313 }
304 } 314 }
305 315
306 if (iter->first == key) { 316 if (iter->first == key) {
307 // This platform is our platform, so grab this key. 317 // This platform is our platform, so grab this key.
308 accelerator_ = accelerator; 318 accelerator_ = accelerator;
309 command_name_ = command_name; 319 command_name_ = command_name;
310 320 description_ = description;
311 if (command_name !=
312 extension_manifest_values::kPageActionCommandEvent &&
313 command_name !=
314 extension_manifest_values::kBrowserActionCommandEvent &&
315 command_name !=
316 extension_manifest_values::kScriptBadgeCommandEvent) {
317 if (!command->GetString(keys::kDescription, &description_) ||
318 description_.empty()) {
319 *error = ErrorUtils::FormatErrorMessageUTF16(
320 errors::kInvalidKeyBindingDescription,
321 base::IntToString(index));
322 return false;
323 }
324 }
325 } 321 }
326 } 322 }
327 return true; 323 return true;
328 } 324 }
329 325
330 DictionaryValue* Command::ToValue(const Extension* extension, 326 DictionaryValue* Command::ToValue(const Extension* extension,
331 bool active) const { 327 bool active) const {
332 DictionaryValue* extension_data = new DictionaryValue(); 328 DictionaryValue* extension_data = new DictionaryValue();
333 329
334 string16 command_description; 330 string16 command_description;
335 if (command_name() == values::kBrowserActionCommandEvent || 331 if (command_name() == values::kBrowserActionCommandEvent ||
336 command_name() == values::kPageActionCommandEvent || 332 command_name() == values::kPageActionCommandEvent ||
337 command_name() == values::kScriptBadgeCommandEvent) { 333 command_name() == values::kScriptBadgeCommandEvent) {
338 command_description = 334 command_description =
339 l10n_util::GetStringUTF16(IDS_EXTENSION_COMMANDS_GENERIC_ACTIVATE); 335 l10n_util::GetStringUTF16(IDS_EXTENSION_COMMANDS_GENERIC_ACTIVATE);
340 } else { 336 } else {
341 command_description = description(); 337 command_description = description();
342 } 338 }
343 extension_data->SetString("description", command_description); 339 extension_data->SetString("description", command_description);
344 extension_data->SetBoolean("active", active); 340 extension_data->SetBoolean("active", active);
345 extension_data->SetString("keybinding", accelerator().GetShortcutText()); 341 extension_data->SetString("keybinding", accelerator().GetShortcutText());
346 extension_data->SetString("command_name", command_name()); 342 extension_data->SetString("command_name", command_name());
347 extension_data->SetString("extension_id", extension->id()); 343 extension_data->SetString("extension_id", extension->id());
348 344
349 return extension_data; 345 return extension_data;
350 } 346 }
351 347
352 } // namespace extensions 348 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/common/extensions/api/commands/commands_manifest_unittest.cc ('k') | chrome/common/extensions/command_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698