Diff
Modified: trunk/Source/WebKit/ChangeLog (233270 => 233271)
--- trunk/Source/WebKit/ChangeLog 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/ChangeLog 2018-06-27 19:19:16 UTC (rev 233271)
@@ -1,3 +1,30 @@
+2018-06-27 Stephan Szabo <[email protected]>
+
+ [Wincairo] Add support for context menus to non-legacy minibrowser
+ https://bugs.webkit.org/show_bug.cgi?id=186815.
+
+ Reviewed by Ryosuke Niwa.
+
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/win/PageClientImpl.cpp:
+ (WebKit::PageClientImpl::viewWidget):
+ * UIProcess/win/PageClientImpl.h:
+ * UIProcess/win/WebContextMenuProxyWin.cpp:
+ (WebKit::WebContextMenuProxyWin::show):
+ (WebKit::createMenu):
+ (WebKit::createMenuItem):
+ (WebKit::populate):
+ (WebKit::WebContextMenuProxyWin::showContextMenuWithItems):
+ (WebKit::WebContextMenuProxyWin::WebContextMenuProxyWin):
+ (WebKit::WebContextMenuProxyWin::~WebContextMenuProxyWin):
+ * UIProcess/win/WebContextMenuProxyWin.h:
+ * UIProcess/win/WebPageProxyWin.cpp:
+ (WebKit::WebPageProxy::viewWidget):
+ * UIProcess/win/WebView.cpp:
+ (WebKit::WebView::wndProc):
+ (WebKit::WebView::onMenuCommand):
+ * UIProcess/win/WebView.h:
+
2018-06-27 Youenn Fablet <[email protected]>
Disable content blockers in NetworkLoadChecker except for ping loads
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-06-27 19:19:16 UTC (rev 233271)
@@ -207,6 +207,10 @@
typedef struct OpaqueJSContext* JSGlobalContextRef;
#endif
+#if PLATFORM(WIN)
+typedef HWND PlatformWidget;
+#endif
+
namespace WebKit {
class CertificateInfo;
class DrawingAreaProxy;
@@ -696,6 +700,10 @@
void setBackgroundColor(const WebCore::Color& color) { m_backgroundColor = color; }
#endif
+#if PLATFORM(WIN)
+ PlatformWidget viewWidget();
+#endif
+
bool isProcessingMouseEvents() const;
void processNextQueuedMouseEvent();
void handleMouseEvent(const NativeWebMouseEvent&);
Modified: trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp 2018-06-27 19:19:16 UTC (rev 233271)
@@ -352,4 +352,9 @@
notImplemented();
}
+HWND PageClientImpl::viewWidget()
+{
+ return m_view.window();
+}
+
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/win/PageClientImpl.h (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/PageClientImpl.h 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/PageClientImpl.h 2018-06-27 19:19:16 UTC (rev 233271)
@@ -48,6 +48,7 @@
public:
PageClientImpl(WebView&);
+ HWND viewWidget();
private:
// PageClient
std::unique_ptr<DrawingAreaProxy> createDrawingAreaProxy() override;
Modified: trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp 2018-06-27 19:19:16 UTC (rev 233271)
@@ -33,6 +33,7 @@
#include "WebContextMenuItem.h"
#include "WebContextMenuItemData.h"
#include "WebPageProxy.h"
+#include "WebProcessProxy.h"
using namespace WebCore;
@@ -40,20 +41,86 @@
void WebContextMenuProxyWin::show()
{
+ Vector<Ref<WebContextMenuItem>> proposedAPIItems;
+ for (auto& item : m_context.menuItems())
+ proposedAPIItems.append(WebContextMenuItem::create(item));
+ m_contextMenuListener = WebContextMenuListenerProxy::create(this);
+ m_page.contextMenuClient().getContextMenuFromProposedMenu(m_page, WTFMove(proposedAPIItems), *m_contextMenuListener, m_context.webHitTestResultData(), m_page.process().transformHandlesToObjects(m_userData.object()).get());
}
-void WebContextMenuProxyWin::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&)
+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().charactersWithNullTermination().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().charactersWithNullTermination().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 = ""
+ 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 = m_page.viewWidget();
+ ::ClientToScreen(wnd, &pt);
+ ::TrackPopupMenuEx(m_menu, flags, pt.x, pt.y, m_page.viewWidget(), nullptr);
+}
+
WebContextMenuProxyWin::WebContextMenuProxyWin(WebPageProxy& page, ContextMenuContextData&& context, const UserData& userData)
: WebContextMenuProxy(WTFMove(context), userData)
, m_page(page)
{
+ m_menu = createMenu(m_context);
}
WebContextMenuProxyWin::~WebContextMenuProxyWin()
{
+ if (m_menu)
+ ::DestroyMenu(m_menu);
}
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h 2018-06-27 19:19:16 UTC (rev 233271)
@@ -28,6 +28,7 @@
#if ENABLE(CONTEXT_MENUS)
+#include "WebContextMenuListenerProxy.h"
#include "WebContextMenuProxy.h"
namespace WebKit {
@@ -49,6 +50,8 @@
void show() override;
WebPageProxy& m_page;
+ RefPtr<WebContextMenuListenerProxy> m_contextMenuListener;
+ HMENU m_menu;
};
Modified: trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp 2018-06-27 19:19:16 UTC (rev 233271)
@@ -28,6 +28,7 @@
#include "WebPageProxy.h"
#include "NotImplemented.h"
+#include "PageClientImpl.h"
#include <WebCore/UserAgent.h>
namespace WebKit {
@@ -56,4 +57,10 @@
m_editorState = editorState;
}
+PlatformWidget WebPageProxy::viewWidget()
+{
+ return static_cast<PageClientImpl&>(m_pageClient).viewWidget();
+}
+
+
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/win/WebView.cpp (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/WebView.cpp 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/WebView.cpp 2018-06-27 19:19:16 UTC (rev 233271)
@@ -166,6 +166,9 @@
case WM_SETCURSOR:
lResult = onSetCursor(hWnd, message, wParam, lParam, handled);
break;
+ case WM_MENUCOMMAND:
+ lResult = onMenuCommand(hWnd, message, wParam, lParam, handled);
+ break;
default:
handled = false;
break;
@@ -570,6 +573,35 @@
return 0;
}
+LRESULT WebView::onMenuCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
+{
+ auto hMenu = reinterpret_cast<HMENU>(lParam);
+ auto index = static_cast<unsigned>(wParam);
+
+ MENUITEMINFO menuItemInfo;
+ menuItemInfo.cbSize = sizeof(menuItemInfo);
+ menuItemInfo.cch = 0;
+ menuItemInfo.fMask = MIIM_STRING;
+ ::GetMenuItemInfo(hMenu, index, TRUE, &menuItemInfo);
+
+ menuItemInfo.cch++;
+ Vector<WCHAR> buffer(menuItemInfo.cch);
+ menuItemInfo.dwTypeData = buffer.data();
+ menuItemInfo.fMask |= MIIM_ID;
+
+ ::GetMenuItemInfo(hMenu, index, TRUE, &menuItemInfo);
+
+ String title(buffer.data(), menuItemInfo.cch);
+ ContextMenuAction action = ""
+ bool enabled = !(menuItemInfo.fState & MFS_DISABLED);
+ bool checked = menuItemInfo.fState & MFS_CHECKED;
+ WebContextMenuItemData item(ContextMenuItemType::ActionType, action, title, enabled, checked);
+ m_page->contextMenuItemSelected(item);
+
+ handled = true;
+ return 0;
+}
+
void WebView::updateActiveState()
{
m_page->activityStateDidChange(ActivityState::WindowIsActive);
Modified: trunk/Source/WebKit/UIProcess/win/WebView.h (233270 => 233271)
--- trunk/Source/WebKit/UIProcess/win/WebView.h 2018-06-27 18:34:28 UTC (rev 233270)
+++ trunk/Source/WebKit/UIProcess/win/WebView.h 2018-06-27 19:19:16 UTC (rev 233271)
@@ -90,6 +90,7 @@
LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
+ LRESULT onMenuCommand(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
void paint(HDC, const WebCore::IntRect& dirtyRect);
void setWasActivatedByMouseEvent(bool flag) { m_wasActivatedByMouseEvent = flag; }