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

Unified Diff: chrome/browser/extensions/extension_context_menu_api.cc

Issue 2811049: Add ability to limit when context menu items appear with url patterns.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_context_menu_api.cc
===================================================================
--- chrome/browser/extensions/extension_context_menu_api.cc (revision 52866)
+++ chrome/browser/extensions/extension_context_menu_api.cc (working copy)
@@ -13,14 +13,17 @@
const wchar_t kCheckedKey[] = L"checked";
const wchar_t kContextsKey[] = L"contexts";
+const wchar_t kDocumentUrlPatternsKey[] = L"documentUrlPatterns";
const wchar_t kGeneratedIdKey[] = L"generatedId";
const wchar_t kParentIdKey[] = L"parentId";
+const wchar_t kTargetUrlPatternsKey[] = L"targetUrlPatterns";
const wchar_t kTitleKey[] = L"title";
const wchar_t kTypeKey[] = L"type";
const char kCannotFindItemError[] = "Cannot find menu item with id *";
const char kCheckedError[] =
"Only items with type \"radio\" or \"checkbox\" can be checked";
+const char kInvalidURLPatternError[] = "Invalid url pattern '*'";
const char kInvalidValueError[] = "Invalid value for *";
const char kInvalidTypeStringError[] = "Invalid type string '*'";
const char kParentsMustBeNormalError[] =
@@ -119,6 +122,58 @@
return true;
}
+bool ExtensionContextMenuFunction::ParseURLPatterns(
+ const DictionaryValue& properties,
+ const wchar_t* key,
+ ExtensionExtent* result) {
+ if (!properties.HasKey(key))
+ return true;
+ ListValue* list = NULL;
+ if (!properties.GetList(key, &list))
+ return false;
+ for (ListValue::iterator i = list->begin(); i != list->end(); ++i) {
+ std::string tmp;
+ if (!(*i)->GetAsString(&tmp))
+ return false;
+
+ URLPattern pattern(ExtensionMenuManager::kAllowedSchemes);
+ if (!pattern.Parse(tmp)) {
+ error_ = ExtensionErrorUtils::FormatErrorMessage(kInvalidURLPatternError,
+ tmp);
+ return false;
+ }
+ result->AddPattern(pattern);
+ }
+ return true;
+}
+
+bool ExtensionContextMenuFunction::SetURLPatterns(
+ const DictionaryValue& properties,
+ ExtensionMenuItem* item) {
+ // Process the documentUrlPattern value.
+ ExtensionExtent document_url_patterns;
+ if (!ParseURLPatterns(properties, kDocumentUrlPatternsKey,
+ &document_url_patterns))
+ return false;
+
+ if (!document_url_patterns.is_empty()) {
+ item->set_document_url_patterns(document_url_patterns);
+ }
+
+ // Process the targetUrlPattern value.
+ ExtensionExtent target_url_patterns;
+ if (!ParseURLPatterns(properties, kTargetUrlPatternsKey,
+ &target_url_patterns))
+ return false;
+
+ if (!target_url_patterns.is_empty()) {
+ item->set_target_url_patterns(target_url_patterns);
+ }
+
+ return true;
+}
+
+
bool ExtensionContextMenuFunction::GetParent(
const DictionaryValue& properties,
const ExtensionMenuManager& manager,
@@ -179,6 +234,9 @@
scoped_ptr<ExtensionMenuItem> item(
new ExtensionMenuItem(id, title, checked, type, contexts));
+ if (!SetURLPatterns(*properties, item.get()))
+ return false;
+
bool success = true;
if (properties->HasKey(kParentIdKey)) {
ExtensionMenuItem::Id parent_id(extension_id(), 0);
@@ -233,15 +291,15 @@
item->set_type(type);
// Title.
- std::string title;
- if (properties->HasKey(kTitleKey) &&
- !properties->GetString(kTitleKey, &title))
- return false;
- if (title.empty() && type != ExtensionMenuItem::SEPARATOR) {
- error_ = kTitleNeededError;
- return false;
+ if (properties->HasKey(kTitleKey)) {
+ std::string title;
+ EXTENSION_FUNCTION_VALIDATE(properties->GetString(kTitleKey, &title));
+ if (title.empty() && type != ExtensionMenuItem::SEPARATOR) {
+ error_ = kTitleNeededError;
+ return false;
+ }
+ item->set_title(title);
}
- item->set_title(title);
// Checked state.
bool checked;
@@ -266,6 +324,9 @@
if (parent && !menu_manager->ChangeParent(item->id(), &parent->id()))
return false;
+ if (!SetURLPatterns(*properties, item))
+ return false;
+
return true;
}

Powered by Google App Engine
This is Rietveld 408576698