Title: [289694] trunk
Revision
289694
Author
[email protected]
Date
2022-02-12 07:42:10 -0800 (Sat, 12 Feb 2022)

Log Message

Invoke mouse hover delegate callback on iOS
https://bugs.webkit.org/show_bug.cgi?id=233018

Patch by Kevin Turner <[email protected]> on 2022-02-12
Reviewed by Tim Horton.

Source/WebKit:

Allow mouseDidMoveOverElement: callbacks on iOS with pointer support.

Test: iOSMouseSupport.MouseDidMoveOverElement

* Shared/API/Cocoa/_WKHitTestResult.h:
* Shared/API/Cocoa/_WKHitTestResult.mm:
* Shared/API/Cocoa/_WKHitTestResultInternal.h:
* Shared/Cocoa/APIObject.mm:
(API::Object::newObject):
* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/Cocoa/UIDelegate.h:
* UIProcess/Cocoa/UIDelegate.mm:
(WebKit::UIDelegate::setDelegate):
(WebKit::UIDelegate::UIClient::mouseDidMoveOverElement):
Convert the modifier flags from the hover event to UIKeyModifierFlags if not on macOS.

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm:
(-[MouseSupportUIDelegate _webView:mouseDidMoveOverElement:withFlags:userInfo:]):
(-[MouseSupportUIDelegate setMouseDidMoveOverElementHandler:]):
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (289693 => 289694)


--- trunk/Source/WebKit/ChangeLog	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/ChangeLog	2022-02-12 15:42:10 UTC (rev 289694)
@@ -1,3 +1,26 @@
+2022-02-12  Kevin Turner  <[email protected]>
+
+        Invoke mouse hover delegate callback on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=233018
+
+        Reviewed by Tim Horton.
+
+        Allow mouseDidMoveOverElement: callbacks on iOS with pointer support.
+
+        Test: iOSMouseSupport.MouseDidMoveOverElement 
+
+        * Shared/API/Cocoa/_WKHitTestResult.h:
+        * Shared/API/Cocoa/_WKHitTestResult.mm:
+        * Shared/API/Cocoa/_WKHitTestResultInternal.h:
+        * Shared/Cocoa/APIObject.mm:
+        (API::Object::newObject):
+        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+        * UIProcess/Cocoa/UIDelegate.h:
+        * UIProcess/Cocoa/UIDelegate.mm:
+        (WebKit::UIDelegate::setDelegate):
+        (WebKit::UIDelegate::UIClient::mouseDidMoveOverElement):
+        Convert the modifier flags from the hover event to UIKeyModifierFlags if not on macOS.
+
 2022-02-11  Megan Gardner  <[email protected]>
 
         Implement Reveal methods

Modified: trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResult.h (289693 => 289694)


--- trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResult.h	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResult.h	2022-02-12 15:42:10 UTC (rev 289694)
@@ -25,11 +25,11 @@
 
 #import <WebKit/WKFoundation.h>
 
-#if !TARGET_OS_IPHONE
+#if TARGET_OS_OSX || TARGET_OS_IOS
 
 #import <Foundation/Foundation.h>
 
-WK_CLASS_AVAILABLE(macos(10.12))
+WK_CLASS_AVAILABLE(macos(10.12), ios(WK_IOS_TBA))
 @interface _WKHitTestResult : NSObject <NSCopying>
 
 @property (nonatomic, readonly, copy) NSURL *absoluteImageURL;
@@ -47,4 +47,4 @@
 
 @end
 
-#endif // !TARGET_OS_IPHONE
+#endif

Modified: trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResult.mm (289693 => 289694)


--- trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResult.mm	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResult.mm	2022-02-12 15:42:10 UTC (rev 289694)
@@ -26,7 +26,7 @@
 #import "config.h"
 #import "_WKHitTestResultInternal.h"
 
-#if PLATFORM(MAC)
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
 
 #import <WebCore/WebCoreObjCExtras.h>
 

Modified: trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResultInternal.h (289693 => 289694)


--- trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResultInternal.h	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/Shared/API/Cocoa/_WKHitTestResultInternal.h	2022-02-12 15:42:10 UTC (rev 289694)
@@ -25,7 +25,7 @@
 
 #import "_WKHitTestResult.h"
 
