Chromium Code Reviews| Index: chrome/browser/tab_contents/context_menu_utils.cc |
| =================================================================== |
| --- chrome/browser/tab_contents/context_menu_utils.cc (revision 0) |
| +++ chrome/browser/tab_contents/context_menu_utils.cc (revision 0) |
| @@ -0,0 +1,96 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/tab_contents/context_menu_utils.h" |
| + |
| +#include "webkit/glue/context_menu.h" |
| +#include "webkit/glue/webmenuitem.h" |
| + |
| +using WebKit::WebContextMenuData; |
| + |
| +namespace { |
| + |
|
asargent_no_longer_on_chrome
2011/04/08 18:52:33
When you merge from trunk, make sure you pick up M
|
| +bool ExtensionContextMatch(const ContextMenuParams& params, |
| + ExtensionMenuItem::ContextList contexts) { |
| + bool has_link = !params.link_url.is_empty(); |
| + bool has_selection = !params.selection_text.empty(); |
| + |
| + if (contexts.Contains(ExtensionMenuItem::ALL) || |
| + (has_selection && contexts.Contains(ExtensionMenuItem::SELECTION)) || |
| + (has_link && contexts.Contains(ExtensionMenuItem::LINK)) || |
| + (params.src_url.scheme() == "filesystem" && |
| + contexts.Contains(ExtensionMenuItem::FILE)) || |
| + (params.is_editable && contexts.Contains(ExtensionMenuItem::EDITABLE))) { |
| + return true; |
| + } |
| + |
| + switch (params.media_type) { |
| + case WebKit::WebContextMenuData::MediaTypeImage: |
| + return contexts.Contains(ExtensionMenuItem::IMAGE); |
| + |
| + case WebKit::WebContextMenuData::MediaTypeVideo: |
| + return contexts.Contains(ExtensionMenuItem::VIDEO); |
| + |
| + case WebKit::WebContextMenuData::MediaTypeAudio: |
| + return contexts.Contains(ExtensionMenuItem::AUDIO); |
| + |
| + default: |
| + break; |
| + } |
| + |
| + |
| + // PAGE is the least specific context, so we only examine that if none of the |
| + // other contexts apply. |
| + if (!has_link && !has_selection && !params.is_editable && |
| + params.media_type == WebKit::WebContextMenuData::MediaTypeNone && |
| + contexts.Contains(ExtensionMenuItem::PAGE)) |
| + return true; |
| + |
| + return false; |
| +} |
| + |
| +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); |
| +} |
| + |
| +} |
| + |
| +const GURL& ContextMenuUtils::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. |
| +ExtensionMenuItem::List ContextMenuUtils::GetRelevantExtensionItems( |
| + const ExtensionMenuItem::List& items, |
| + const ContextMenuParams& params, |
| + Profile* profile, |
| + bool can_cross_incognito) { |
| + ExtensionMenuItem::List result; |
| + for (ExtensionMenuItem::List::const_iterator i = items.begin(); |
| + i != items.end(); ++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 (!ExtensionPatternMatch(item->target_url_patterns(), target_url)) |
| + continue; |
| + |
| + if (item->id().profile == profile || can_cross_incognito) |
| + result.push_back(*i); |
| + } |
| + return result; |
| +} |
| + |
| Property changes on: chrome/browser/tab_contents/context_menu_utils.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |