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

Unified Diff: chrome/browser/tab_contents/render_view_context_menu.cc

Issue 7057029: For extension context menus, only apply targetUrlPatterns to appropriate contexts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update Copyright Header Created 9 years, 7 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/tab_contents/render_view_context_menu.cc
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index 4885965e98a76e28f8b923f1166c22acbf326820..834be0a0500d04f1f09864b32e823b2940b7257d 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -204,29 +204,51 @@ void RenderViewContextMenu::Init() {
PlatformInit();
}
-static bool ExtensionContextMatch(const ContextMenuParams& params,
- ExtensionMenuItem::ContextList contexts) {
+static bool ExtensionPatternMatch(const URLPatternSet& patterns,
+ const GURL& url) {
+ // No patterns means no restriction, so that implicitly matches.
+ if (patterns.is_empty())
+ return true;
+ return patterns.MatchesURL(url);
+}
+
+// static
+bool RenderViewContextMenu::ExtensionContextAndPatternMatch(
+ const ContextMenuParams& params,
+ ExtensionMenuItem::ContextList contexts,
+ const URLPatternSet& target_url_patterns) {
bool has_link = !params.link_url.is_empty();
bool has_selection = !params.selection_text.empty();
bool in_frame = !params.frame_url.is_empty();
if (contexts.Contains(ExtensionMenuItem::ALL) ||
(has_selection && contexts.Contains(ExtensionMenuItem::SELECTION)) ||
- (has_link && contexts.Contains(ExtensionMenuItem::LINK)) ||
(params.is_editable && contexts.Contains(ExtensionMenuItem::EDITABLE)) ||
- (in_frame && contexts.Contains(ExtensionMenuItem::FRAME))) {
+ (in_frame && contexts.Contains(ExtensionMenuItem::FRAME)))
+ return true;
+
+ if (has_link && contexts.Contains(ExtensionMenuItem::LINK) &&
+ ExtensionPatternMatch(target_url_patterns, params.link_url))
return true;
- }
switch (params.media_type) {
case WebContextMenuData::MediaTypeImage:
- return contexts.Contains(ExtensionMenuItem::IMAGE);
+ if (contexts.Contains(ExtensionMenuItem::IMAGE) &&
+ ExtensionPatternMatch(target_url_patterns, params.src_url))
+ return true;
+ break;
case WebContextMenuData::MediaTypeVideo:
- return contexts.Contains(ExtensionMenuItem::VIDEO);
+ if (contexts.Contains(ExtensionMenuItem::VIDEO) &&
+ ExtensionPatternMatch(target_url_patterns, params.src_url))
+ return true;
+ break;
case WebContextMenuData::MediaTypeAudio:
- return contexts.Contains(ExtensionMenuItem::AUDIO);
+ if (contexts.Contains(ExtensionMenuItem::AUDIO) &&
+ ExtensionPatternMatch(target_url_patterns, params.src_url))
+ return true;
+ break;
default:
break;
@@ -243,21 +265,14 @@ static bool ExtensionContextMatch(const ContextMenuParams& params,
return false;
}
-static bool ExtensionPatternMatch(const URLPatternSet& patterns,
- const GURL& url) {
- // No patterns means no restriction, so that implicitly matches.
- if (patterns.is_empty())
- return true;
- return patterns.MatchesURL(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| and the profile.
-static ExtensionMenuItem::List GetRelevantExtensionItems(
+// static
+ExtensionMenuItem::List RenderViewContextMenu::GetRelevantExtensionItems(
const ExtensionMenuItem::List& items,
const ContextMenuParams& params,
Profile* profile,
@@ -267,18 +282,14 @@ static ExtensionMenuItem::List GetRelevantExtensionItems(
i != items.end(); ++i) {
const ExtensionMenuItem* item = *i;
- if (!ExtensionContextMatch(params, item->contexts()))
+ if (!ExtensionContextAndPatternMatch(params, item->contexts(),
+ item->target_url_patterns()))
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 (!ExtensionPatternMatch(item->target_url_patterns(), target_url))
- continue;
-
if (item->id().profile == profile || can_cross_incognito)
result.push_back(*i);
}

Powered by Google App Engine
This is Rietveld 408576698