| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser/extensions/extension_context_menu_api.h" | 5 #include "chrome/browser/extensions/extension_context_menu_api.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 success = menu_manager->AddContextItem(GetExtension(), item.release()); | 262 success = menu_manager->AddContextItem(GetExtension(), item.release()); |
| 263 } | 263 } |
| 264 | 264 |
| 265 if (!success) | 265 if (!success) |
| 266 return false; | 266 return false; |
| 267 | 267 |
| 268 return true; | 268 return true; |
| 269 } | 269 } |
| 270 | 270 |
| 271 bool UpdateContextMenuFunction::RunImpl() { | 271 bool UpdateContextMenuFunction::RunImpl() { |
| 272 bool radioItemUpdated = false; |
| 272 ExtensionMenuItem::Id item_id(profile(), extension_id(), 0); | 273 ExtensionMenuItem::Id item_id(profile(), extension_id(), 0); |
| 273 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &item_id.uid)); | 274 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &item_id.uid)); |
| 274 | 275 |
| 275 ExtensionService* service = profile()->GetExtensionService(); | 276 ExtensionService* service = profile()->GetExtensionService(); |
| 276 ExtensionMenuManager* manager = service->menu_manager(); | 277 ExtensionMenuManager* manager = service->menu_manager(); |
| 277 ExtensionMenuItem* item = manager->GetItemById(item_id); | 278 ExtensionMenuItem* item = manager->GetItemById(item_id); |
| 278 if (!item || item->extension_id() != extension_id()) { | 279 if (!item || item->extension_id() != extension_id()) { |
| 279 error_ = ExtensionErrorUtils::FormatErrorMessage( | 280 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 280 kCannotFindItemError, base::IntToString(item_id.uid)); | 281 kCannotFindItemError, base::IntToString(item_id.uid)); |
| 281 return false; | 282 return false; |
| 282 } | 283 } |
| 283 | 284 |
| 284 DictionaryValue *properties = NULL; | 285 DictionaryValue* properties = NULL; |
| 285 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &properties)); | 286 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &properties)); |
| 286 EXTENSION_FUNCTION_VALIDATE(properties != NULL); | 287 EXTENSION_FUNCTION_VALIDATE(properties != NULL); |
| 287 | 288 |
| 288 ExtensionMenuManager* menu_manager = | |
| 289 profile()->GetExtensionService()->menu_manager(); | |
| 290 | |
| 291 // Type. | 289 // Type. |
| 292 ExtensionMenuItem::Type type; | 290 ExtensionMenuItem::Type type; |
| 293 if (!ParseType(*properties, item->type(), &type)) | 291 if (!ParseType(*properties, item->type(), &type)) |
| 294 return false; | 292 return false; |
| 295 if (type != item->type()) | 293 if (type != item->type()) { |
| 294 if (type == ExtensionMenuItem::RADIO || |
| 295 item->type() == ExtensionMenuItem::RADIO) { |
| 296 radioItemUpdated = true; |
| 297 } |
| 296 item->set_type(type); | 298 item->set_type(type); |
| 299 } |
| 297 | 300 |
| 298 // Title. | 301 // Title. |
| 299 if (properties->HasKey(kTitleKey)) { | 302 if (properties->HasKey(kTitleKey)) { |
| 300 std::string title; | 303 std::string title; |
| 301 EXTENSION_FUNCTION_VALIDATE(properties->GetString(kTitleKey, &title)); | 304 EXTENSION_FUNCTION_VALIDATE(properties->GetString(kTitleKey, &title)); |
| 302 if (title.empty() && type != ExtensionMenuItem::SEPARATOR) { | 305 if (title.empty() && type != ExtensionMenuItem::SEPARATOR) { |
| 303 error_ = kTitleNeededError; | 306 error_ = kTitleNeededError; |
| 304 return false; | 307 return false; |
| 305 } | 308 } |
| 306 item->set_title(title); | 309 item->set_title(title); |
| 307 } | 310 } |
| 308 | 311 |
| 309 // Checked state. | 312 // Checked state. |
| 310 bool checked; | 313 bool checked; |
| 311 if (!ParseChecked(item->type(), *properties, item->checked(), &checked)) | 314 if (!ParseChecked(item->type(), *properties, item->checked(), &checked)) |
| 312 return false; | 315 return false; |
| 313 if (checked != item->checked()) { | 316 if (checked != item->checked()) { |
| 314 if (!item->SetChecked(checked)) | 317 if (!item->SetChecked(checked)) |
| 315 return false; | 318 return false; |
| 319 radioItemUpdated = true; |
| 316 } | 320 } |
| 317 | 321 |
| 318 // Contexts. | 322 // Contexts. |
| 319 ExtensionMenuItem::ContextList contexts(item->contexts()); | 323 ExtensionMenuItem::ContextList contexts(item->contexts()); |
| 320 if (!ParseContexts(*properties, kContextsKey, &contexts)) | 324 if (!ParseContexts(*properties, kContextsKey, &contexts)) |
| 321 return false; | 325 return false; |
| 322 if (contexts != item->contexts()) | 326 if (contexts != item->contexts()) |
| 323 item->set_contexts(contexts); | 327 item->set_contexts(contexts); |
| 324 | 328 |
| 325 // Parent id. | 329 // Parent id. |
| 326 ExtensionMenuItem* parent = NULL; | 330 ExtensionMenuItem* parent = NULL; |
| 327 if (!GetParent(*properties, *menu_manager, &parent)) | 331 if (!GetParent(*properties, *manager, &parent)) |
| 328 return false; | 332 return false; |
| 329 if (parent && !menu_manager->ChangeParent(item->id(), &parent->id())) | 333 if (parent && !manager->ChangeParent(item->id(), &parent->id())) |
| 330 return false; | 334 return false; |
| 331 | 335 |
| 332 if (!SetURLPatterns(*properties, item)) | 336 if (!SetURLPatterns(*properties, item)) |
| 333 return false; | 337 return false; |
| 334 | 338 |
| 339 // There is no need to call ItemUpdated if ChangeParent is called because |
| 340 // all sanitation is taken care of in ChangeParent. |
| 341 if (!parent && radioItemUpdated && !manager->ItemUpdated(item->id())) |
| 342 return false; |
| 343 |
| 335 return true; | 344 return true; |
| 336 } | 345 } |
| 337 | 346 |
| 338 bool RemoveContextMenuFunction::RunImpl() { | 347 bool RemoveContextMenuFunction::RunImpl() { |
| 339 ExtensionMenuItem::Id id(profile(), extension_id(), 0); | 348 ExtensionMenuItem::Id id(profile(), extension_id(), 0); |
| 340 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &id.uid)); | 349 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &id.uid)); |
| 341 ExtensionService* service = profile()->GetExtensionService(); | 350 ExtensionService* service = profile()->GetExtensionService(); |
| 342 ExtensionMenuManager* manager = service->menu_manager(); | 351 ExtensionMenuManager* manager = service->menu_manager(); |
| 343 | 352 |
| 344 ExtensionMenuItem* item = manager->GetItemById(id); | 353 ExtensionMenuItem* item = manager->GetItemById(id); |
| 345 // Ensure one extension can't remove another's menu items. | 354 // Ensure one extension can't remove another's menu items. |
| 346 if (!item || item->extension_id() != extension_id()) { | 355 if (!item || item->extension_id() != extension_id()) { |
| 347 error_ = ExtensionErrorUtils::FormatErrorMessage( | 356 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 348 kCannotFindItemError, base::IntToString(id.uid)); | 357 kCannotFindItemError, base::IntToString(id.uid)); |
| 349 return false; | 358 return false; |
| 350 } | 359 } |
| 351 | 360 |
| 352 return manager->RemoveContextMenuItem(id); | 361 return manager->RemoveContextMenuItem(id); |
| 353 } | 362 } |
| 354 | 363 |
| 355 bool RemoveAllContextMenusFunction::RunImpl() { | 364 bool RemoveAllContextMenusFunction::RunImpl() { |
| 356 ExtensionService* service = profile()->GetExtensionService(); | 365 ExtensionService* service = profile()->GetExtensionService(); |
| 357 ExtensionMenuManager* manager = service->menu_manager(); | 366 ExtensionMenuManager* manager = service->menu_manager(); |
| 358 manager->RemoveAllContextItems(extension_id()); | 367 manager->RemoveAllContextItems(extension_id()); |
| 359 return true; | 368 return true; |
| 360 } | 369 } |
| OLD | NEW |