1 // Copyright 2014 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 COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_BASE_H_ 6 #define COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_BASE_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/scoped_ptr.h" 12 #include "base/observer_list.h" 13 #include "base/strings/string16.h" 14 #include "components/renderer_context_menu/context_menu_content_type.h" 15 #include "components/renderer_context_menu/render_view_context_menu_observer.h" 16 #include "components/renderer_context_menu/render_view_context_menu_proxy.h" 17 #include "content/public/common/context_menu_params.h" 18 #include "ui/base/models/simple_menu_model.h" 19 #include "ui/base/page_transition_types.h" 20 #include "ui/base/window_open_disposition.h" 21 22 namespace content { 23 class RenderFrameHost; 24 class WebContents; 25 } 26 27 namespace gfx { 28 class Point; 29 } 30 31 namespace blink { 32 struct WebMediaPlayerAction; 33 struct WebPluginAction; 34 } 35 36 class RenderViewContextMenuBase : public ui::SimpleMenuModel::Delegate, 37 public RenderViewContextMenuProxy { 38 public: 39 // A delegate interface to communicate with the toolkit used by 40 // the embedder. 41 class ToolkitDelegate { 42 public: 43 virtual ~ToolkitDelegate() {} 44 // Initialize the toolkit's menu. 45 virtual void Init(ui::SimpleMenuModel* menu_model) = 0; 46 47 virtual void Cancel() = 0; 48 49 // Updates the actual menu items controlled by the toolkit. 50 virtual void UpdateMenuItem(int command_id, 51 bool enabled, 52 bool hidden, 53 const base::string16& title) = 0; 54 }; 55 56 static const size_t kMaxSelectionTextLength; 57 58 static void SetContentCustomCommandIdRange(int first, int last); 59 60 // Convert a command ID so that it fits within the range for 61 // content context menu. 62 static int ConvertToContentCustomCommandId(int id); 63 64 // True if the given id is the one generated for content context menu. 65 static bool IsContentCustomCommandId(int id); 66 67 RenderViewContextMenuBase(content::RenderFrameHost* render_frame_host, 68 const content::ContextMenuParams& params); 69 70 virtual ~RenderViewContextMenuBase(); 71 72 // Initializes the context menu. 73 void Init(); 74 75 // Programmatically closes the context menu. 76 void Cancel(); 77 78 const ui::SimpleMenuModel& menu_model() const { return menu_model_; } 79 const content::ContextMenuParams& params() const { return params_; } 80 81 // Returns true if the specified command id is known and valid for 82 // this menu. If the command is known |enabled| is set to indicate 83 // if the command is enabled. 84 bool IsCommandIdKnown(int command_id, bool* enabled) const; 85 86 // SimpleMenuModel::Delegate implementation. 87 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; 88 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; 89 virtual void MenuWillShow(ui::SimpleMenuModel* source) OVERRIDE; 90 virtual void MenuClosed(ui::SimpleMenuModel* source) OVERRIDE; 91 92 // RenderViewContextMenuProxy implementation. 93 virtual void AddMenuItem(int command_id, 94 const base::string16& title) OVERRIDE; 95 virtual void AddCheckItem(int command_id, 96 const base::string16& title) OVERRIDE; 97 virtual void AddSeparator() OVERRIDE; 98 virtual void AddSubMenu(int command_id, 99 const base::string16& label, 100 ui::MenuModel* model) OVERRIDE; 101 virtual void UpdateMenuItem(int command_id, 102 bool enabled, 103 bool hidden, 104 const base::string16& title) OVERRIDE; 105 virtual content::RenderViewHost* GetRenderViewHost() const OVERRIDE; 106 virtual content::WebContents* GetWebContents() const OVERRIDE; 107 virtual content::BrowserContext* GetBrowserContext() const OVERRIDE; 108 109 protected: 110 friend class RenderViewContextMenuTest; 111 friend class RenderViewContextMenuPrefsTest; 112 113 void set_content_type(ContextMenuContentType* content_type) { 114 content_type_.reset(content_type); 115 } 116 117 void set_toolkit_delegate(scoped_ptr<ToolkitDelegate> delegate) { 118 toolkit_delegate_ = delegate.Pass(); 119 } 120 121 ToolkitDelegate* toolkit_delegate() { 122 return toolkit_delegate_.get(); 123 } 124 125 // TODO(oshima): Make these methods delegate. 126 127 // Menu Construction. 128 virtual void InitMenu(); 129 130 // Increments histogram value for used items specified by |id|. 131 virtual void RecordUsedItem(int id) = 0; 132 133 // Increments histogram value for visible context menu item specified by |id|. 134 virtual void RecordShownItem(int id) = 0; 135 136 #if defined(ENABLE_PLUGINS) 137 virtual void HandleAuthorizeAllPlugins() = 0; 138 #endif 139 140 // Returns the accelerator for given |command_id|. 141 virtual bool GetAcceleratorForCommandId( 142 int command_id, 143 ui::Accelerator* accelerator) = 0; 144 145 // Subclasses should send notification. 146 virtual void NotifyMenuShown() = 0; 147 virtual void NotifyURLOpened(const GURL& url, 148 content::WebContents* new_contents) = 0; 149 150 // TODO(oshima): Remove this. 151 virtual void AppendPlatformEditableItems() {} 152 153 content::RenderFrameHost* GetRenderFrameHost(); 154 155 bool IsCustomItemChecked(int id) const; 156 bool IsCustomItemEnabled(int id) const; 157 158 // Opens the specified URL string in a new tab. 159 void OpenURL(const GURL& url, const GURL& referrer, 160 WindowOpenDisposition disposition, 161 ui::PageTransition transition); 162 163 content::ContextMenuParams params_; 164 content::WebContents* source_web_contents_; 165 content::BrowserContext* browser_context_; 166 167 ui::SimpleMenuModel menu_model_; 168 169 // Renderer's frame id. 170 int render_frame_id_; 171 172 // Our observers. 173 mutable ObserverList<RenderViewContextMenuObserver> observers_; 174 175 // Whether a command has been executed. Used to track whether menu observers 176 // should be notified of menu closing without execution. 177 bool command_executed_; 178 179 scoped_ptr<ContextMenuContentType> content_type_; 180 181 private: 182 bool AppendCustomItems(); 183 184 // The RenderFrameHost's IDs. 185 int render_process_id_; 186 187 scoped_ptr<ToolkitDelegate> toolkit_delegate_; 188 189 DISALLOW_COPY_AND_ASSIGN(RenderViewContextMenuBase); 190 }; 191 192 #endif // COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_BASE_H_ 193