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.
5 #include "content/shell/browser/shell_web_contents_view_delegate.h"
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/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"
23 using WebKit::WebContextMenuData
;
28 ShellContextMenuItemCutId
= 10001,
29 ShellContextMenuItemCopyId
,
30 ShellContextMenuItemPasteId
,
31 ShellContextMenuItemDeleteId
,
32 ShellContextMenuItemOpenLinkId
,
33 ShellContextMenuItemBackId
,
34 ShellContextMenuItemForwardId
,
35 ShellContextMenuItemReloadId
,
36 ShellContextMenuItemInspectId
39 void MakeContextMenuItem(HMENU menu
,
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
;
50 mii
.dwTypeData
= text
;
52 InsertMenuItem(menu
, menu_index
, TRUE
, &mii
);
59 WebContentsViewDelegate
* CreateShellWebContentsViewDelegate(
60 WebContents
* web_contents
) {
61 return new ShellWebContentsViewDelegate(web_contents
);
64 ShellWebContentsViewDelegate::ShellWebContentsViewDelegate(
65 WebContents
* web_contents
)
66 : web_contents_(web_contents
) {
69 ShellWebContentsViewDelegate::~ShellWebContentsViewDelegate() {
72 void ShellWebContentsViewDelegate::ShowContextMenu(
73 const ContextMenuParams
& params
) {
74 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree
))
78 bool has_link
= !params_
.unfiltered_link_url
.is_empty();
79 bool has_selection
= !params_
.selection_text
.empty();
81 HMENU menu
= CreateMenu();
82 HMENU sub_menu
= CreatePopupMenu();
83 AppendMenu(menu
, MF_STRING
| MF_POPUP
, (UINT
)sub_menu
, L
"");
86 if (params_
.media_type
== WebContextMenuData::MediaTypeNone
&&
89 !params_
.is_editable
) {
90 MakeContextMenuItem(sub_menu
,
93 ShellContextMenuItemBackId
,
94 web_contents_
->GetController().CanGoBack());
96 MakeContextMenuItem(sub_menu
,
99 ShellContextMenuItemForwardId
,
100 web_contents_
->GetController().CanGoForward());
102 MakeContextMenuItem(sub_menu
,
105 ShellContextMenuItemReloadId
,
108 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
113 MakeContextMenuItem(sub_menu
,
115 L
"Open in New Window",
116 ShellContextMenuItemOpenLinkId
,
118 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
122 if (params_
.is_editable
) {
123 bool cut_enabled
= ((params_
.edit_flags
& WebContextMenuData::CanCut
) != 0);
124 MakeContextMenuItem(sub_menu
,
127 ShellContextMenuItemCutId
,
131 ((params_
.edit_flags
& WebContextMenuData::CanCopy
) != 0);
132 MakeContextMenuItem(sub_menu
,
135 ShellContextMenuItemCopyId
,
139 ((params_
.edit_flags
& WebContextMenuData::CanPaste
) != 0);
140 MakeContextMenuItem(sub_menu
,
143 ShellContextMenuItemPasteId
,
145 bool delete_enabled
=
146 ((params_
.edit_flags
& WebContextMenuData::CanDelete
) != 0);
147 MakeContextMenuItem(sub_menu
,
150 ShellContextMenuItemDeleteId
,
153 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
155 } else if (has_selection
) {
156 MakeContextMenuItem(sub_menu
,
159 ShellContextMenuItemCopyId
,
162 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
166 MakeContextMenuItem(sub_menu
,
169 ShellContextMenuItemInspectId
,
171 #if defined(USE_AURA)
174 gfx::Point
screen_point(params
.x
, params
.y
);
175 POINT point
= screen_point
.ToPOINT();
176 ClientToScreen(web_contents_
->GetView()->GetNativeView(), &point
);
179 TrackPopupMenu(sub_menu
,
180 TPM_LEFTALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
183 web_contents_
->GetView()->GetContentNativeView(),
186 MenuItemSelected(selection
);
191 void ShellWebContentsViewDelegate::MenuItemSelected(int selection
) {
193 case ShellContextMenuItemCutId
:
194 web_contents_
->GetRenderViewHost()->Cut();
196 case ShellContextMenuItemCopyId
:
197 web_contents_
->GetRenderViewHost()->Copy();
199 case ShellContextMenuItemPasteId
:
200 web_contents_
->GetRenderViewHost()->Paste();
202 case ShellContextMenuItemDeleteId
:
203 web_contents_
->GetRenderViewHost()->Delete();
205 case ShellContextMenuItemOpenLinkId
: {
206 ShellBrowserContext
* browser_context
=
207 ShellContentBrowserClient::Get()->browser_context();
208 Shell::CreateNewWindow(browser_context
,
215 case ShellContextMenuItemBackId
:
216 web_contents_
->GetController().GoToOffset(-1);
217 web_contents_
->GetView()->Focus();
219 case ShellContextMenuItemForwardId
:
220 web_contents_
->GetController().GoToOffset(1);
221 web_contents_
->GetView()->Focus();
223 case ShellContextMenuItemReloadId
:
224 web_contents_
->GetController().Reload(false);
225 web_contents_
->GetView()->Focus();
227 case ShellContextMenuItemInspectId
: {
228 ShellDevToolsFrontend::Show(web_contents_
);
234 WebDragDestDelegate
* ShellWebContentsViewDelegate::GetDragDestDelegate() {
238 void ShellWebContentsViewDelegate::StoreFocus() {
241 void ShellWebContentsViewDelegate::RestoreFocus() {
244 bool ShellWebContentsViewDelegate::Focus() {
248 void ShellWebContentsViewDelegate::TakeFocus(bool reverse
) {
251 void ShellWebContentsViewDelegate::SizeChanged(const gfx::Size
& size
) {
254 } // namespace content