| 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 {
|
| +
|
| +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
|
|
|
|
|