-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathWebContextMenuProxyWin.cpp
More file actions
118 lines (102 loc) · 4.35 KB
/
WebContextMenuProxyWin.cpp
File metadata and controls
118 lines (102 loc) · 4.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright (C) 2010 Apple Inc. All rights reserved.
* Copyright (C) 2017 Sony Interactive Entertainment Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "WebContextMenuProxyWin.h"
#if ENABLE(CONTEXT_MENUS)
#include "APIContextMenuClient.h"
#include "WebContextMenuItem.h"
#include "WebContextMenuItemData.h"
#include "WebPageProxy.h"
#include "WebProcessProxy.h"
namespace WebKit {
using namespace WebCore;
static HMENU createMenu(const ContextMenuContextData &context)
{
HMENU menu = ::CreatePopupMenu();
MENUINFO menuInfo;
menuInfo.cbSize = sizeof(menuInfo);
menuInfo.fMask = MIM_STYLE;
menuInfo.dwStyle = MNS_NOTIFYBYPOS;
menuInfo.dwMenuData = (ULONG_PTR)&context;
::SetMenuInfo(menu, &menuInfo);
return menu;
}
static void populate(const ContextMenuContextData &, HMENU, const Vector<WebContextMenuItemData>&);
static void createMenuItem(const ContextMenuContextData &context, HMENU menu, const WebContextMenuItemData &data)
{
UINT flags = 0;
flags |= data.enabled() ? MF_ENABLED : MF_DISABLED;
flags |= data.checked() ? MF_CHECKED : MF_UNCHECKED;
switch (data.type()) {
case ContextMenuItemType::Action:
case ContextMenuItemType::CheckableAction:
::AppendMenu(menu, flags | MF_STRING, data.action(), data.title().wideCharacters().span().data());
break;
case ContextMenuItemType::Separator:
::AppendMenu(menu, flags | MF_SEPARATOR, data.action(), nullptr);
break;
case ContextMenuItemType::Submenu:
HMENU submenu = createMenu(context);
populate(context, submenu, data.submenu());
::AppendMenu(menu, flags | MF_POPUP, (UINT_PTR)submenu, data.title().wideCharacters().span().data());
break;
}
}
static void populate(const ContextMenuContextData &context, HMENU menu, const Vector<WebContextMenuItemData>& items)
{
for (auto& data : items)
createMenuItem(context, menu, data);
}
static void populate(const ContextMenuContextData &context, HMENU menu, const Vector<Ref<WebContextMenuItem>>& items)
{
for (auto& item : items) {
auto data = item->data();
createMenuItem(context, menu, data);
}
}
void WebContextMenuProxyWin::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&& items)
{
populate(m_context, m_menu, items);
UINT flags = TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_VERPOSANIMATION | TPM_HORIZONTAL | TPM_LEFTALIGN | TPM_HORPOSANIMATION;
auto location = m_context.menuLocation();
location.scale(page()->intrinsicDeviceScaleFactor());
POINT pt = location;
HWND wnd = reinterpret_cast<HWND>(page()->viewWidget());
::ClientToScreen(wnd, &pt);
::TrackPopupMenuEx(m_menu, flags, pt.x, pt.y, wnd, nullptr);
}
WebContextMenuProxyWin::WebContextMenuProxyWin(WebPageProxy& page, FrameInfoData&& frameInfo, ContextMenuContextData&& context, const UserData& userData)
: WebContextMenuProxy(page, WTF::move(frameInfo), WTF::move(context), userData)
{
m_menu = createMenu(m_context);
}
WebContextMenuProxyWin::~WebContextMenuProxyWin()
{
if (m_menu)
::DestroyMenu(m_menu);
}
} // namespace WebKit
#endif // ENABLE(CONTEXT_MENUS)