Changeset 227001 in webkit
- Timestamp:
- Jan 16, 2018, 1:58:34 PM (7 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/CMakeLists.txt
r226991 r227001 313 313 UIProcess/WebContextConnectionClient.cpp 314 314 UIProcess/WebContextInjectedBundleClient.cpp 315 UIProcess/WebContextMenuListenerProxy.cpp 315 316 UIProcess/WebContextMenuProxy.cpp 316 317 UIProcess/WebCookieManagerProxy.cpp -
trunk/Source/WebKit/ChangeLog
r226991 r227001 1 2018-01-16 Alex Christensen <achristensen@webkit.org> 2 3 Merge sync and async code paths for getting context menus 4 https://bugs.webkit.org/show_bug.cgi?id=181423 5 6 Reviewed by Joseph Pecoraro. 7 8 What a mess. We had a code path for asynchronous context menu generation and a different one for synchronous context menu generation. 9 This makes it so there is just one. At the API level we see if there is an asynchronous delegate to call, then synchronous. 10 There is a subtle theoretical change in behaviour because m_page.contextMenuClient().showContextMenu is now called for the asynchronous 11 case and it wasn't before, but the one C API client that uses this has nullptr as it's WKPageShowContextMenuCallback, so we won't break anything! 12 13 * UIProcess/API/APIContextMenuClient.h: 14 (API::ContextMenuClient::getContextMenuFromProposedMenu): 15 (API::ContextMenuClient::getContextMenuFromProposedMenuAsync): Deleted. 16 * UIProcess/API/C/WKPage.cpp: 17 (WKPageSetPageContextMenuClient): 18 * UIProcess/API/glib/WebKitContextMenuClient.cpp: 19 * UIProcess/WebContextMenuProxy.h: 20 * UIProcess/gtk/WebContextMenuProxyGtk.cpp: 21 (WebKit::WebContextMenuProxyGtk::show): 22 (WebKit::WebContextMenuProxyGtk::showContextMenuWithItems): 23 * UIProcess/gtk/WebContextMenuProxyGtk.h: 24 * UIProcess/mac/WebContextMenuProxyMac.h: 25 * UIProcess/mac/WebContextMenuProxyMac.mm: 26 (WebKit::WebContextMenuProxyMac::showContextMenuWithItems): 27 (WebKit::WebContextMenuProxyMac::showContextMenu): 28 * UIProcess/wpe/WebContextMenuProxyWPE.h: 29 1 30 2018-01-16 Michael Catanzaro <mcatanzaro@igalia.com> 2 31 -
trunk/Source/WebKit/PlatformMac.cmake
r226991 r227001 169 169 UIProcess/HighPerformanceGraphicsUsageSampler.cpp 170 170 UIProcess/PerActivityStateCPUUsageSampler.cpp 171 UIProcess/WebContextMenuListenerProxy.cpp172 171 UIProcess/WebResourceLoadStatisticsStore.cpp 173 172 UIProcess/WebResourceLoadStatisticsTelemetry.cpp -
trunk/Source/WebKit/UIProcess/API/APIContextMenuClient.h
r226817 r227001 28 28 #if ENABLE(CONTEXT_MENUS) 29 29 30 #include "WebContextMenuItem.h" 30 31 #include "WebContextMenuListenerProxy.h" 31 32 #include "WebHitTestResultData.h" … … 41 42 42 43 namespace WebKit { 43 class WebContextMenuItem;44 44 class WebContextMenuItemData; 45 45 class WebPageProxy; … … 52 52 virtual ~ContextMenuClient() { } 53 53 54 virtual bool getContextMenuFromProposedMenu(WebKit::WebPageProxy&, const Vector<Ref<WebKit::WebContextMenuItem>>& /* proposedMenu */, Vector<Ref<WebKit::WebContextMenuItem>>& /* customMenu */, const WebKit::WebHitTestResultData&, API::Object* /* userData */) { return false; } 55 virtual bool getContextMenuFromProposedMenuAsync(WebKit::WebPageProxy&, const Vector<Ref<WebKit::WebContextMenuItem>>& /* proposedMenu */, WebKit::WebContextMenuListenerProxy*, const WebKit::WebHitTestResultData&, API::Object* /* userData */) { return false; } 54 virtual void getContextMenuFromProposedMenu(WebKit::WebPageProxy&, Vector<Ref<WebKit::WebContextMenuItem>>&& proposedMenu, WebKit::WebContextMenuListenerProxy& listener, const WebKit::WebHitTestResultData&, API::Object* /* userData */) { listener.useContextMenuItems(WTFMove(proposedMenu)); } 56 55 virtual void customContextMenuItemSelected(WebKit::WebPageProxy&, const WebKit::WebContextMenuItemData&) { } 57 56 virtual bool showContextMenu(WebKit::WebPageProxy&, const WebCore::IntPoint&, const Vector<Ref<WebKit::WebContextMenuItem>>&) { return false; } -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r226817 r227001 819 819 820 820 private: 821 bool getContextMenuFromProposedMenu(WebPageProxy& page, const Vector<Ref<WebKit::WebContextMenuItem>>& proposedMenuVector, Vector<Ref<WebKit::WebContextMenuItem>>& customMenu, const WebHitTestResultData& hitTestResultData, API::Object* userData) override 822 { 823 if (!m_client.getContextMenuFromProposedMenu && !m_client.getContextMenuFromProposedMenu_deprecatedForUseWithV0) 824 return false; 825 826 if (m_client.base.version >= 2 && !m_client.getContextMenuFromProposedMenu) 827 return false; 821 void getContextMenuFromProposedMenu(WebPageProxy& page, Vector<Ref<WebKit::WebContextMenuItem>>&& proposedMenuVector, WebKit::WebContextMenuListenerProxy& contextMenuListener, const WebHitTestResultData& hitTestResultData, API::Object* userData) override 822 { 823 if (m_client.base.version >= 4 && m_client.getContextMenuFromProposedMenuAsync) { 824 Vector<RefPtr<API::Object>> proposedMenuItems; 825 proposedMenuItems.reserveInitialCapacity(proposedMenuVector.size()); 826 827 for (const auto& menuItem : proposedMenuVector) 828 proposedMenuItems.uncheckedAppend(menuItem.ptr()); 829 830 auto webHitTestResult = API::HitTestResult::create(hitTestResultData); 831 m_client.getContextMenuFromProposedMenuAsync(toAPI(&page), toAPI(API::Array::create(WTFMove(proposedMenuItems)).ptr()), toAPI(&contextMenuListener), toAPI(webHitTestResult.ptr()), toAPI(userData), m_client.base.clientInfo); 832 return; 833 } 834 835 if (!m_client.getContextMenuFromProposedMenu && !m_client.getContextMenuFromProposedMenu_deprecatedForUseWithV0) { 836 contextMenuListener.useContextMenuItems(WTFMove(proposedMenuVector)); 837 return; 838 } 839 840 if (m_client.base.version >= 2 && !m_client.getContextMenuFromProposedMenu) { 841 contextMenuListener.useContextMenuItems(WTFMove(proposedMenuVector)); 842 return; 843 } 828 844 829 845 Vector<RefPtr<API::Object>> proposedMenuItems; … … 842 858 RefPtr<API::Array> array = adoptRef(toImpl(newMenu)); 843 859 844 customMenu.clear(); 845 860 Vector<Ref<WebContextMenuItem>> customMenu; 846 861 size_t newSize = array ? array->size() : 0; 862 customMenu.reserveInitialCapacity(newSize); 847 863 for (size_t i = 0; i < newSize; ++i) { 848 864 WebContextMenuItem* item = array->at<WebContextMenuItem>(i); … … 852 868 } 853 869 854 customMenu.append(*item); 855 } 856 857 return true; 858 } 859 860 bool getContextMenuFromProposedMenuAsync(WebPageProxy& page, const Vector<Ref<WebKit::WebContextMenuItem>>& proposedMenuVector, WebKit::WebContextMenuListenerProxy* contextMenuListener, const WebHitTestResultData& hitTestResultData, API::Object* userData) override 861 { 862 if (m_client.base.version < 4 || !m_client.getContextMenuFromProposedMenuAsync) 863 return false; 864 865 Vector<RefPtr<API::Object>> proposedMenuItems; 866 proposedMenuItems.reserveInitialCapacity(proposedMenuVector.size()); 867 868 for (const auto& menuItem : proposedMenuVector) 869 proposedMenuItems.uncheckedAppend(menuItem.ptr()); 870 871 RefPtr<API::HitTestResult> webHitTestResult = API::HitTestResult::create(hitTestResultData); 872 m_client.getContextMenuFromProposedMenuAsync(toAPI(&page), toAPI(API::Array::create(WTFMove(proposedMenuItems)).ptr()), toAPI(contextMenuListener), toAPI(webHitTestResult.get()), toAPI(userData), m_client.base.clientInfo); 873 874 return true; 870 customMenu.uncheckedAppend(*item); 871 } 872 873 contextMenuListener.useContextMenuItems(WTFMove(customMenu)); 875 874 } 876 875 -
trunk/Source/WebKit/UIProcess/API/glib/WebKitContextMenuClient.cpp
r226817 r227001 35 35 36 36 private: 37 bool getContextMenuFromProposedMenu(WebPageProxy&, const Vector<Ref<WebContextMenuItem>>& proposedMenu, Vector<Ref<WebContextMenuItem>>&, const WebHitTestResultData& hitTestResultData, API::Object* userData) override37 void getContextMenuFromProposedMenu(WebPageProxy&, Vector<Ref<WebKit::WebContextMenuItem>>&& proposedMenu, WebKit::WebContextMenuListenerProxy& contextMenuListener, const WebHitTestResultData& hitTestResultData, API::Object* userData) override 38 38 { 39 39 GRefPtr<GVariant> variant; … … 49 49 menuItems.uncheckedAppend(item->data()); 50 50 webkitWebViewPopulateContextMenu(m_webView, menuItems, hitTestResultData, variant.get()); 51 return true;51 contextMenuListener.useContextMenuItems({ }); 52 52 } 53 53 -
trunk/Source/WebKit/UIProcess/WebContextMenuProxy.h
r226817 r227001 42 42 virtual void show() = 0; 43 43 44 virtual void showContextMenuWithItems( const Vector<Ref<WebContextMenuItem>>&) = 0;44 virtual void showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&) = 0; 45 45 46 46 protected: -
trunk/Source/WebKit/UIProcess/gtk/WebContextMenuProxyGtk.cpp
r226817 r227001 150 150 } 151 151 152 Vector<Ref<WebContextMenuItem>> clientItems; 153 bool useProposedItems = true; 154 155 if (m_page->contextMenuClient().getContextMenuFromProposedMenu(*m_page, proposedAPIItems, clientItems, m_context.webHitTestResultData(), m_page->process().transformHandlesToObjects(m_userData.object()).get())) 156 useProposedItems = false; 157 158 const Vector<Ref<WebContextMenuItem>>& items = useProposedItems ? proposedAPIItems : clientItems; 159 152 m_page->contextMenuClient().getContextMenuFromProposedMenu(*m_page, WTFMove(proposedAPIItems), WebContextMenuListenerProxy::create(this).get(), m_context.webHitTestResultData(), m_page->process().transformHandlesToObjects(m_userData.object()).get()); 153 } 154 155 void WebContextMenuProxyGtk::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&& items) 156 { 160 157 if (!items.isEmpty()) 161 158 populate(items); … … 172 169 const GdkEvent* event = mouseEvent ? mouseEvent->nativeEvent() : 0; 173 170 gtk_menu_attach_to_widget(m_menu, GTK_WIDGET(m_webView), nullptr); 174 gtk_menu_popup(m_menu, nullptr, nullptr, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, 175 event ? event->button.button : 3, event ? event->button.time : GDK_CURRENT_TIME); 176 } 177 178 void WebContextMenuProxyGtk::showContextMenuWithItems(const Vector<Ref<WebContextMenuItem>>&) 179 { 171 gtk_menu_popup(m_menu, nullptr, nullptr, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, event ? event->button.button : 3, event ? event->button.time : GDK_CURRENT_TIME); 180 172 } 181 173 -
trunk/Source/WebKit/UIProcess/gtk/WebContextMenuProxyGtk.h
r226817 r227001 56 56 WebContextMenuProxyGtk(GtkWidget*, WebPageProxy&, ContextMenuContextData&&, const UserData&); 57 57 void show() override; 58 void showContextMenuWithItems( const Vector<Ref<WebContextMenuItem>>&) override;58 void showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&) override; 59 59 void append(GMenu*, const WebContextMenuItemGlib&); 60 60 GRefPtr<GMenu> buildMenu(const Vector<WebContextMenuItemGlib>&); -
trunk/Source/WebKit/UIProcess/mac/WebContextMenuProxyMac.h
r226817 r227001 55 55 56 56 void contextMenuItemSelected(const WebContextMenuItemData&); 57 void showContextMenuWithItems( const Vector<Ref<WebContextMenuItem>>&) override;57 void showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&) override; 58 58 59 59 #if ENABLE(SERVICE_CONTROLS) -
trunk/Source/WebKit/UIProcess/mac/WebContextMenuProxyMac.mm
r226817 r227001 452 452 } 453 453 454 void WebContextMenuProxyMac::showContextMenuWithItems(const Vector<Ref<WebContextMenuItem>>& items) 455 { 454 void WebContextMenuProxyMac::showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&& items) 455 { 456 if (m_page.contextMenuClient().showContextMenu(m_page, m_context.menuLocation(), items)) 457 return; 458 459 if (items.isEmpty()) 460 return; 461 456 462 Vector<WebContextMenuItemData> data; 457 463 data.reserveInitialCapacity(items.size()); … … 479 485 proposedAPIItems.append(WebContextMenuItem::create(item)); 480 486 481 Vector<Ref<WebContextMenuItem>> clientItems;482 bool useProposedItems = true;483 484 487 if (m_contextMenuListener) { 485 488 m_contextMenuListener->invalidate(); … … 489 492 m_contextMenuListener = WebContextMenuListenerProxy::create(this); 490 493 491 if (m_page.contextMenuClient().getContextMenuFromProposedMenuAsync(m_page, proposedAPIItems, m_contextMenuListener.get(), m_context.webHitTestResultData(), m_page.process().transformHandlesToObjects(m_userData.object()).get())) 492 return; 493 494 // FIXME: Get rid of these two client calls once we don't need to support the C SPI. 495 if (m_page.contextMenuClient().getContextMenuFromProposedMenu(m_page, proposedAPIItems, clientItems, m_context.webHitTestResultData(), m_page.process().transformHandlesToObjects(m_userData.object()).get())) 496 useProposedItems = false; 497 498 if (m_page.contextMenuClient().showContextMenu(m_page, m_context.menuLocation(), useProposedItems ? proposedAPIItems : clientItems)) 499 return; 500 501 auto&& items = WTFMove(useProposedItems ? proposedAPIItems : clientItems); 502 503 if (items.isEmpty()) 504 return; 505 506 showContextMenuWithItems(items); 494 m_page.contextMenuClient().getContextMenuFromProposedMenu(m_page, WTFMove(proposedAPIItems), *m_contextMenuListener, m_context.webHitTestResultData(), m_page.process().transformHandlesToObjects(m_userData.object()).get()); 507 495 } 508 496 -
trunk/Source/WebKit/UIProcess/wpe/WebContextMenuProxyWPE.h
r226817 r227001 37 37 } 38 38 39 void showContextMenuWithItems( const Vector<Ref<WebContextMenuItem>>&) final { }39 void showContextMenuWithItems(Vector<Ref<WebContextMenuItem>>&&) final { } 40 40 void show() final { }; 41 41
Note:
See TracChangeset
for help on using the changeset viewer.