-#if PLATFORM(MAC)
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
 
 #import "APIHitTestResult.h"
 #import "WKObject.h"

Modified: trunk/Source/WebKit/Shared/Cocoa/APIObject.mm (289693 => 289694)


--- trunk/Source/WebKit/Shared/Cocoa/APIObject.mm	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/Shared/Cocoa/APIObject.mm	2022-02-12 15:42:10 UTC (rev 289694)
@@ -260,7 +260,7 @@
         wrapper = [WKHTTPCookieStore alloc];
         break;
 
-#if PLATFORM(MAC)
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
     case Type::HitTestResult:
         wrapper = [_WKHitTestResult alloc];
         break;

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (289693 => 289694)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2022-02-12 15:42:10 UTC (rev 289694)
@@ -222,6 +222,7 @@
 - (void)_webView:(WKWebView *)webView contextMenuWillPresentForElement:(WKContextMenuElementInfo *)elementInfo WK_API_AVAILABLE(ios(13.0));
 - (UIViewController *)_webView:(WKWebView *)webView contextMenuContentPreviewForElement:(WKContextMenuElementInfo *)elementInfo WK_API_AVAILABLE(ios(15.0));
 - (void)_webView:(WKWebView *)webView contextMenuDidEndForElement:(WKContextMenuElementInfo *)elementInfo WK_API_AVAILABLE(ios(13.0));
+- (void)_webView:(WKWebView *)webview mouseDidMoveOverElement:(_WKHitTestResult *)hitTestResult withFlags:(UIKeyModifierFlags)flags userInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(ios(WK_IOS_TBA));
 #endif
 
 - (BOOL)_webView:(WKWebView *)webView showCustomSheetForElement:(_WKActivatedElementInfo *)element WK_API_DEPRECATED_WITH_REPLACEMENT("_webView:contextMenuConfigurationForElement:completionHandler:", ios(10.0, 13.0));

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h (289693 => 289694)


--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h	2022-02-12 15:42:10 UTC (rev 289694)
@@ -108,6 +108,9 @@
         void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, CompletionHandler<void(bool allowed)>&&) final;
         void requestCookieConsent(CompletionHandler<void(WebCore::CookieConsentDecisionResult)>&&) final;
         void decidePolicyForModalContainer(OptionSet<WebCore::ModalContainerControlType>, CompletionHandler<void(WebCore::ModalContainerDecision)>&&) final;
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
+        void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData&, OptionSet<WebEvent::Modifier>, API::Object*);
+#endif
 
 #if PLATFORM(MAC)
         void showPage(WebPageProxy*) final;
@@ -127,7 +130,6 @@
         void drawHeader(WebPageProxy&, WebFrameProxy&, WebCore::FloatRect&&) final;
         void drawFooter(WebPageProxy&, WebFrameProxy&, WebCore::FloatRect&&) final;
 
-        void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData&, OptionSet<WebEvent::Modifier>, API::Object*);
         void didClickAutoFillButton(WebPageProxy&, API::Object*) final;
         void toolbarsAreVisible(WebPageProxy&, Function<void(bool)>&&) final;
         bool runOpenPanel(WebPageProxy&, WebFrameProxy*, FrameInfoData&&, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) final;
@@ -201,6 +203,9 @@
         bool webViewDidResignInputElementStrongPasswordAppearanceWithUserInfo : 1;
         bool webViewTakeFocus : 1;
         bool webViewHandleAutoplayEventWithFlags : 1;
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
+        bool webViewMouseDidMoveOverElementWithFlagsUserInfo : 1;
+#endif
 #if PLATFORM(MAC)
         bool showWebView : 1;
         bool focusWebView : 1;
@@ -217,7 +222,6 @@
         bool webViewDrawHeaderInRectForPageWithTitleURL : 1;
         bool webViewDrawFooterInRectForPageWithTitleURL : 1;
         bool webViewGetWindowFrameWithCompletionHandler : 1;
