Changeset 233271 in webkit


Ignore:
Timestamp:
Jun 27, 2018 12:19:16 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

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

Patch by Stephan Szabo <stephan.szabo@sony.com> 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:
Location:
trunk/Source/WebKit
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r233269 r233271  
     12018-06-27  Stephan Szabo  <stephan.szabo@sony.com>
     2
     3        [Wincairo] Add support for context menus to non-legacy minibrowser
     4        https://bugs.webkit.org/show_bug.cgi?id=186815.
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * UIProcess/WebPageProxy.h:
     9        * UIProcess/win/PageClientImpl.cpp:
     10        (WebKit::PageClientImpl::viewWidget):
     11        * UIProcess/win/PageClientImpl.h:
     12        * UIProcess/win/WebContextMenuProxyWin.cpp:
     13        (WebKit::WebContextMenuProxyWin::show):
     14        (WebKit::createMenu):
     15        (WebKit::createMenuItem):
     16        (WebKit::populate):
     17        (WebKit::WebContextMenuProxyWin::showContextMenuWithItems):
     18        (WebKit::WebContextMenuProxyWin::WebContextMenuProxyWin):
     19        (WebKit::WebContextMenuProxyWin::~WebContextMenuProxyWin):
     20        * UIProcess/win/WebContextMenuProxyWin.h:
     21        * UIProcess/win/WebPageProxyWin.cpp:
     22        (WebKit::WebPageProxy::viewWidget):
     23        * UIProcess/win/WebView.cpp:
     24        (WebKit::WebView::wndProc):
     25        (WebKit::WebView::onMenuCommand):
     26        * UIProcess/win/WebView.h:
     27
    1282018-06-27  Youenn Fablet  <youenn@apple.com>
    229
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r233113 r233271  
    208208#endif
    209209
     210#if PLATFORM(WIN)
     211typedef HWND PlatformWidget;
     212#endif
     213
    210214namespace WebKit {
    211215class CertificateInfo;
     
    697701#endif
    698702
     703#if PLATFORM(WIN)
     704    PlatformWidget viewWidget();
     705#endif
     706
    699707    bool isProcessingMouseEvents() const;
    700708    void processNextQueuedMouseEvent();
  • trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp

    r230982 r233271  
    353353}
    354354
     355HWND PageClientImpl::viewWidget()
     356{
     357    return m_view.window();
     358}
     359
    355360} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/win/PageClientImpl.h

    r230982 r233271  
    4949    PageClientImpl(WebView&);
    5050
     51    HWND viewWidget();
    5152private:
    5253    // PageClient
  • trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp

    r230982 r233271  
    3434#include "WebContextMenuItemData.h"
    3535#include "WebPageProxy.h"
     36#include "WebProcessProxy.h"
    3637
    3738using namespace WebCore;
     
    4142void WebContextMenuProxyWin::show()
    4243{
     44    Vector<Ref<WebContextMenuItem>> proposedAPIItems;
     45    for (auto& item : m_context.menuItems())
     46        proposedAPIItems.append(WebContextMenuItem::create(item));
     47    m_contextMenuListener = WebContextMenuListenerProxy::create(this);
     48    m_page.contextMenuClient().getContextMenuFromProposedMenu(m_page, WTFMove(proposedAPIItems), *m_contextMenuListener, m_context.webHitTestResultData(), m_page.process().transformHandlesToObjects(m_userData.object()).get());
    4349}
    4450
    45 void WebContextMenuProxyWin::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&)
     51static HMENU createMenu(const ContextMenuContextData &context)
    4652{
     53    HMENU menu = ::CreatePopupMenu();
     54    MENUINFO menuInfo;
     55    menuInfo.cbSize = sizeof(menuInfo);
     56    menuInfo.fMask = MIM_STYLE;
     57    menuInfo.dwStyle = MNS_NOTIFYBYPOS;
     58    menuInfo.dwMenuData = (ULONG_PTR)&context;
     59    ::SetMenuInfo(menu, &menuInfo);
     60    return menu;
     61}
     62
     63static void populate(const ContextMenuContextData &, HMENU, const Vector<WebContextMenuItemData>&);
     64
     65static void createMenuItem(const ContextMenuContextData &context, HMENU menu, const WebContextMenuItemData &data)
     66{
     67    UINT flags = 0;
     68
     69    flags |= data.enabled() ? MF_ENABLED : MF_DISABLED;
     70    flags |= data.checked() ? MF_CHECKED : MF_UNCHECKED;
     71
     72    switch (data.type()) {
     73    case ActionType:
     74    case CheckableActionType:
     75        ::AppendMenu(menu, flags | MF_STRING, data.action(), data.title().charactersWithNullTermination().data());
     76        break;
     77    case SeparatorType:
     78        ::AppendMenu(menu, flags | MF_SEPARATOR, data.action(), nullptr);
     79        break;
     80    case SubmenuType:
     81        HMENU submenu = createMenu(context);
     82        populate(context, submenu, data.submenu());
     83        ::AppendMenu(menu, flags | MF_POPUP, (UINT_PTR)submenu, data.title().charactersWithNullTermination().data());
     84        break;
     85    }
     86}
     87
     88static void populate(const ContextMenuContextData &context, HMENU menu, const Vector<WebContextMenuItemData>& items)
     89{
     90    for (auto& data : items)
     91        createMenuItem(context, menu, data);
     92}
     93
     94static void populate(const ContextMenuContextData &context, HMENU menu, const Vector<Ref<WebContextMenuItem>>& items)
     95{
     96    for (auto& item : items) {
     97        auto data = item->data();
     98        createMenuItem(context, menu, data);
     99    }
     100}
     101
     102void WebContextMenuProxyWin::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&& items)
     103{
     104    populate(m_context, m_menu, items);
     105
     106    UINT flags = TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_VERPOSANIMATION | TPM_HORIZONTAL | TPM_LEFTALIGN | TPM_HORPOSANIMATION;
     107    POINT pt { m_context.menuLocation().x(), m_context.menuLocation().y() };
     108    HWND wnd = m_page.viewWidget();
     109    ::ClientToScreen(wnd, &pt);
     110    ::TrackPopupMenuEx(m_menu, flags, pt.x, pt.y, m_page.viewWidget(), nullptr);
    47111}
    48112
     
    51115    , m_page(page)
    52116{
     117    m_menu = createMenu(m_context);
    53118}
    54119
    55120WebContextMenuProxyWin::~WebContextMenuProxyWin()
    56121{
     122    if (m_menu)
     123        ::DestroyMenu(m_menu);
    57124}
    58125
  • trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h

    r230982 r233271  
    2929#if ENABLE(CONTEXT_MENUS)
    3030
     31#include "WebContextMenuListenerProxy.h"
    3132#include "WebContextMenuProxy.h"
    3233
     
    5051
    5152    WebPageProxy& m_page;
     53    RefPtr<WebContextMenuListenerProxy> m_contextMenuListener;
     54    HMENU m_menu;
    5255};
    5356
  • trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp

    r230982 r233271  
    2929
    3030#include "NotImplemented.h"
     31#include "PageClientImpl.h"
    3132#include <WebCore/UserAgent.h>
    3233
     
    5758}
    5859
     60PlatformWidget WebPageProxy::viewWidget()
     61{
     62    return static_cast<PageClientImpl&>(m_pageClient).viewWidget();
     63}
     64
     65
    5966} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/win/WebView.cpp

    r230982 r233271  
    167167        lResult = onSetCursor(hWnd, message, wParam, lParam, handled);
    168168        break;
     169    case WM_MENUCOMMAND:
     170        lResult = onMenuCommand(hWnd, message, wParam, lParam, handled);
     171        break;
    169172    default:
    170173        handled = false;
     
    571574}
    572575
     576LRESULT WebView::onMenuCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
     577{
     578    auto hMenu = reinterpret_cast<HMENU>(lParam);
     579    auto index = static_cast<unsigned>(wParam);
     580
     581    MENUITEMINFO menuItemInfo;
     582    menuItemInfo.cbSize = sizeof(menuItemInfo);
     583    menuItemInfo.cch = 0;
     584    menuItemInfo.fMask = MIIM_STRING;
     585    ::GetMenuItemInfo(hMenu, index, TRUE, &menuItemInfo);
     586
     587    menuItemInfo.cch++;
     588    Vector<WCHAR> buffer(menuItemInfo.cch);
     589    menuItemInfo.dwTypeData = buffer.data();
     590    menuItemInfo.fMask |= MIIM_ID;
     591
     592    ::GetMenuItemInfo(hMenu, index, TRUE, &menuItemInfo);
     593
     594    String title(buffer.data(), menuItemInfo.cch);
     595    ContextMenuAction action = static_cast<ContextMenuAction>(menuItemInfo.wID);
     596    bool enabled = !(menuItemInfo.fState & MFS_DISABLED);
     597    bool checked = menuItemInfo.fState & MFS_CHECKED;
     598    WebContextMenuItemData item(ContextMenuItemType::ActionType, action, title, enabled, checked);
     599    m_page->contextMenuItemSelected(item);
     600
     601    handled = true;
     602    return 0;
     603}
     604
    573605void WebView::updateActiveState()
    574606{
  • trunk/Source/WebKit/UIProcess/win/WebView.h

    r230982 r233271  
    9191    LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    9292    LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
     93    LRESULT onMenuCommand(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    9394
    9495    void paint(HDC, const WebCore::IntRect& dirtyRect);
Note: See TracChangeset for help on using the changeset viewer.