Title: [233271] trunk/Source/WebKit
Revision
233271
Author
[email protected]
Date
2018-06-27 12:19:16 -0700 (Wed, 27 Jun 2018)

Log Message

[Wincairo] Add support for context menus to non-legacy minibrowser
https://bugs.webkit.org/show_bug.cgi?id=186815.

Patch by Stephan Szabo <[email protected]> on 2018-06-27
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:

Modified Paths

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; }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to