| 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,115 @@
|
| +// 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 <algorithm>
|
| +
|
| +#include "chrome/browser/extensions/extension_service.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();
|
| + 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))) {
|
| + 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 (except for FRAME, which is included in PAGE for
|
| + // backwards compatibility).
|
| + if (!has_link && !has_selection && !params.is_editable &&
|
| + params.media_type == 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;
|
| +}
|
| +
|
| +void ContextMenuUtils::GetSortedContextMenuExtensionIds(
|
| + ExtensionService* service,
|
| + ExtensionMenuManager* menu_manager,
|
| + std::vector<std::pair<std::string, std::string> >* sorted_ids) {
|
| + std::set<std::string> ids = menu_manager->ExtensionIds();
|
| + for (std::set<std::string>::iterator i = ids.begin(); i != ids.end(); ++i) {
|
| + const Extension* extension = service->GetExtensionById(*i, false);
|
| + if (extension)
|
| + sorted_ids->push_back(
|
| + std::pair<std::string, std::string>(extension->name(), *i));
|
| + }
|
| + // TODO(asargent) - See if this works properly for i18n names (bug 32363).
|
| + std::sort(sorted_ids->begin(), sorted_ids->end());
|
| +}
|
| +
|
|
|
| Property changes on: chrome/browser/tab_contents/context_menu_utils.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|