WebContextMenuProxyWin.cpp [plain text]
#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 ActionType:
case CheckableActionType:
::AppendMenu(menu, flags | MF_STRING, data.action(), data.title().wideCharacters().data());
break;
case SeparatorType:
::AppendMenu(menu, flags | MF_SEPARATOR, data.action(), nullptr);
break;
case SubmenuType:
HMENU submenu = createMenu(context);
populate(context, submenu, data.submenu());
::AppendMenu(menu, flags | MF_POPUP, (UINT_PTR)submenu, data.title().wideCharacters().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;
POINT pt { m_context.menuLocation().x(), m_context.menuLocation().y() };
HWND wnd = page()->viewWidget();
::ClientToScreen(wnd, &pt);
::TrackPopupMenuEx(m_menu, flags, pt.x, pt.y, page()->viewWidget(), nullptr);
}
WebContextMenuProxyWin::WebContextMenuProxyWin(WebPageProxy& page, ContextMenuContextData&& context, const UserData& userData)
: WebContextMenuProxy(page, WTFMove(context), userData)
{
m_menu = createMenu(m_context);
}
WebContextMenuProxyWin::~WebContextMenuProxyWin()
{
if (m_menu)
::DestroyMenu(m_menu);
}
} #endif // ENABLE(CONTEXT_MENUS)