OLD | NEW |
| (Empty) |
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 #include "content/shell/shell_web_contents_view_delegate.h" | |
6 | |
7 #include "base/command_line.h" | |
8 #include "content/public/browser/render_process_host.h" | |
9 #include "content/public/browser/render_view_host.h" | |
10 #include "content/public/browser/render_widget_host_view.h" | |
11 #include "content/public/browser/web_contents.h" | |
12 #include "content/public/browser/web_contents_view.h" | |
13 #include "content/public/common/context_menu_params.h" | |
14 #include "content/shell/common/shell_switches.h" | |
15 #include "content/shell/shell.h" | |
16 #include "content/shell/shell_browser_context.h" | |
17 #include "content/shell/shell_browser_main_parts.h" | |
18 #include "content/shell/shell_content_browser_client.h" | |
19 #include "content/shell/shell_devtools_frontend.h" | |
20 #include "content/shell/shell_web_contents_view_delegate_creator.h" | |
21 #include "third_party/WebKit/public/web/WebContextMenuData.h" | |
22 | |
23 using WebKit::WebContextMenuData; | |
24 | |
25 namespace { | |
26 | |
27 enum { | |
28 ShellContextMenuItemCutId = 10001, | |
29 ShellContextMenuItemCopyId, | |
30 ShellContextMenuItemPasteId, | |
31 ShellContextMenuItemDeleteId, | |
32 ShellContextMenuItemOpenLinkId, | |
33 ShellContextMenuItemBackId, | |
34 ShellContextMenuItemForwardId, | |
35 ShellContextMenuItemReloadId, | |
36 ShellContextMenuItemInspectId | |
37 }; | |
38 | |
39 void MakeContextMenuItem(HMENU menu, | |
40 int menu_index, | |
41 LPTSTR text, | |
42 UINT id, | |
43 bool enabled) { | |
44 MENUITEMINFO mii = {0}; | |
45 mii.cbSize = sizeof(mii); | |
46 mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_DATA | MIIM_STRING | MIIM_STATE; | |
47 mii.fState = enabled ? MFS_ENABLED : (MF_DISABLED | MFS_GRAYED); | |
48 mii.fType = MFT_STRING; | |
49 mii.wID = id; | |
50 mii.dwTypeData = text; | |
51 | |
52 InsertMenuItem(menu, menu_index, TRUE, &mii); | |
53 } | |
54 | |
55 } // namespace | |
56 | |
57 namespace content { | |
58 | |
59 WebContentsViewDelegate* CreateShellWebContentsViewDelegate( | |
60 WebContents* web_contents) { | |
61 return new ShellWebContentsViewDelegate(web_contents); | |
62 } | |
63 | |
64 ShellWebContentsViewDelegate::ShellWebContentsViewDelegate( | |
65 WebContents* web_contents) | |
66 : web_contents_(web_contents) { | |
67 } | |
68 | |
69 ShellWebContentsViewDelegate::~ShellWebContentsViewDelegate() { | |
70 } | |
71 | |
72 void ShellWebContentsViewDelegate::ShowContextMenu( | |
73 const ContextMenuParams& params) { | |
74 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) | |
75 return; | |
76 | |
77 params_ = params; | |
78 bool has_link = !params_.unfiltered_link_url.is_empty(); | |
79 bool has_selection = !params_.selection_text.empty(); | |
80 | |
81 HMENU menu = CreateMenu(); | |
82 HMENU sub_menu = CreatePopupMenu(); | |
83 AppendMenu(menu, MF_STRING | MF_POPUP, (UINT)sub_menu, L""); | |
84 | |
85 int index = 0; | |
86 if (params_.media_type == WebContextMenuData::MediaTypeNone && | |
87 !has_link && | |
88 !has_selection && | |
89 !params_.is_editable) { | |
90 MakeContextMenuItem(sub_menu, | |
91 index++, | |
92 L"Back", | |
93 ShellContextMenuItemBackId, | |
94 web_contents_->GetController().CanGoBack()); | |
95 | |
96 MakeContextMenuItem(sub_menu, | |
97 index++, | |
98 L"Forward", | |
99 ShellContextMenuItemForwardId, | |
100 web_contents_->GetController().CanGoForward()); | |
101 | |
102 MakeContextMenuItem(sub_menu, | |
103 index++, | |
104 L"Reload", | |
105 ShellContextMenuItemReloadId, | |
106 true); | |
107 | |
108 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
109 index++; | |
110 } | |
111 | |
112 if (has_link) { | |
113 MakeContextMenuItem(sub_menu, | |
114 index++, | |
115 L"Open in New Window", | |
116 ShellContextMenuItemOpenLinkId, | |
117 true); | |
118 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
119 index++; | |
120 } | |
121 | |
122 if (params_.is_editable) { | |
123 bool cut_enabled = ((params_.edit_flags & WebContextMenuData::CanCut) != 0); | |
124 MakeContextMenuItem(sub_menu, | |
125 index++, | |
126 L"Cut", | |
127 ShellContextMenuItemCutId, | |
128 cut_enabled); | |
129 | |
130 bool copy_enabled = | |
131 ((params_.edit_flags & WebContextMenuData::CanCopy) != 0); | |
132 MakeContextMenuItem(sub_menu, | |
133 index++, | |
134 L"Copy", | |
135 ShellContextMenuItemCopyId, | |
136 copy_enabled); | |
137 | |
138 bool paste_enabled = | |
139 ((params_.edit_flags & WebContextMenuData::CanPaste) != 0); | |
140 MakeContextMenuItem(sub_menu, | |
141 index++, | |
142 L"Paste", | |
143 ShellContextMenuItemPasteId, | |
144 paste_enabled); | |
145 bool delete_enabled = | |
146 ((params_.edit_flags & WebContextMenuData::CanDelete) != 0); | |
147 MakeContextMenuItem(sub_menu, | |
148 index++, | |
149 L"Delete", | |
150 ShellContextMenuItemDeleteId, | |
151 delete_enabled); | |
152 | |
153 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
154 index++; | |
155 } else if (has_selection) { | |
156 MakeContextMenuItem(sub_menu, | |
157 index++, | |
158 L"Copy", | |
159 ShellContextMenuItemCopyId, | |
160 true); | |
161 | |
162 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
163 index++; | |
164 } | |
165 | |
166 MakeContextMenuItem(sub_menu, | |
167 index++, | |
168 L"Inspect...", | |
169 ShellContextMenuItemInspectId, | |
170 true); | |
171 #if defined(USE_AURA) | |
172 NOTIMPLEMENTED(); | |
173 #else | |
174 gfx::Point screen_point(params.x, params.y); | |
175 POINT point = screen_point.ToPOINT(); | |
176 ClientToScreen(web_contents_->GetView()->GetNativeView(), &point); | |
177 | |
178 int selection = | |
179 TrackPopupMenu(sub_menu, | |
180 TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, | |
181 point.x, point.y, | |
182 0, | |
183 web_contents_->GetView()->GetContentNativeView(), | |
184 NULL); | |
185 | |
186 MenuItemSelected(selection); | |
187 #endif | |
188 DestroyMenu(menu); | |
189 } | |
190 | |
191 void ShellWebContentsViewDelegate::MenuItemSelected(int selection) { | |
192 switch (selection) { | |
193 case ShellContextMenuItemCutId: | |
194 web_contents_->GetRenderViewHost()->Cut(); | |
195 break; | |
196 case ShellContextMenuItemCopyId: | |
197 web_contents_->GetRenderViewHost()->Copy(); | |
198 break; | |
199 case ShellContextMenuItemPasteId: | |
200 web_contents_->GetRenderViewHost()->Paste(); | |
201 break; | |
202 case ShellContextMenuItemDeleteId: | |
203 web_contents_->GetRenderViewHost()->Delete(); | |
204 break; | |
205 case ShellContextMenuItemOpenLinkId: { | |
206 ShellBrowserContext* browser_context = | |
207 ShellContentBrowserClient::Get()->browser_context(); | |
208 Shell::CreateNewWindow(browser_context, | |
209 params_.link_url, | |
210 NULL, | |
211 MSG_ROUTING_NONE, | |
212 gfx::Size()); | |
213 break; | |
214 } | |
215 case ShellContextMenuItemBackId: | |
216 web_contents_->GetController().GoToOffset(-1); | |
217 web_contents_->GetView()->Focus(); | |
218 break; | |
219 case ShellContextMenuItemForwardId: | |
220 web_contents_->GetController().GoToOffset(1); | |
221 web_contents_->GetView()->Focus(); | |
222 break; | |
223 case ShellContextMenuItemReloadId: | |
224 web_contents_->GetController().Reload(false); | |
225 web_contents_->GetView()->Focus(); | |
226 break; | |
227 case ShellContextMenuItemInspectId: { | |
228 ShellDevToolsFrontend::Show(web_contents_); | |
229 break; | |
230 } | |
231 } | |
232 } | |
233 | |
234 WebDragDestDelegate* ShellWebContentsViewDelegate::GetDragDestDelegate() { | |
235 return NULL; | |
236 } | |
237 | |
238 void ShellWebContentsViewDelegate::StoreFocus() { | |
239 } | |
240 | |
241 void ShellWebContentsViewDelegate::RestoreFocus() { | |
242 } | |
243 | |
244 bool ShellWebContentsViewDelegate::Focus() { | |
245 return false; | |
246 } | |
247 | |
248 void ShellWebContentsViewDelegate::TakeFocus(bool reverse) { | |
249 } | |
250 | |
251 void ShellWebContentsViewDelegate::SizeChanged(const gfx::Size& size) { | |
252 } | |
253 | |
254 } // namespace content | |
OLD | NEW |