-        bool webViewMouseDidMoveOverElementWithFlagsUserInfo : 1;
         bool webViewGetToolbarsAreVisibleWithCompletionHandler : 1;
         bool webViewDidExceedBackgroundResourceLimitWhileInForeground : 1;
         bool webViewSaveDataToFileSuggestedFilenameMimeTypeOriginatingURL : 1;

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (289693 => 289694)


--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm	2022-02-12 15:42:10 UTC (rev 289694)
@@ -69,6 +69,7 @@
 #if PLATFORM(IOS_FAMILY)
 #import "TapHandlingResult.h"
 #import "WKWebViewIOS.h"
+#import "WebIOSEventFactory.h"
 #endif
 
 #import <pal/cocoa/AVFoundationSoftLink.h>
@@ -117,6 +118,9 @@
     m_delegateMethods.webViewDidResignInputElementStrongPasswordAppearanceWithUserInfo = [delegate respondsToSelector:@selector(_webView:didResignInputElementStrongPasswordAppearanceWithUserInfo:)];
     m_delegateMethods.webViewTakeFocus = [delegate respondsToSelector:@selector(_webView:takeFocus:)];
     m_delegateMethods.webViewHandleAutoplayEventWithFlags = [delegate respondsToSelector:@selector(_webView:handleAutoplayEvent:withFlags:)];
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
+    m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo = [delegate respondsToSelector:@selector(_webView:mouseDidMoveOverElement:withFlags:userInfo:)];
+#endif
 
 #if PLATFORM(MAC)
     m_delegateMethods.showWebView = [delegate respondsToSelector:@selector(_showWebView:)];
@@ -135,7 +139,6 @@
     m_delegateMethods.webViewDrawFooterInRectForPageWithTitleURL = [delegate respondsToSelector:@selector(_webView:drawFooterInRect:forPageWithTitle:URL:)];
     m_delegateMethods.webViewHeaderHeight = [delegate respondsToSelector:@selector(_webViewHeaderHeight:)];
     m_delegateMethods.webViewFooterHeight = [delegate respondsToSelector:@selector(_webViewFooterHeight:)];
-    m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo = [delegate respondsToSelector:@selector(_webView:mouseDidMoveOverElement:withFlags:userInfo:)];
     m_delegateMethods.webViewDidExceedBackgroundResourceLimitWhileInForeground = [delegate respondsToSelector:@selector(_webView:didExceedBackgroundResourceLimitWhileInForeground:)];
     m_delegateMethods.webViewSaveDataToFileSuggestedFilenameMimeTypeOriginatingURL = [delegate respondsToSelector:@selector(_webView:saveDataToFile:suggestedFilename:mimeType:originatingURL:)];
     m_delegateMethods.webViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:)];
@@ -258,6 +261,29 @@
 {
 }
 
+#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
+void UIDelegate::UIClient::mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, OptionSet<WebEvent::Modifier> modifiers, API::Object* userInfo)
+{
+    if (!m_uiDelegate)
+        return;
+
+    if (!m_uiDelegate->m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo)
+        return;
+
+    auto delegate = m_uiDelegate->m_delegate.get();
+    if (!delegate)
+        return;
+
+    auto apiHitTestResult = API::HitTestResult::create(data);
+#if PLATFORM(MAC)
+    auto modifierFlags = WebEventFactory::toNSEventModifierFlags(modifiers);
+#else
+    auto modifierFlags = WebIOSEventFactory::toUIKeyModifierFlags(modifiers);
+#endif
+    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate->m_webView.get().get() mouseDidMoveOverElement:wrapper(apiHitTestResult.get()) withFlags:modifierFlags userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
+}
+#endif
+
 void UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy&, WebCore::WindowFeatures&& windowFeatures, Ref<API::NavigationAction>&& navigationAction, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler)
 {
     if (!m_uiDelegate)
@@ -926,22 +952,6 @@
     }).get()];
 }
 
