render_view_context_menu.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
1// Copyright (c) 2011 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_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_H_
6#define CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_H_
7#pragma once
8
9#include <map>
10#include <string>
11#include <vector>
12
13#include "base/memory/scoped_vector.h"
14#include "base/string16.h"
15#include "chrome/browser/extensions/extension_menu_manager.h"
16#include "content/common/page_transition_types.h"
17#include "ui/base/models/simple_menu_model.h"
18#include "webkit/glue/context_menu.h"
19#include "webkit/glue/window_open_disposition.h"
20
21class ExtensionMenuItem;
22class Profile;
23class TabContents;
24
25namespace gfx {
26class Point;
27}
28
29namespace WebKit {
30struct WebMediaPlayerAction;
31}
32
33class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate {
34 public:
35  static const size_t kMaxExtensionItemTitleLength;
36  static const size_t kMaxSelectionTextLength;
37
38  RenderViewContextMenu(TabContents* tab_contents,
39                        const ContextMenuParams& params);
40
41  virtual ~RenderViewContextMenu();
42
43  // Initializes the context menu.
44  void Init();
45
46  // SimpleMenuModel::Delegate implementation.
47  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
48  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
49  virtual void ExecuteCommand(int command_id) OVERRIDE;
50  virtual void MenuWillShow() OVERRIDE;
51  virtual void MenuClosed() OVERRIDE;
52
53 protected:
54  void InitMenu();
55
56  // Platform specific functions.
57  virtual void PlatformInit() = 0;
58  virtual bool GetAcceleratorForCommandId(
59      int command_id,
60      ui::Accelerator* accelerator) = 0;
61  virtual void LookUpInDictionary();
62
63  // Attempts to get an ExtensionMenuItem given the id of a context menu item.
64  ExtensionMenuItem* GetExtensionMenuItem(int id) const;
65
66  ContextMenuParams params_;
67  TabContents* source_tab_contents_;
68  Profile* profile_;
69
70  ui::SimpleMenuModel menu_model_;
71
72  // True if we are showing for an external tab contents. The default is false.
73  bool external_;
74
75
76  // Maps the id from a context menu item to the ExtensionMenuItem's internal
77  // id.
78  std::map<int, ExtensionMenuItem::Id> extension_item_map_;
79
80 private:
81  static bool IsDevToolsURL(const GURL& url);
82  static bool IsInternalResourcesURL(const GURL& url);
83  bool AppendCustomItems();
84  void AppendDeveloperItems();
85  void AppendLinkItems();
86  void AppendImageItems();
87  void AppendAudioItems();
88  void AppendVideoItems();
89  void AppendMediaItems();
90  void AppendPluginItems();
91  void AppendPageItems();
92  void AppendFrameItems();
93  void AppendCopyItem();
94  void AppendEditableItems();
95  void AppendSearchProvider();
96  void AppendAllExtensionItems();
97  void AppendSpellcheckOptionsSubMenu();
98  // Add writing direction sub menu (only used on Mac).
99  void AppendBidiSubMenu();
100
101  // This is a helper function to append items for one particular extension.
102  // The |index| parameter is used for assigning id's, and is incremented for
103  // each item actually added.
104  void AppendExtensionItems(const std::string& extension_id, int* index);
105
106  // Used for recursively adding submenus of extension items.
107  void RecursivelyAppendExtensionItems(
108      const std::vector<ExtensionMenuItem*>& items,
109      bool can_cross_incognito,
110      ui::SimpleMenuModel* menu_model,
111      int *index);
112  // This will set the icon on the most recently-added item in the menu_model_.
113  void SetExtensionIcon(const std::string& extension_id);
114
115  // Opens the specified URL string in a new tab.  If |in_current_window| is
116  // false, a new window is created to hold the new tab.
117  void OpenURL(const GURL& url,
118               WindowOpenDisposition disposition,
119               PageTransition::Type transition);
120
121  // Copy to the clipboard an image located at a point in the RenderView
122  void CopyImageAt(int x, int y);
123
124  // Launch the inspector targeting a point in the RenderView
125  void Inspect(int x, int y);
126
127  // Writes the specified text/url to the system clipboard
128  void WriteURLToClipboard(const GURL& url);
129
130  void MediaPlayerActionAt(const gfx::Point& location,
131                           const WebKit::WebMediaPlayerAction& action);
132
133  bool IsDevCommandEnabled(int id) const;
134
135  // Returns a (possibly truncated) version of the current selection text
136  // suitable or putting in the title of a menu item.
137  string16 PrintableSelectionText();
138
139  // The destination URL to use if the user tries to search for or navigate to
140  // a text selection.
141  GURL selection_navigation_url_;
142
143  ui::SimpleMenuModel spellcheck_submenu_model_;
144  ui::SimpleMenuModel bidi_submenu_model_;
145  ScopedVector<ui::SimpleMenuModel> extension_menu_models_;
146
147  DISALLOW_COPY_AND_ASSIGN(RenderViewContextMenu);
148};
149
150#endif  // CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_H_
151