1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_EXTENSIONS_CONTEXT_MENU_MATCHER_H_ 6#define CHROME_BROWSER_EXTENSIONS_CONTEXT_MENU_MATCHER_H_ 7 8#include <map> 9 10#include "base/callback.h" 11#include "base/memory/scoped_ptr.h" 12#include "base/memory/scoped_vector.h" 13#include "chrome/browser/extensions/menu_manager.h" 14#include "ui/base/models/simple_menu_model.h" 15 16class ExtensionContextMenuBrowserTest; 17class Profile; 18 19namespace extensions { 20 21// This class contains code that is shared between the various places where 22// context menu items added by the extension or app should be shown. 23class ContextMenuMatcher { 24 public: 25 static const size_t kMaxExtensionItemTitleLength; 26 27 // The |filter| will be called on possibly matching menu items, and its 28 // result is used to determine which items to actually append to the menu. 29 ContextMenuMatcher(Profile* profile, 30 ui::SimpleMenuModel::Delegate* delegate, 31 ui::SimpleMenuModel* menu_model, 32 const base::Callback<bool(const MenuItem*)>& filter); 33 34 // This is a helper function to append items for one particular extension. 35 // The |index| parameter is used for assigning id's, and is incremented for 36 // each item actually added. 37 void AppendExtensionItems(const std::string& extension_id, 38 const string16& selection_text, 39 int* index); 40 41 void Clear(); 42 43 // This function returns the top level context menu title of an extension 44 // based on a printable selection text. 45 base::string16 GetTopLevelContextMenuTitle(const std::string& extension_id, 46 const string16& selection_text); 47 48 bool IsCommandIdChecked(int command_id) const; 49 bool IsCommandIdEnabled(int command_id) const; 50 void ExecuteCommand(int command_id, 51 content::WebContents* web_contents, 52 const content::ContextMenuParams& params); 53 54 private: 55 friend class ::ExtensionContextMenuBrowserTest; 56 57 bool GetRelevantExtensionTopLevelItems( 58 const std::string& extension_id, 59 const Extension** extension, 60 bool* can_cross_incognito, 61 MenuItem::List& items); 62 63 MenuItem::List GetRelevantExtensionItems( 64 const MenuItem::List& items, 65 bool can_cross_incognito); 66 67 // Used for recursively adding submenus of extension items. 68 void RecursivelyAppendExtensionItems(const MenuItem::List& items, 69 bool can_cross_incognito, 70 const string16& selection_text, 71 ui::SimpleMenuModel* menu_model, 72 int* index); 73 74 // Attempts to get an MenuItem given the id of a context menu item. 75 extensions::MenuItem* GetExtensionMenuItem(int id) const; 76 77 // This will set the icon on the most recently-added item in the menu_model_. 78 void SetExtensionIcon(const std::string& extension_id); 79 80 Profile* profile_; 81 ui::SimpleMenuModel* menu_model_; 82 ui::SimpleMenuModel::Delegate* delegate_; 83 84 base::Callback<bool(const MenuItem*)> filter_; 85 86 // Maps the id from a context menu item to the MenuItem's internal id. 87 std::map<int, extensions::MenuItem::Id> extension_item_map_; 88 89 // Keep track of and clean up menu models for submenus. 90 ScopedVector<ui::SimpleMenuModel> extension_menu_models_; 91 92 DISALLOW_COPY_AND_ASSIGN(ContextMenuMatcher); 93}; 94 95} // namespace extensions 96 97#endif // CHROME_BROWSER_EXTENSIONS_CONTEXT_MENU_MATCHER_H_ 98