linux: Cache families from FontRenderParams queries.
[chromium-blink-merge.git] / athena / content / render_view_context_menu_impl.cc
blob688b4f5e1e7b68e2695d5e90169007f2284310fa
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.
5 #include "athena/content/render_view_context_menu_impl.h"
7 #include "athena/strings/grit/athena_strings.h"
8 #include "components/renderer_context_menu/context_menu_content_type.h"
9 #include "components/renderer_context_menu/views/toolkit_delegate_views.h"
10 #include "content/public/browser/browser_context.h"
11 #include "content/public/browser/web_contents.h"
12 #include "third_party/WebKit/public/web/WebContextMenuData.h"
13 #include "ui/base/l10n/l10n_util.h"
15 namespace athena {
16 using blink::WebContextMenuData;
18 namespace {
20 enum {
21 // Nativation
22 CMD_BACK = 0,
23 CMD_FORWARD,
24 CMD_RELOAD,
25 CMD_VIEW_SOURCE,
27 // Link
28 CMD_OPEN_LINK_NEW_ACTIVITY,
30 // Edit
31 CMD_UNDO,
32 CMD_REDO,
33 CMD_CUT,
34 CMD_COPY,
35 CMD_PASTE,
36 CMD_PASTE_AND_MATCH_STYLE,
37 CMD_DELETE,
38 CMD_SELECT_ALL,
39 CMD_LAST,
42 // Max number of custom command ids allowd.
43 const int kNumCustomCommandIds = 1000;
45 // TODO(oshima): Move IDS for context menus to components/renderer_context_menu
46 // and replace hardcoded strings below.
47 void AppendPageItems(ui::SimpleMenuModel* menu_model) {
48 menu_model->AddItem(CMD_BACK,
49 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_BACK));
50 menu_model->AddItem(CMD_FORWARD,
51 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_FORWARD));
52 menu_model->AddItem(CMD_RELOAD,
53 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_RELOAD));
54 menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
55 menu_model->AddItem(
56 CMD_VIEW_SOURCE,
57 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_VIEWPAGESOURCE));
60 void AppendLinkItems(const content::ContextMenuParams& params,
61 ui::SimpleMenuModel* menu_model) {
62 if (!params.link_url.is_empty())
63 menu_model->AddItem(
64 CMD_OPEN_LINK_NEW_ACTIVITY,
65 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_OPENLINKNEWACTIVITY));
68 void AppendEditableItems(ui::SimpleMenuModel* menu_model) {
69 menu_model->AddItem(CMD_UNDO,
70 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_UNDO));
71 menu_model->AddItem(CMD_REDO,
72 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_REDO));
73 menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
74 menu_model->AddItem(CMD_CUT,
75 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_CUT));
76 menu_model->AddItem(CMD_COPY,
77 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_COPY));
78 menu_model->AddItem(CMD_PASTE,
79 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_PASTE));
80 menu_model->AddItem(
81 CMD_PASTE_AND_MATCH_STYLE,
82 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_PASTE_AND_MATCH_STYLE));
83 menu_model->AddItem(CMD_DELETE,
84 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_DELETE));
85 menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
86 menu_model->AddItem(CMD_SELECT_ALL,
87 l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_SELECTALL));
90 } // namespace
92 RenderViewContextMenuImpl::RenderViewContextMenuImpl(
93 content::RenderFrameHost* render_frame_host,
94 const content::ContextMenuParams& params)
95 : RenderViewContextMenuBase(render_frame_host, params) {
96 SetContentCustomCommandIdRange(CMD_LAST, CMD_LAST + kNumCustomCommandIds);
97 // TODO(oshima): Support other types
98 set_content_type(
99 new ContextMenuContentType(source_web_contents_, params, true));
100 set_toolkit_delegate(scoped_ptr<ToolkitDelegate>(new ToolkitDelegateViews));
103 RenderViewContextMenuImpl::~RenderViewContextMenuImpl() {
106 void RenderViewContextMenuImpl::RunMenuAt(views::Widget* parent,
107 const gfx::Point& point,
108 ui::MenuSourceType type) {
109 static_cast<ToolkitDelegateViews*>(toolkit_delegate())
110 ->RunMenuAt(parent, point, type);
113 void RenderViewContextMenuImpl::InitMenu() {
114 RenderViewContextMenuBase::InitMenu();
115 bool needs_separator = false;
116 if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) {
117 AppendPageItems(&menu_model_);
118 needs_separator = true;
121 if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK)) {
122 if (needs_separator)
123 AddSeparator();
124 AppendLinkItems(params_, &menu_model_);
125 needs_separator = true;
128 if (content_type_->SupportsGroup(
129 ContextMenuContentType::ITEM_GROUP_EDITABLE)) {
130 if (needs_separator)
131 AddSeparator();
132 AppendEditableItems(&menu_model_);
136 void RenderViewContextMenuImpl::RecordShownItem(int id) {
137 // TODO(oshima): Imelement UMA stats. crbug.com/401673
138 NOTIMPLEMENTED();
141 void RenderViewContextMenuImpl::RecordUsedItem(int id) {
142 // TODO(oshima): Imelement UMA stats. crbug.com/401673
143 NOTIMPLEMENTED();
146 #if defined(ENABLE_PLUGINS)
147 void RenderViewContextMenuImpl::HandleAuthorizeAllPlugins() {
149 #endif
151 void RenderViewContextMenuImpl::NotifyMenuShown() {
154 void RenderViewContextMenuImpl::NotifyURLOpened(
155 const GURL& url,
156 content::WebContents* new_contents) {
159 bool RenderViewContextMenuImpl::GetAcceleratorForCommandId(
160 int command_id,
161 ui::Accelerator* accelerator) {
162 NOTIMPLEMENTED();
163 return false;
166 bool RenderViewContextMenuImpl::IsCommandIdChecked(int command_id) const {
167 return false;
170 bool RenderViewContextMenuImpl::IsCommandIdEnabled(int command_id) const {
172 bool enabled = false;
173 if (RenderViewContextMenuBase::IsCommandIdKnown(command_id, &enabled))
174 return enabled;
176 switch (command_id) {
177 // Navigation
178 case CMD_BACK:
179 return source_web_contents_->GetController().CanGoBack();
180 case CMD_FORWARD:
181 return source_web_contents_->GetController().CanGoForward();
182 case CMD_RELOAD:
183 return true;
184 case CMD_VIEW_SOURCE:
185 return source_web_contents_->GetController().CanViewSource();
187 // Link
188 case CMD_OPEN_LINK_NEW_ACTIVITY:
189 return params_.link_url.is_valid();
191 // Editable
192 case CMD_UNDO:
193 return !!(params_.edit_flags & WebContextMenuData::CanUndo);
195 case CMD_REDO:
196 return !!(params_.edit_flags & WebContextMenuData::CanRedo);
198 case CMD_CUT:
199 return !!(params_.edit_flags & WebContextMenuData::CanCut);
201 case CMD_COPY:
202 return !!(params_.edit_flags & WebContextMenuData::CanCopy);
204 case CMD_PASTE:
205 case CMD_PASTE_AND_MATCH_STYLE:
206 return !!(params_.edit_flags & WebContextMenuData::CanPaste);
208 case CMD_DELETE:
209 return !!(params_.edit_flags & WebContextMenuData::CanDelete);
211 case CMD_SELECT_ALL:
212 return !!(params_.edit_flags & WebContextMenuData::CanSelectAll);
214 return false;
217 void RenderViewContextMenuImpl::ExecuteCommand(int command_id,
218 int event_flags) {
219 RenderViewContextMenuBase::ExecuteCommand(command_id, event_flags);
220 if (command_executed_)
221 return;
222 command_executed_ = true;
223 switch (command_id) {
224 // Navigation
225 case CMD_BACK:
226 source_web_contents_->GetController().GoBack();
227 break;
228 case CMD_FORWARD:
229 source_web_contents_->GetController().GoForward();
230 break;
231 case CMD_RELOAD:
232 source_web_contents_->GetController().Reload(true);
233 break;
234 case CMD_VIEW_SOURCE:
235 source_web_contents_->ViewSource();
236 break;
238 // Link
239 case CMD_OPEN_LINK_NEW_ACTIVITY:
240 OpenURL(
241 params_.link_url,
242 params_.frame_url.is_empty() ? params_.page_url : params_.frame_url,
243 NEW_FOREGROUND_TAB,
244 ui::PAGE_TRANSITION_LINK);
245 break;
247 // Editable
248 case CMD_UNDO:
249 source_web_contents_->Undo();
250 break;
252 case CMD_REDO:
253 source_web_contents_->Redo();
254 break;
256 case CMD_CUT:
257 source_web_contents_->Cut();
258 break;
260 case CMD_COPY:
261 source_web_contents_->Copy();
262 break;
264 case CMD_PASTE:
265 source_web_contents_->Paste();
266 break;
268 case CMD_PASTE_AND_MATCH_STYLE:
269 source_web_contents_->PasteAndMatchStyle();
270 break;
272 case CMD_DELETE:
273 source_web_contents_->Delete();
274 break;
276 case CMD_SELECT_ALL:
277 source_web_contents_->SelectAll();
278 break;
282 } // namespace athena