// Copyright (c) 2012 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.
#ifndef CHROME_BROWSER_EXTENSIONS_CONTEXT_MENU_MATCHER_H_
#define CHROME_BROWSER_EXTENSIONS_CONTEXT_MENU_MATCHER_H_
#include <map>
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "chrome/browser/extensions/menu_manager.h"
#include "ui/base/models/simple_menu_model.h"
class ExtensionContextMenuBrowserTest;
class Profile;
namespace extensions {
// This class contains code that is shared between the various places where
// context menu items added by the extension or app should be shown.
class ContextMenuMatcher {
public:
static const size_t kMaxExtensionItemTitleLength;
// The |filter| will be called on possibly matching menu items, and its
// result is used to determine which items to actually append to the menu.
ContextMenuMatcher(Profile* profile,
ui::SimpleMenuModel::Delegate* delegate,
ui::SimpleMenuModel* menu_model,
const base::Callback<bool(const MenuItem*)>& filter);
// This is a helper function to append items for one particular extension.
// The |index| parameter is used for assigning id's, and is incremented for
// each item actually added.
void AppendExtensionItems(const MenuItem::ExtensionKey& extension_key,
const base::string16& selection_text,
int* index);
void Clear();
// This function returns the top level context menu title of an extension
// based on a printable selection text.
base::string16 GetTopLevelContextMenuTitle(
const MenuItem::ExtensionKey& extension_key,
const base::string16& selection_text);
bool IsCommandIdChecked(int command_id) const;
bool IsCommandIdEnabled(int command_id) const;
void ExecuteCommand(int command_id,
content::WebContents* web_contents,
const content::ContextMenuParams& params);
private:
friend class ::ExtensionContextMenuBrowserTest;
bool GetRelevantExtensionTopLevelItems(
const MenuItem::ExtensionKey& extension_key,
const Extension** extension,
bool* can_cross_incognito,
MenuItem::List& items);
MenuItem::List GetRelevantExtensionItems(
const MenuItem::List& items,
bool can_cross_incognito);
// Used for recursively adding submenus of extension items.
void RecursivelyAppendExtensionItems(const MenuItem::List& items,
bool can_cross_incognito,
const base::string16& selection_text,
ui::SimpleMenuModel* menu_model,
int* index);
// Attempts to get an MenuItem given the id of a context menu item.
extensions::MenuItem* GetExtensionMenuItem(int id) const;
// This will set the icon on the most recently-added item in the menu_model_.
void SetExtensionIcon(const std::string& extension_id);
Profile* profile_;
ui::SimpleMenuModel* menu_model_;
ui::SimpleMenuModel::Delegate* delegate_;
base::Callback<bool(const MenuItem*)> filter_;
// Maps the id from a context menu item to the MenuItem's internal id.
std::map<int, extensions::MenuItem::Id> extension_item_map_;
// Keep track of and clean up menu models for submenus.
ScopedVector<ui::SimpleMenuModel> extension_menu_models_;
DISALLOW_COPY_AND_ASSIGN(ContextMenuMatcher);
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_CONTEXT_MENU_MATCHER_H_