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)