OLD | NEW |
| (Empty) |
1 // Copyright 2013 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/browser/shell_web_contents_view_delegate.h" | |
6 | |
7 #include "base/command_line.h" | |
8 #include "content/public/browser/render_frame_host.h" | |
9 #include "content/public/browser/render_process_host.h" | |
10 #include "content/public/browser/render_view_host.h" | |
11 #include "content/public/browser/render_widget_host_view.h" | |
12 #include "content/public/browser/web_contents.h" | |
13 #include "content/public/common/context_menu_params.h" | |
14 #include "content/shell/browser/shell.h" | |
15 #include "content/shell/browser/shell_browser_context.h" | |
16 #include "content/shell/browser/shell_browser_main_parts.h" | |
17 #include "content/shell/browser/shell_content_browser_client.h" | |
18 #include "content/shell/browser/shell_devtools_frontend.h" | |
19 #include "content/shell/browser/shell_web_contents_view_delegate_creator.h" | |
20 #include "content/shell/common/shell_switches.h" | |
21 #include "third_party/WebKit/public/web/WebContextMenuData.h" | |
22 | |
23 using blink::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 LPCTSTR 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 = const_cast<LPTSTR>(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 RenderFrameHost* render_frame_host, | |
74 const ContextMenuParams& params) { | |
75 if (switches::IsRunLayoutTestSwitchPresent()) | |
76 return; | |
77 | |
78 params_ = params; | |
79 bool has_link = !params_.unfiltered_link_url.is_empty(); | |
80 bool has_selection = !params_.selection_text.empty(); | |
81 | |
82 HMENU menu = CreateMenu(); | |
83 HMENU sub_menu = CreatePopupMenu(); | |
84 AppendMenu(menu, MF_STRING | MF_POPUP, reinterpret_cast<UINT_PTR>(sub_menu), | |
85 L""); | |
86 | |
87 int index = 0; | |
88 if (params_.media_type == WebContextMenuData::MediaTypeNone && | |
89 !has_link && | |
90 !has_selection && | |
91 !params_.is_editable) { | |
92 MakeContextMenuItem(sub_menu, | |
93 index++, | |
94 L"Back", | |
95 ShellContextMenuItemBackId, | |
96 web_contents_->GetController().CanGoBack()); | |
97 | |
98 MakeContextMenuItem(sub_menu, | |
99 index++, | |
100 L"Forward", | |
101 ShellContextMenuItemForwardId, | |
102 web_contents_->GetController().CanGoForward()); | |
103 | |
104 MakeContextMenuItem(sub_menu, | |
105 index++, | |
106 L"Reload", | |
107 ShellContextMenuItemReloadId, | |
108 true); | |
109 | |
110 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
111 index++; | |
112 } | |
113 | |
114 if (has_link) { | |
115 MakeContextMenuItem(sub_menu, | |
116 index++, | |
117 L"Open in New Window", | |
118 ShellContextMenuItemOpenLinkId, | |
119 true); | |
120 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
121 index++; | |
122 } | |
123 | |
124 if (params_.is_editable) { | |
125 bool cut_enabled = ((params_.edit_flags & WebContextMenuData::CanCut) != 0); | |
126 MakeContextMenuItem(sub_menu, | |
127 index++, | |
128 L"Cut", | |
129 ShellContextMenuItemCutId, | |
130 cut_enabled); | |
131 | |
132 bool copy_enabled = | |
133 ((params_.edit_flags & WebContextMenuData::CanCopy) != 0); | |
134 MakeContextMenuItem(sub_menu, | |
135 index++, | |
136 L"Copy", | |
137 ShellContextMenuItemCopyId, | |
138 copy_enabled); | |
139 | |
140 bool paste_enabled = | |
141 ((params_.edit_flags & WebContextMenuData::CanPaste) != 0); | |
142 MakeContextMenuItem(sub_menu, | |
143 index++, | |
144 L"Paste", | |
145 ShellContextMenuItemPasteId, | |
146 paste_enabled); | |
147 bool delete_enabled = | |
148 ((params_.edit_flags & WebContextMenuData::CanDelete) != 0); | |
149 MakeContextMenuItem(sub_menu, | |
150 index++, | |
151 L"Delete", | |
152 ShellContextMenuItemDeleteId, | |
153 delete_enabled); | |
154 | |
155 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
156 index++; | |
157 } else if (has_selection) { | |
158 MakeContextMenuItem(sub_menu, | |
159 index++, | |
160 L"Copy", | |
161 ShellContextMenuItemCopyId, | |
162 true); | |
163 | |
164 AppendMenu(sub_menu, MF_SEPARATOR, 0, NULL); | |
165 index++; | |
166 } | |
167 | |
168 MakeContextMenuItem(sub_menu, | |
169 index++, | |
170 L"Inspect...", | |
171 ShellContextMenuItemInspectId, | |
172 true); | |
173 NOTIMPLEMENTED(); | |
174 DestroyMenu(menu); | |
175 } | |
176 | |
177 void ShellWebContentsViewDelegate::MenuItemSelected(int selection) { | |
178 switch (selection) { | |
179 case ShellContextMenuItemCutId: | |
180 web_contents_->Cut(); | |
181 break; | |
182 case ShellContextMenuItemCopyId: | |
183 web_contents_->Copy(); | |
184 break; | |
185 case ShellContextMenuItemPasteId: | |
186 web_contents_->Paste(); | |
187 break; | |
188 case ShellContextMenuItemDeleteId: | |
189 web_contents_->Delete(); | |
190 break; | |
191 case ShellContextMenuItemOpenLinkId: { | |
192 ShellBrowserContext* browser_context = | |
193 ShellContentBrowserClient::Get()->browser_context(); | |
194 Shell::CreateNewWindow(browser_context, | |
195 params_.link_url, | |
196 NULL, | |
197 gfx::Size()); | |
198 break; | |
199 } | |
200 case ShellContextMenuItemBackId: | |
201 web_contents_->GetController().GoToOffset(-1); | |
202 web_contents_->Focus(); | |
203 break; | |
204 case ShellContextMenuItemForwardId: | |
205 web_contents_->GetController().GoToOffset(1); | |
206 web_contents_->Focus(); | |
207 break; | |
208 case ShellContextMenuItemReloadId: | |
209 web_contents_->GetController().Reload(false); | |
210 web_contents_->Focus(); | |
211 break; | |
212 case ShellContextMenuItemInspectId: { | |
213 ShellDevToolsFrontend::Show(web_contents_); | |
214 break; | |
215 } | |
216 } | |
217 } | |
218 | |
219 } // namespace content | |
OLD | NEW |