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_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/browser/web_contents_view.h"
14 #include "content/public/common/context_menu_params.h"
15 #include "content/shell/browser/shell.h"
16 #include "content/shell/browser/shell_browser_context.h"
17 #include "content/shell/browser/shell_browser_main_parts.h"
18 #include "content/shell/browser/shell_content_browser_client.h"
19 #include "content/shell/browser/shell_devtools_frontend.h"
20 #include "content/shell/browser/shell_web_contents_view_delegate_creator.h"
21 #include "content/shell/common/shell_switches.h"
22 #include "third_party/WebKit/public/web/WebContextMenuData.h"
24 using blink::WebContextMenuData
;
29 ShellContextMenuItemCutId
= 10001,
30 ShellContextMenuItemCopyId
,
31 ShellContextMenuItemPasteId
,
32 ShellContextMenuItemDeleteId
,
33 ShellContextMenuItemOpenLinkId
,
34 ShellContextMenuItemBackId
,
35 ShellContextMenuItemForwardId
,
36 ShellContextMenuItemReloadId
,
37 ShellContextMenuItemInspectId
40 void MakeContextMenuItem(HMENU menu
,
45 MENUITEMINFO mii
= {0};
46 mii
.cbSize
= sizeof(mii
);
47 mii
.fMask
= MIIM_FTYPE
| MIIM_ID
| MIIM_DATA
| MIIM_STRING
| MIIM_STATE
;
48 mii
.fState
= enabled
? MFS_ENABLED
: (MF_DISABLED
| MFS_GRAYED
);
49 mii
.fType
= MFT_STRING
;
51 mii
.dwTypeData
= text
;
53 InsertMenuItem(menu
, menu_index
, TRUE
, &mii
);
60 WebContentsViewDelegate
* CreateShellWebContentsViewDelegate(
61 WebContents
* web_contents
) {
62 return new ShellWebContentsViewDelegate(web_contents
);
65 ShellWebContentsViewDelegate::ShellWebContentsViewDelegate(
66 WebContents
* web_contents
)
67 : web_contents_(web_contents
) {
70 ShellWebContentsViewDelegate::~ShellWebContentsViewDelegate() {
73 void ShellWebContentsViewDelegate::ShowContextMenu(
74 RenderFrameHost
* render_frame_host
,
75 const ContextMenuParams
& params
) {
76 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree
))
80 bool has_link
= !params_
.unfiltered_link_url
.is_empty();
81 bool has_selection
= !params_
.selection_text
.empty();
83 HMENU menu
= CreateMenu();
84 HMENU sub_menu
= CreatePopupMenu();
85 AppendMenu(menu
, MF_STRING
| MF_POPUP
, (UINT
)sub_menu
, L
"");
88 if (params_
.media_type
== WebContextMenuData::MediaTypeNone
&&
91 !params_
.is_editable
) {
92 MakeContextMenuItem(sub_menu
,
95 ShellContextMenuItemBackId
,
96 web_contents_
->GetController().CanGoBack());
98 MakeContextMenuItem(sub_menu
,
101 ShellContextMenuItemForwardId
,
102 web_contents_
->GetController().CanGoForward());
104 MakeContextMenuItem(sub_menu
,
107 ShellContextMenuItemReloadId
,
110 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
115 MakeContextMenuItem(sub_menu
,
117 L
"Open in New Window",
118 ShellContextMenuItemOpenLinkId
,
120 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
124 if (params_
.is_editable
) {
125 bool cut_enabled
= ((params_
.edit_flags
& WebContextMenuData::CanCut
) != 0);
126 MakeContextMenuItem(sub_menu
,
129 ShellContextMenuItemCutId
,
133 ((params_
.edit_flags
& WebContextMenuData::CanCopy
) != 0);
134 MakeContextMenuItem(sub_menu
,
137 ShellContextMenuItemCopyId
,
141 ((params_
.edit_flags
& WebContextMenuData::CanPaste
) != 0);
142 MakeContextMenuItem(sub_menu
,
145 ShellContextMenuItemPasteId
,
147 bool delete_enabled
=
148 ((params_
.edit_flags
& WebContextMenuData::CanDelete
) != 0);
149 MakeContextMenuItem(sub_menu
,
152 ShellContextMenuItemDeleteId
,
155 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
157 } else if (has_selection
) {
158 MakeContextMenuItem(sub_menu
,
161 ShellContextMenuItemCopyId
,
164 AppendMenu(sub_menu
, MF_SEPARATOR
, 0, NULL
);
168 MakeContextMenuItem(sub_menu
,
171 ShellContextMenuItemInspectId
,
173 #if defined(USE_AURA)
176 gfx::Point
screen_point(params
.x
, params
.y
);
177 POINT point
= screen_point
.ToPOINT();
178 ClientToScreen(web_contents_
->GetView()->GetNativeView(), &point
);
181 TrackPopupMenu(sub_menu
,
182 TPM_LEFTALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
185 web_contents_
->GetView()->GetContentNativeView(),
188 MenuItemSelected(selection
);
193 void ShellWebContentsViewDelegate::MenuItemSelected(int selection
) {
195 case ShellContextMenuItemCutId
:
196 web_contents_
->Cut();
198 case ShellContextMenuItemCopyId
:
199 web_contents_
->Copy();
201 case ShellContextMenuItemPasteId
:
202 web_contents_
->Paste();
204 case ShellContextMenuItemDeleteId
:
205 web_contents_
->Delete();
207 case ShellContextMenuItemOpenLinkId
: {
208 ShellBrowserContext
* browser_context
=
209 ShellContentBrowserClient::Get()->browser_context();
210 Shell::CreateNewWindow(browser_context
,
217 case ShellContextMenuItemBackId
:
218 web_contents_
->GetController().GoToOffset(-1);
219 web_contents_
->GetView()->Focus();
221 case ShellContextMenuItemForwardId
:
222 web_contents_
->GetController().GoToOffset(1);
223 web_contents_
->GetView()->Focus();
225 case ShellContextMenuItemReloadId
:
226 web_contents_
->GetController().Reload(false);
227 web_contents_
->GetView()->Focus();
229 case ShellContextMenuItemInspectId
: {
230 ShellDevToolsFrontend::Show(web_contents_
);
236 WebDragDestDelegate
* ShellWebContentsViewDelegate::GetDragDestDelegate() {
240 void ShellWebContentsViewDelegate::StoreFocus() {
243 void ShellWebContentsViewDelegate::RestoreFocus() {
246 bool ShellWebContentsViewDelegate::Focus() {
250 void ShellWebContentsViewDelegate::TakeFocus(bool reverse
) {
253 void ShellWebContentsViewDelegate::SizeChanged(const gfx::Size
& size
) {
256 } // namespace content