Index: chrome/browser/tab_contents/render_view_context_menu.cc |
=================================================================== |
--- chrome/browser/tab_contents/render_view_context_menu.cc (revision 52866) |
+++ chrome/browser/tab_contents/render_view_context_menu.cc (working copy) |
@@ -89,7 +89,7 @@ |
PlatformInit(); |
} |
-static bool ExtensionContextMatch(ContextMenuParams params, |
+static bool ExtensionContextMatch(const ContextMenuParams& params, |
ExtensionMenuItem::ContextList contexts) { |
bool has_link = !params.link_url.is_empty(); |
bool has_selection = !params.selection_text.empty(); |
@@ -125,16 +125,42 @@ |
return false; |
} |
+static bool ExtensionPatternMatch(const ExtensionExtent& patterns, |
+ const GURL& url) { |
+ // No patterns means no restriction, so that implicitly matches. |
+ if (patterns.is_empty()) |
+ return true; |
+ return patterns.ContainsURL(url); |
+} |
+ |
+static const GURL& GetDocumentURL(const ContextMenuParams& params) { |
+ return params.frame_url.is_empty() ? params.page_url : params.frame_url; |
+} |
+ |
// Given a list of items, returns the ones that match given the contents |
// of |params|. |
static ExtensionMenuItem::List GetRelevantExtensionItems( |
const ExtensionMenuItem::List& items, |
- ContextMenuParams params) { |
+ const ContextMenuParams& params) { |
ExtensionMenuItem::List result; |
for (ExtensionMenuItem::List::const_iterator i = items.begin(); |
i != items.end(); ++i) { |
- if (ExtensionContextMatch(params, (*i)->contexts())) |
- result.push_back(*i); |
+ const ExtensionMenuItem* item = *i; |
+ |
+ if (!ExtensionContextMatch(params, item->contexts())) |
+ continue; |
+ |
+ const GURL& document_url = GetDocumentURL(params); |
+ if (!ExtensionPatternMatch(item->document_url_patterns(), document_url)) |
+ continue; |
+ |
+ const GURL& target_url = |
+ params.src_url.is_empty() ? params.link_url : params.src_url; |
+ if (!target_url.is_empty() && |
+ !ExtensionPatternMatch(item->target_url_patterns(), target_url)) |
+ continue; |
+ |
+ result.push_back(*i); |
} |
return result; |
} |
@@ -268,6 +294,9 @@ |
if (!service) |
return; // In unit-tests, we may not have an ExtensionService. |
ExtensionMenuManager* menu_manager = service->menu_manager(); |
+ const GURL& document_url = GetDocumentURL(params_); |
+ if (!menu_manager->HasAllowedScheme(document_url)) |
+ return; |
// Get a list of extension id's that have context menu items, and sort it by |
// the extension's name. |