WebKit Bugzilla
Attachment 343724 Details for
Bug 186815
: [Wincairo] Add support for context menus to non-legacy minibrowser
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Add context menu functions and WM_MENUCOMMAND handler
186815-3.diff (text/plain), 10.52 KB, created by
Stephan Szabo
on 2018-06-27 10:38:22 PDT
(
hide
)
Description:
Add context menu functions and WM_MENUCOMMAND handler
Filename:
MIME Type:
Creator:
Stephan Szabo
Created:
2018-06-27 10:38:22 PDT
Size:
10.52 KB
patch
obsolete
>diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index e1af8777e7e..675d52848bb 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,30 @@ >+2018-06-27 Stephan Szabo <stephan.szabo@sony.com> >+ >+ [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 Chris Dumez <cdumez@apple.com> > > Regression(r233208): Completion handler does not get called on GTK port >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index 2b820f2d5af..ac069185a06 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -207,6 +207,10 @@ typedef GtkWidget* PlatformWidget; > typedef struct OpaqueJSContext* JSGlobalContextRef; > #endif > >+#if PLATFORM(WIN) >+typedef HWND PlatformWidget; >+#endif >+ > namespace WebKit { > class CertificateInfo; > class DrawingAreaProxy; >@@ -696,6 +700,10 @@ public: > 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&); >diff --git a/Source/WebKit/UIProcess/win/PageClientImpl.cpp b/Source/WebKit/UIProcess/win/PageClientImpl.cpp >index 3703031de84..ab12f6e7960 100644 >--- a/Source/WebKit/UIProcess/win/PageClientImpl.cpp >+++ b/Source/WebKit/UIProcess/win/PageClientImpl.cpp >@@ -352,4 +352,9 @@ void PageClientImpl::derefView() > notImplemented(); > } > >+HWND PageClientImpl::viewWidget() >+{ >+ return m_view.window(); >+} >+ > } // namespace WebKit >diff --git a/Source/WebKit/UIProcess/win/PageClientImpl.h b/Source/WebKit/UIProcess/win/PageClientImpl.h >index 54b7549de39..defe0baa9a2 100644 >--- a/Source/WebKit/UIProcess/win/PageClientImpl.h >+++ b/Source/WebKit/UIProcess/win/PageClientImpl.h >@@ -48,6 +48,7 @@ class PageClientImpl : public PageClient > public: > PageClientImpl(WebView&); > >+ HWND viewWidget(); > private: > // PageClient > std::unique_ptr<DrawingAreaProxy> createDrawingAreaProxy() override; >diff --git a/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp b/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp >index a58acdbff21..18ef7304908 100644 >--- a/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp >+++ b/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.cpp >@@ -33,6 +33,7 @@ > #include "WebContextMenuItem.h" > #include "WebContextMenuItemData.h" > #include "WebPageProxy.h" >+#include "WebProcessProxy.h" > > using namespace WebCore; > >@@ -40,20 +41,86 @@ namespace WebKit { > > 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 = 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 = 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 >diff --git a/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h b/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h >index 5b236dafe52..8eda673849d 100644 >--- a/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h >+++ b/Source/WebKit/UIProcess/win/WebContextMenuProxyWin.h >@@ -28,6 +28,7 @@ > > #if ENABLE(CONTEXT_MENUS) > >+#include "WebContextMenuListenerProxy.h" > #include "WebContextMenuProxy.h" > > namespace WebKit { >@@ -49,6 +50,8 @@ private: > void show() override; > > WebPageProxy& m_page; >+ RefPtr<WebContextMenuListenerProxy> m_contextMenuListener; >+ HMENU m_menu; > }; > > >diff --git a/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp b/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp >index a2549ac3d96..c7483531f45 100644 >--- a/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp >+++ b/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp >@@ -28,6 +28,7 @@ > #include "WebPageProxy.h" > > #include "NotImplemented.h" >+#include "PageClientImpl.h" > #include <WebCore/UserAgent.h> > > namespace WebKit { >@@ -56,4 +57,10 @@ void WebPageProxy::editorStateChanged(const EditorState& editorState) > m_editorState = editorState; > } > >+PlatformWidget WebPageProxy::viewWidget() >+{ >+ return static_cast<PageClientImpl&>(m_pageClient).viewWidget(); >+} >+ >+ > } // namespace WebKit >diff --git a/Source/WebKit/UIProcess/win/WebView.cpp b/Source/WebKit/UIProcess/win/WebView.cpp >index 6dd6180d9b3..1f6a78e9d9d 100644 >--- a/Source/WebKit/UIProcess/win/WebView.cpp >+++ b/Source/WebKit/UIProcess/win/WebView.cpp >@@ -166,6 +166,9 @@ LRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) > 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 @@ LRESULT WebView::onSetCursor(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar > 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 = static_cast<ContextMenuAction>(menuItemInfo.wID); >+ 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); >diff --git a/Source/WebKit/UIProcess/win/WebView.h b/Source/WebKit/UIProcess/win/WebView.h >index be9a0c7385d..49e082a5355 100644 >--- a/Source/WebKit/UIProcess/win/WebView.h >+++ b/Source/WebKit/UIProcess/win/WebView.h >@@ -90,6 +90,7 @@ private: > 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; }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 186815
:
343165
|
343212
|
343638
| 343724