-void UIDelegate::UIClient::mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, OptionSet<WebEvent::Modifier> modifiers, API::Object* userInfo)
-{
-    if (!m_uiDelegate)
-        return;
-
-    if (!m_uiDelegate->m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo)
-        return;
-
-    auto delegate = m_uiDelegate->m_delegate.get();
-    if (!delegate)
-        return;
-
-    auto apiHitTestResult = API::HitTestResult::create(data);
-    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate->m_webView.get().get() mouseDidMoveOverElement:wrapper(apiHitTestResult.get()) withFlags:WebEventFactory::toNSEventModifierFlags(modifiers) userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
-}
-
 void UIDelegate::UIClient::toolbarsAreVisible(WebPageProxy&, Function<void(bool)>&& completionHandler)
 {
     if (!m_uiDelegate)

Modified: trunk/Tools/ChangeLog (289693 => 289694)


--- trunk/Tools/ChangeLog	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Tools/ChangeLog	2022-02-12 15:42:10 UTC (rev 289694)
@@ -1,3 +1,15 @@
+2022-02-12  Kevin Turner  <[email protected]>
+
+        Invoke mouse hover delegate callback on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=233018
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm:
+        (-[MouseSupportUIDelegate _webView:mouseDidMoveOverElement:withFlags:userInfo:]):
+        (-[MouseSupportUIDelegate setMouseDidMoveOverElementHandler:]):
+        (TEST):
+
 2022-02-12  Commit Queue  <[email protected]>
 
         Unreviewed, reverting r289687.

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm (289693 => 289694)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm	2022-02-12 15:34:57 UTC (rev 289693)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm	2022-02-12 15:42:10 UTC (rev 289694)
@@ -36,9 +36,30 @@
 #import <WebKit/WKWebViewPrivateForTesting.h>
 #import <WebKit/WKWebpagePreferencesPrivate.h>
 #import <WebKit/WebKit.h>
+#import <wtf/BlockPtr.h>
 #import <wtf/MonotonicTime.h>
 #import <wtf/RetainPtr.h>
 
+@interface MouseSupportUIDelegate : NSObject <WKUIDelegatePrivate>
+@end
+
+@implementation MouseSupportUIDelegate {
+    BlockPtr<void(_WKHitTestResult *)> _mouseDidMoveOverElementHandler;
+}
+
+- (void)_webView:(WKWebView *)webview mouseDidMoveOverElement:(_WKHitTestResult *)hitTestResult withFlags:(UIKeyModifierFlags)flags userInfo:(id <NSSecureCoding>)userInfo
+{
+    if (_mouseDidMoveOverElementHandler)
+        _mouseDidMoveOverElementHandler(hitTestResult);
+}
+
+- (void)setMouseDidMoveOverElementHandler:(void(^)(_WKHitTestResult *))handler
+{
+    _mouseDidMoveOverElementHandler = handler;
+}
+
+@end
+
 @interface WKMouseGestureRecognizer : UIGestureRecognizer
 - (void)_hoverEntered:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
 - (void)_hoverExited:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
@@ -304,6 +325,37 @@
     EXPECT_FALSE(wasClicked);
 }
 
+TEST(iOSMouseSupport, MouseDidMoveOverElement)
+{
+    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
+    auto delegate = adoptNS([MouseSupportUIDelegate new]);
+
+    __block bool mouseDidMoveOverElement = false;
+    __block RetainPtr<_WKHitTestResult> hitTestResult;
+    [delegate setMouseDidMoveOverElementHandler:^(_WKHitTestResult *result) {
+        hitTestResult = result;
+        mouseDidMoveOverElement = true;
+    }];
+
+    [webView synchronouslyLoadTestPageNamed:@"simple"];
+    [webView setUIDelegate:delegate.get()];
+
+    auto contentView = [webView wkContentView];
+    auto gesture = mouseGesture(contentView);
+    auto touch = adoptNS([[WKTestingTouch alloc] init]);
+    auto touchSet = RetainPtr { [NSSet setWithObject:touch.get()] };
+    auto event = adoptNS([[WKTestingEvent alloc] init]);
+
+    [gesture _hoverEntered:touchSet.get() withEvent:event.get()];
+    [contentView mouseGestureRecognizerChanged:gesture];
+
+    TestWebKitAPI::Util::run(&mouseDidMoveOverElement);
+
+    EXPECT_TRUE(mouseDidMoveOverElement);
+    EXPECT_NOT_NULL(hitTestResult);
+}
+
 #if ENABLE(IOS_TOUCH_EVENTS)
 
 TEST(iOSMouseSupport, WebsiteMouseEventPolicies)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to