Index: chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h |
diff --git a/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h b/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h |
index a2c09d8457b1ec47a5b73ad566d7198be6d69559..0f661658fd2d204eaf9f9d753acf99534c818bf8 100644 |
--- a/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h |
+++ b/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h |
@@ -17,9 +17,10 @@ namespace context_menus_api_helpers { |
namespace { |
-template<typename PropertyWithEnumT> |
+template <typename PropertyWithEnumT> |
scoped_ptr<extensions::MenuItem::Id> GetParentId( |
const PropertyWithEnumT& property, |
+ int webview_instance_id, |
bool is_off_the_record, |
std::string extension_id) { |
if (!property.parent_id) |
@@ -33,6 +34,10 @@ scoped_ptr<extensions::MenuItem::Id> GetParentId( |
parent_id->string_uid = *property.parent_id->as_string; |
else |
NOTREACHED(); |
+ |
+ if (webview_instance_id) |
+ parent_id->webview_instance_id = webview_instance_id; |
+ |
return parent_id.Pass(); |
} |
@@ -86,6 +91,7 @@ MenuItem::ContextList GetContexts(const PropertyWithEnumT& property) { |
contexts.Add(extensions::MenuItem::FRAME); |
break; |
case PropertyWithEnumT::CONTEXTS_TYPE_LAUNCHER: |
+ // Not available for <webview>. |
contexts.Add(extensions::MenuItem::LAUNCHER); |
break; |
case PropertyWithEnumT::CONTEXTS_TYPE_NONE: |
@@ -120,6 +126,7 @@ bool CreateMenuItem(const PropertyWithEnumT& create_properties, |
const Extension* extension, |
const MenuItem::Id& item_id, |
std::string* error) { |
+ bool is_webview = item_id.webview_instance_id != 0; |
MenuManager* menu_manager = MenuManager::Get(profile); |
if (menu_manager->GetItemById(item_id)) { |
@@ -128,7 +135,7 @@ bool CreateMenuItem(const PropertyWithEnumT& create_properties, |
return false; |
} |
- if (BackgroundInfo::HasLazyBackgroundPage(extension) && |
+ if (!is_webview && BackgroundInfo::HasLazyBackgroundPage(extension) && |
create_properties.onclick.get()) { |
*error = kOnclickDisallowedError; |
return false; |
@@ -141,9 +148,12 @@ bool CreateMenuItem(const PropertyWithEnumT& create_properties, |
else |
contexts.Add(MenuItem::PAGE); |
- if (contexts.Contains(MenuItem::LAUNCHER) && !extension->is_platform_app()) { |
- *error = kLauncherNotAllowedError; |
- return false; |
+ if (contexts.Contains(MenuItem::LAUNCHER)) { |
+ // Launcher item is not allowed for <webview>. |
+ if (!extension->is_platform_app() || is_webview) { |
+ *error = kLauncherNotAllowedError; |
+ return false; |
+ } |
} |
// Title. |
@@ -181,6 +191,7 @@ bool CreateMenuItem(const PropertyWithEnumT& create_properties, |
// Parent id. |
bool success = true; |
scoped_ptr<MenuItem::Id> parent_id(GetParentId(create_properties, |
+ item_id.webview_instance_id, |
profile->IsOffTheRecord(), |
extension->id())); |
if (parent_id.get()) { |
@@ -207,6 +218,7 @@ bool UpdateMenuItem(const PropertyWithEnumT& update_properties, |
const MenuItem::Id& item_id, |
std::string* error) { |
bool radio_item_updated = false; |
+ bool is_webview = item_id.webview_instance_id != 0; |
MenuManager* menu_manager = MenuManager::Get(profile); |
MenuItem* item = menu_manager->GetItemById(item_id); |
@@ -262,10 +274,12 @@ bool UpdateMenuItem(const PropertyWithEnumT& update_properties, |
if (update_properties.contexts.get()) { |
contexts = GetContexts(update_properties); |
- if (contexts.Contains(MenuItem::LAUNCHER) && |
- !extension->is_platform_app()) { |
- *error = kLauncherNotAllowedError; |
- return false; |
+ if (contexts.Contains(MenuItem::LAUNCHER)) { |
+ // Launcher item is not allowed for <webview>. |
+ if (!extension->is_platform_app() || is_webview) { |
+ *error = kLauncherNotAllowedError; |
+ return false; |
+ } |
} |
if (contexts != item->contexts()) |
@@ -275,6 +289,7 @@ bool UpdateMenuItem(const PropertyWithEnumT& update_properties, |
// Parent id. |
MenuItem* parent = NULL; |
scoped_ptr<MenuItem::Id> parent_id(GetParentId(update_properties, |
+ item_id.webview_instance_id, |
profile->IsOffTheRecord(), |
extension->id())); |
if (parent_id.get()) { |