Changeset 233271 in webkit
- Timestamp:
- Jun 27, 2018 12:19:16 PM (6 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r233269 r233271 1 2018-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 1 28 2018-06-27 Youenn Fablet <youenn@apple.com> 2 29 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r233113 r233271 208 208 #endif 209 209 210 #if PLATFORM(WIN) 211 typedef HWND PlatformWidget; 212 #endif 213 210 214 namespace WebKit { 211 215 class CertificateInfo; … … 697 701 #endif 698 702 703 #if PLATFORM(WIN) 704 PlatformWidget viewWidget(); 705 #endif 706 699 707 bool isProcessingMouseEvents() const; 700 708 void processNextQueuedMouseEvent(); -
trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp
r230982 r233271 353 353 } 354 354 355 HWND PageClientImpl::viewWidget() 356 { 357 return m_view.window(); 358 } 359 355 360 } // namespace WebKit -
trunk/Source/WebKit/UIProcess/win/PageClientImpl.h
r230982 r233271 49 49 PageClientImpl(WebView&); 50 50 51 HWND viewWidget(); 51 52 private: 52 53 // PageClient -
trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp
r230982 r233271 34 34 #include "WebContextMenuItemData.h" 35 35 #include "WebPageProxy.h" 36 #include "WebProcessProxy.h" 36 37 37 38 using namespace WebCore; … … 41 42 void WebContextMenuProxyWin::show() 42 43 { 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()); 43 49 } 44 50 45 void WebContextMenuProxyWin::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&)51 static HMENU createMenu(const ContextMenuContextData &context) 46 52 { 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 63 static void populate(const ContextMenuContextData &, HMENU, const Vector<WebContextMenuItemData>&); 64 65 static 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 88 static void populate(const ContextMenuContextData &context, HMENU menu, const Vector<WebContextMenuItemData>& items) 89 { 90 for (auto& data : items) 91 createMenuItem(context, menu, data); 92 } 93 94 static 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 102 void 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); 47 111 } 48 112 … … 51 115 , m_page(page) 52 116 { 117 m_menu = createMenu(m_context); 53 118 } 54 119 55 120 WebContextMenuProxyWin::~WebContextMenuProxyWin() 56 121 { 122 if (m_menu) 123 ::DestroyMenu(m_menu); 57 124 } 58 125 -
trunk/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h
r230982 r233271 29 29 #if ENABLE(CONTEXT_MENUS) 30 30 31 #include "WebContextMenuListenerProxy.h" 31 32 #include "WebContextMenuProxy.h" 32 33 … … 50 51 51 52 WebPageProxy& m_page; 53 RefPtr<WebContextMenuListenerProxy> m_contextMenuListener; 54 HMENU m_menu; 52 55 }; 53 56 -
trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp
r230982 r233271 29 29 30 30 #include "NotImplemented.h" 31 #include "PageClientImpl.h" 31 32 #include <WebCore/UserAgent.h> 32 33 … … 57 58 } 58 59 60 PlatformWidget WebPageProxy::viewWidget() 61 { 62 return static_cast<PageClientImpl&>(m_pageClient).viewWidget(); 63 } 64 65 59 66 } // namespace WebKit -
trunk/Source/WebKit/UIProcess/win/WebView.cpp
r230982 r233271 167 167 lResult = onSetCursor(hWnd, message, wParam, lParam, handled); 168 168 break; 169 case WM_MENUCOMMAND: 170 lResult = onMenuCommand(hWnd, message, wParam, lParam, handled); 171 break; 169 172 default: 170 173 handled = false; … … 571 574 } 572 575 576 LRESULT 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 573 605 void WebView::updateActiveState() 574 606 { -
trunk/Source/WebKit/UIProcess/win/WebView.h
r230982 r233271 91 91 LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled); 92 92 LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled); 93 LRESULT onMenuCommand(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled); 93 94 94 95 void paint(HDC, const WebCore::IntRect& dirtyRect);
Note: See TracChangeset
for help on using the changeset viewer.