Changeset 286762 in webkit
- Timestamp:
- Dec 8, 2021, 9:27:01 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 17 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/dom/mac/ImageControlsMac.cpp (modified) (3 diffs)
-
WebCore/dom/mac/ImageControlsMac.h (modified) (1 diff)
-
WebCore/html/HTMLButtonElement.cpp (modified) (2 diffs)
-
WebCore/page/ChromeClient.h (modified) (1 diff)
-
WebCore/page/ContextMenuController.cpp (modified) (2 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/Shared/ContextMenuContextData.cpp (modified) (4 diffs)
-
WebKit/Shared/ContextMenuContextData.h (modified) (3 diffs)
-
WebKit/UIProcess/WebContextMenuProxy.cpp (modified) (1 diff)
-
WebKit/UIProcess/WebPageProxy.cpp (modified) (2 diffs)
-
WebKit/UIProcess/mac/WebContextMenuProxyMac.mm (modified) (3 diffs)
-
WebKit/UIProcess/mac/WebPageProxyMac.mm (modified) (1 diff)
-
WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp (modified) (1 diff)
-
WebKit/WebProcess/WebCoreSupport/WebChromeClient.h (modified) (1 diff)
-
WebKit/WebProcess/WebPage/WebPage.h (modified) (1 diff)
-
WebKit/WebProcess/WebPage/mac/WebPageMac.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286759 r286762 1 2021-12-08 Megan Gardner <megan_gardner@apple.com> 2 3 Show correct content menu for images services chevron. 4 https://bugs.webkit.org/show_bug.cgi?id=233970 5 6 Reviewed by Tim Horton. 7 8 Add support for showing the correct context menu for image services. 9 Since this is internal only and can never be affected by web content, we bypass 10 the web content round trip and directly message the UIProcess about showing 11 a context menu for images. And because it would be bizarre if the web content 12 could prevent a menu from popping up on a button they have no control over. 13 14 * dom/mac/ImageControlsMac.cpp: 15 (WebCore::ImageControlsMac::isImageControlsButtonElement): 16 (WebCore::ImageControlsMac::imageFromImageElementNode): 17 (WebCore::ImageControlsMac::handleEvent): 18 (WebCore::ImageControlsMac::imageControlHost): Deleted. 19 * dom/mac/ImageControlsMac.h: 20 * html/HTMLButtonElement.cpp: 21 (WebCore::HTMLButtonElement::defaultEventHandler): 22 * page/ChromeClient.h: 23 (WebCore::ChromeClient::handleImageServiceClick): 24 * page/ContextMenuController.cpp: 25 (WebCore::ContextMenuController::maybeCreateContextMenu): 26 (WebCore::imageFromImageElementNode): Deleted. 27 1 28 2021-12-08 Myles C. Maxfield <mmaxfield@apple.com> 2 29 -
trunk/Source/WebCore/dom/mac/ImageControlsMac.cpp
r286461 r286762 27 27 #include "ImageControlsMac.h" 28 28 29 #include "Chrome.h" 30 #include "ChromeClient.h" 31 #include "ContextMenuController.h" 29 32 #include "ElementInlines.h" 33 #include "EventHandler.h" 30 34 #include "HTMLButtonElement.h" 31 35 #include "HTMLDivElement.h" 36 #include "HTMLImageElement.h" 32 37 #include "HTMLNames.h" 33 38 #include "HTMLStyleElement.h" … … 63 68 } 64 69 65 static RefPtr<HTMLElement> imageControlHost(const Node& node)66 {67 auto host = node.shadowHost();68 if (!is<HTMLElement>(host))69 return nullptr;70 71 RefPtr element { &downcast<HTMLElement>(*host) };72 return hasControls(*element) ? element : nullptr;73 }74 75 70 bool isImageControlsButtonElement(const Node& node) 76 71 { 77 auto host = imageControlHost(node); 78 if (!host) 79 return false; 80 81 if (RefPtr controlRoot = static_cast<TreeScope&>(*host->userAgentShadowRoot()).getElementById(imageControlsButtonIdentifier())) 82 return node.isDescendantOf(*controlRoot); 83 84 return false; 72 return is<Element>(node) && downcast<Element>(node).getIdAttribute() == imageControlsButtonIdentifier(); 85 73 } 86 74 … … 106 94 } 107 95 96 static Image* imageFromImageElementNode(Node& node) 97 { 98 auto* renderer = node.renderer(); 99 if (!is<RenderImage>(renderer)) 100 return nullptr; 101 auto* image = downcast<RenderImage>(*renderer).cachedImage(); 102 if (!image || image->errorOccurred()) 103 return nullptr; 104 return image->imageForRenderer(renderer); 105 } 106 107 bool handleEvent(HTMLElement& element, Event& event) 108 { 109 if (event.type() != eventNames().clickEvent) 110 return false; 111 112 RefPtr frame = element.document().frame(); 113 if (!frame) 114 return false; 115 116 Page* page = element.document().page(); 117 if (!page) 118 return false; 119 120 if (!is<MouseEvent>(event)) 121 return false; 122 123 auto& mouseEvent = downcast<MouseEvent>(event); 124 if (!is<Node>(mouseEvent.target())) 125 return false; 126 auto& node = downcast<Node>(*mouseEvent.target()); 127 128 if (ImageControlsMac::isImageControlsButtonElement(node)) { 129 auto imageElement = node.shadowHost(); 130 if (!imageElement) 131 return false; 132 if (auto* image = imageFromImageElementNode(*imageElement)) { 133 page->chrome().client().handleImageServiceClick(roundedIntPoint(mouseEvent.absoluteLocation()), *image, imageElement->isContentEditable()); 134 event.setDefaultHandled(); 135 return true; 136 } 137 } 138 return false; 139 } 140 108 141 #endif // ENABLE(SERVICE_CONTROLS) 109 142 -
trunk/Source/WebCore/dom/mac/ImageControlsMac.h
r286461 r286762 40 40 bool isImageControlsButtonElement(const Node&); 41 41 void createImageControls(HTMLElement&); 42 bool handleEvent(HTMLElement&, Event&); 42 43 43 44 #endif // ENABLE(SERVICE_CONTROLS) -
trunk/Source/WebCore/html/HTMLButtonElement.cpp
r286447 r286762 37 37 #include <wtf/SetForScope.h> 38 38 #include <wtf/StdLibExtras.h> 39 40 #if ENABLE(SERVICE_CONTROLS) 41 #include "ImageControlsMac.h" 42 #endif 39 43 40 44 namespace WebCore { … … 129 133 void HTMLButtonElement::defaultEventHandler(Event& event) 130 134 { 135 #if ENABLE(SERVICE_CONTROLS) 136 if (ImageControlsMac::handleEvent(*this, event)) 137 return; 138 #endif 131 139 if (event.type() == eventNames().DOMActivateEvent && !isDisabledFormControl()) { 132 140 RefPtr<HTMLFormElement> protectedForm(form()); -
trunk/Source/WebCore/page/ChromeClient.h
r286640 r286762 533 533 virtual void handleSelectionServiceClick(FrameSelection&, const Vector<String>&, const IntPoint&) { } 534 534 virtual bool hasRelevantSelectionServices(bool /*isTextOnly*/) const { return false; } 535 virtual void handleImageServiceClick(const IntPoint&, Image&, bool /*isEditable*/) { } 535 536 #endif 536 537 -
trunk/Source/WebCore/page/ContextMenuController.cpp
r286461 r286762 148 148 } 149 149 150 #if ENABLE(SERVICE_CONTROLS)151 152 static Image* imageFromImageElementNode(Node& node)153 {154 auto* renderer = node.renderer();155 if (!is<RenderImage>(renderer))156 return nullptr;157 auto* image = downcast<RenderImage>(*renderer).cachedImage();158 if (!image || image->errorOccurred())159 return nullptr;160 return image->imageForRenderer(renderer);161 }162 163 #endif164 165 150 std::unique_ptr<ContextMenu> ContextMenuController::maybeCreateContextMenu(Event& event, OptionSet<HitTestRequest::Type> hitType, ContextMenuContext::Type contextType) 166 151 { … … 181 166 182 167 m_context = ContextMenuContext(contextType, result); 183 184 #if ENABLE(SERVICE_CONTROLS)185 if (ImageControlsMac::isImageControlsButtonElement(node)) {186 if (auto* image = imageFromImageElementNode(*result.innerNonSharedNode()))187 m_context.setControlledImage(image);188 189 // FIXME: If we couldn't get the image then we shouldn't try to show the image controls menu for it.190 return nullptr;191 }192 #endif193 168 194 169 return makeUnique<ContextMenu>(); -
trunk/Source/WebKit/ChangeLog
r286757 r286762 1 2021-12-08 Megan Gardner <megan_gardner@apple.com> 2 3 Show correct content menu for images services chevron. 4 https://bugs.webkit.org/show_bug.cgi?id=233970 5 6 Reviewed by Tim Horton. 7 8 Add support for showing the correct context menu for image services. 9 Since this is internal only and can never be affected by web content, we bypass 10 the web content round trip and directly message the UIProcess about showing 11 a context menu for images. And because it would be bizarre if the web content 12 could prevent a menu from popping up on a button they have no control over. 13 14 * Shared/ContextMenuContextData.cpp: 15 (WebKit::ContextMenuContextData::ContextMenuContextData): 16 (WebKit::m_selectionIsEditable): 17 (WebKit::ContextMenuContextData::setImage): 18 (WebKit::ContextMenuContextData::controlledDataIsEditable const): 19 * Shared/ContextMenuContextData.h: 20 (WebKit::ContextMenuContextData::webHitTestResultData): 21 (WebKit::ContextMenuContextData::webHitTestResultData const): 22 * UIProcess/WebContextMenuProxy.cpp: 23 (WebKit::WebContextMenuProxy::show): 24 * UIProcess/WebPageProxy.cpp: 25 (WebKit::WebPageProxy::contextMenuItemSelected): 26 * UIProcess/mac/WebContextMenuProxyMac.mm: 27 (WebKit::WebContextMenuProxyMac::getShareMenuItem): 28 (WebKit::WebContextMenuProxyMac::getContextMenuFromItems): 29 (WebKit::WebContextMenuProxyMac::useContextMenuItems): 30 * UIProcess/mac/WebPageProxyMac.mm: 31 (WebKit::WebPageProxy::handleContextMenuQuickLookImage): 32 * WebProcess/WebCoreSupport/WebChromeClient.cpp: 33 (WebKit::WebChromeClient::handleImageServiceClick): 34 * WebProcess/WebCoreSupport/WebChromeClient.h: 35 * WebProcess/WebPage/WebPage.h: 36 * WebProcess/WebPage/mac/WebPageMac.mm: 37 (WebKit::WebPage::handleImageServiceClick): 38 1 39 2021-12-08 Kyle Piddington <kpiddington@apple.com> 2 40 -
trunk/Source/WebKit/Shared/ContextMenuContextData.cpp
r276181 r286762 52 52 , m_menuLocation(menuLocation) 53 53 , m_menuItems(menuItems) 54 , m_webHitTestResultData( context.hitTestResult(), true)54 , m_webHitTestResultData({ context.hitTestResult(), true }) 55 55 , m_selectedText(context.selectedText()) 56 56 #if ENABLE(SERVICE_CONTROLS) … … 62 62 if (!image) 63 63 return; 64 65 setImage(image); 66 #endif 67 } 64 68 69 #if ENABLE(SERVICE_CONTROLS) 70 ContextMenuContextData::ContextMenuContextData(const WebCore::IntPoint& menuLocation, WebCore::Image& image, bool isEditable) 71 : m_type(Type::ServicesMenu) 72 , m_menuLocation(menuLocation) 73 , m_selectionIsEditable(isEditable) 74 { 75 setImage(&image); 76 } 77 78 void ContextMenuContextData::setImage(WebCore::Image* image) 79 { 65 80 // FIXME: figure out the rounding strategy for ShareableBitmap. 66 81 m_controlledImage = ShareableBitmap::createShareable(IntSize(image->size()), { }); … … 69 84 return; 70 85 graphicsContext->drawImage(*image, IntPoint()); 86 } 71 87 #endif 72 }73 88 74 89 void ContextMenuContextData::encode(IPC::Encoder& encoder) const … … 130 145 bool ContextMenuContextData::controlledDataIsEditable() const 131 146 { 132 if (!m_controlledSelectionData.isEmpty() )147 if (!m_controlledSelectionData.isEmpty() || m_controlledImage) 133 148 return m_selectionIsEditable; 134 135 if (m_controlledImage)136 return m_webHitTestResultData.isContentEditable;137 149 138 150 return false; -
trunk/Source/WebKit/Shared/ContextMenuContextData.h
r276181 r286762 52 52 const Vector<WebKit::WebContextMenuItemData>& menuItems() const { return m_menuItems; } 53 53 54 WebHitTestResultData& webHitTestResultData() { return m_webHitTestResultData; } 55 const WebHitTestResultData& webHitTestResultData() const { return m_webHitTestResultData; } 54 const std::optional<WebHitTestResultData>& webHitTestResultData() const { return m_webHitTestResultData; } 56 55 const String& selectedText() const { return m_selectedText; } 57 56 … … 65 64 { 66 65 } 66 67 ContextMenuContextData(const WebCore::IntPoint& menuLocation, WebCore::Image&, bool isEditable); 67 68 68 69 ShareableBitmap* controlledImage() const { return m_controlledImage.get(); } … … 83 84 Vector<WebKit::WebContextMenuItemData> m_menuItems; 84 85 85 WebHitTestResultDatam_webHitTestResultData;86 std::optional<WebHitTestResultData> m_webHitTestResultData; 86 87 String m_selectedText; 87 88 88 89 #if ENABLE(SERVICE_CONTROLS) 90 void setImage(WebCore::Image*); 91 89 92 RefPtr<ShareableBitmap> m_controlledImage; 90 93 Vector<uint8_t> m_controlledSelectionData; -
trunk/Source/WebKit/UIProcess/WebContextMenuProxy.cpp
r284142 r286762 54 54 void WebContextMenuProxy::show() 55 55 { 56 ASSERT(m_context.webHitTestResultData()); 57 56 58 m_contextMenuListener = WebContextMenuListenerProxy::create(*this); 57 page()->contextMenuClient().getContextMenuFromProposedMenu(*page(), proposedItems(), *m_contextMenuListener, m_context.webHitTestResultData() , page()->process().transformHandlesToObjects(m_userData.object()).get());59 page()->contextMenuClient().getContextMenuFromProposedMenu(*page(), proposedItems(), *m_contextMenuListener, m_context.webHitTestResultData().value(), page()->process().transformHandlesToObjects(m_userData.object()).get()); 58 60 } 59 61 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r286751 r286762 6931 6931 }; 6932 6932 std::optional<DownloadInfo> downloadInfo; 6933 6934 ASSERT(m_activeContextMenuContextData.webHitTestResultData()); 6935 6936 auto hitTestData = m_activeContextMenuContextData.webHitTestResultData().value(); 6933 6937 6934 6938 switch (item.action()) { … … 6969 6973 6970 6974 case ContextMenuItemTagDownloadImageToDisk: 6971 downloadInfo = { { m_activeContextMenuContextData.webHitTestResultData().absoluteImageURL, { } }};6975 downloadInfo = { { hitTestData.absoluteImageURL, { } } }; 6972 6976 break; 6973 6977 6974 6978 case ContextMenuItemTagDownloadLinkToDisk: { 6975 auto& hitTestResult = m_activeContextMenuContextData.webHitTestResultData(); 6976 downloadInfo = {{ hitTestResult.absoluteLinkURL, hitTestResult.linkSuggestedFilename }}; 6979 downloadInfo = { { hitTestData.absoluteLinkURL, hitTestData.linkSuggestedFilename } }; 6977 6980 break; 6978 6981 } 6979 6982 6980 6983 case ContextMenuItemTagDownloadMediaToDisk: 6981 downloadInfo = { { m_activeContextMenuContextData.webHitTestResultData().absoluteMediaURL, { } }};6984 downloadInfo = { { hitTestData.absoluteMediaURL, { } } }; 6982 6985 break; 6983 6986 -
trunk/Source/WebKit/UIProcess/mac/WebContextMenuProxyMac.mm
r284142 r286762 310 310 void WebContextMenuProxyMac::getShareMenuItem(CompletionHandler<void(NSMenuItem *)>&& completionHandler) 311 311 { 312 const WebHitTestResultData& hitTestData = m_context.webHitTestResultData(); 312 ASSERT(m_context.webHitTestResultData()); 313 auto hitTestData = m_context.webHitTestResultData().value(); 313 314 314 315 auto items = adoptNS([[NSMutableArray alloc] init]); … … 534 535 #endif 535 536 536 auto imageURL = URL { URL { }, m_context.webHitTestResultData().absoluteImageURL }; 537 auto imageBitmap = m_context.webHitTestResultData().imageBitmap; 537 ASSERT(m_context.webHitTestResultData()); 538 auto hitTestData = m_context.webHitTestResultData().value(); 539 540 auto imageURL = URL { URL { }, hitTestData.absoluteImageURL }; 541 auto imageBitmap = hitTestData.imageBitmap; 538 542 539 543 auto sparseMenuItems = retainPtr([NSPointerArray strongObjectsPointerArray]); … … 716 720 return; 717 721 } 718 719 page()->contextMenuClient().menuFromProposedMenu(*page(), menu, m_context.webHitTestResultData(), m_userData.object(), WTFMove(menuFromProposedMenu)); 722 723 ASSERT(m_context.webHitTestResultData()); 724 page()->contextMenuClient().menuFromProposedMenu(*page(), menu, m_context.webHitTestResultData().value(), m_userData.object(), WTFMove(menuFromProposedMenu)); 720 725 }); 721 726 } -
trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
r286705 r286762 752 752 void WebPageProxy::handleContextMenuQuickLookImage(QuickLookPreviewActivity activity) 753 753 { 754 auto& result = m_activeContextMenuContextData.webHitTestResultData(); 754 ASSERT(m_activeContextMenuContextData.webHitTestResultData()); 755 756 auto result = m_activeContextMenuContextData.webHitTestResultData().value(); 755 757 if (!result.imageBitmap) 756 758 return; -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp
r286640 r286762 1348 1348 } 1349 1349 1350 void WebChromeClient::handleImageServiceClick(const IntPoint& point, Image& image, bool isEditable) 1351 { 1352 m_page.handleImageServiceClick(point, image, isEditable); 1353 } 1354 1350 1355 #endif 1351 1356 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h
r286640 r286762 382 382 void handleSelectionServiceClick(WebCore::FrameSelection&, const Vector<String>& telephoneNumbers, const WebCore::IntPoint&) final; 383 383 bool hasRelevantSelectionServices(bool isTextOnly) const final; 384 void handleImageServiceClick(const WebCore::IntPoint&, WebCore::Image&, bool isEditable) final; 384 385 #endif 385 386 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r286705 r286762 1204 1204 void handleTelephoneNumberClick(const String& number, const WebCore::IntPoint&); 1205 1205 void handleSelectionServiceClick(WebCore::FrameSelection&, const Vector<String>& telephoneNumbers, const WebCore::IntPoint&); 1206 void handleImageServiceClick(const WebCore::IntPoint&, WebCore::Image&, bool isEditable); 1206 1207 #endif 1207 1208 -
trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
r286097 r286762 829 829 } 830 830 831 void WebPage::handleImageServiceClick(const IntPoint& point, Image& image, bool isEditable) 832 { 833 send(Messages::WebPageProxy::ShowContextMenu(ContextMenuContextData(point, image, isEditable), UserData())); 834 } 835 831 836 #endif 832 837
Note:
See TracChangeset
for help on using the changeset viewer.