Title: [221164] trunk
Revision
221164
Author
achristen...@apple.com
Date
2017-08-24 15:10:57 -0700 (Thu, 24 Aug 2017)

Log Message

Add WKUIDelegatePrivate callback corresponding to PageUIClient's didNotHandleWheelEvent
https://bugs.webkit.org/show_bug.cgi?id=175957
<rdar://problem/29270035>

Reviewed by Geoffrey Garen.

Source/WebKit:

* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/Cocoa/UIDelegate.h:
* UIProcess/Cocoa/UIDelegate.mm:
(WebKit::UIDelegate::setDelegate):
(WebKit::UIDelegate::UIClient::didNotHandleWheelEvent):

Tools:

* TestWebKitAPI/Tests/WebKit2Cocoa/UIDelegate.mm:
(synthesizeWheelEvents):
(-[WheelDelegate _webView:didNotHandleWheelEvent:]):
(-[WheelDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (221163 => 221164)


--- trunk/Source/WebKit/ChangeLog	2017-08-24 21:53:12 UTC (rev 221163)
+++ trunk/Source/WebKit/ChangeLog	2017-08-24 22:10:57 UTC (rev 221164)
@@ -1,3 +1,17 @@
+2017-08-24  Alex Christensen  <achristen...@webkit.org>
+
+        Add WKUIDelegatePrivate callback corresponding to PageUIClient's didNotHandleWheelEvent
+        https://bugs.webkit.org/show_bug.cgi?id=175957
+        <rdar://problem/29270035>
+
+        Reviewed by Geoffrey Garen.
+
+        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+        * UIProcess/Cocoa/UIDelegate.h:
+        * UIProcess/Cocoa/UIDelegate.mm:
+        (WebKit::UIDelegate::setDelegate):
+        (WebKit::UIDelegate::UIClient::didNotHandleWheelEvent):
+
 2017-08-24  Tim Horton  <timothy_hor...@apple.com>
 
         Overflow scroll views are inset to avoid safe areas even if the parent view is not

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2017-08-24 21:53:12 UTC (rev 221163)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2017-08-24 22:10:57 UTC (rev 221164)
@@ -129,6 +129,7 @@
 - (void)_focusWebView:(WKWebView *)webView WK_API_AVAILABLE(macosx(WK_MAC_TBA));
 - (void)_unfocusWebView:(WKWebView *)webView WK_API_AVAILABLE(macosx(WK_MAC_TBA));
 - (void)_webView:(WKWebView *)webView takeFocus:(_WKFocusDirection)direction WK_API_AVAILABLE(macosx(WK_MAC_TBA));
+- (void)_webView:(WKWebView *)webView didNotHandleWheelEvent:(NSEvent *)event WK_API_AVAILABLE(macosx(WK_MAC_TBA));
 - (NSMenu *)_webView:(WKWebView *)webView contextMenu:(NSMenu *)menu forElement:(_WKContextMenuElementInfo *)element WK_API_AVAILABLE(macosx(10.12));
 - (NSMenu *)_webView:(WKWebView *)webView contextMenu:(NSMenu *)menu forElement:(_WKContextMenuElementInfo *)element userInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macosx(10.12));
 #endif

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h (221163 => 221164)


--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h	2017-08-24 21:53:12 UTC (rev 221163)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h	2017-08-24 22:10:57 UTC (rev 221164)
@@ -100,6 +100,7 @@
         void takeFocus(WebPageProxy*, WKFocusDirection) final;
         void focus(WebPageProxy*) final;
         void unfocus(WebPageProxy*) final;
+        void didNotHandleWheelEvent(WebKit::WebPageProxy*, const WebKit::NativeWebWheelEvent&) final;
         bool runOpenPanel(WebPageProxy*, WebFrameProxy*, const WebCore::SecurityOriginData&, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) final;
 #endif
         bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionRequestProxy&) final;
@@ -144,6 +145,7 @@
         bool focusWebView : 1;
         bool unfocusWebView : 1;
         bool webViewTakeFocus : 1;
+        bool webViewDidNotHandleWheelEvent : 1;
         bool webViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler : 1;
 #endif
         bool webViewDecideDatabaseQuotaForSecurityOriginCurrentQuotaCurrentOriginUsageCurrentDatabaseUsageExpectedUsageDecisionHandler : 1;

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (221163 => 221164)


--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm	2017-08-24 21:53:12 UTC (rev 221163)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm	2017-08-24 22:10:57 UTC (rev 221164)
@@ -30,6 +30,7 @@
 
 #import "APIFrameInfo.h"
 #import "CompletionHandlerCallChecker.h"
+#import "NativeWebWheelEvent.h"
 #import "NavigationActionData.h"
 #import "UserMediaPermissionCheckProxy.h"
 #import "UserMediaPermissionRequestProxy.h"
@@ -104,6 +105,7 @@
     m_delegateMethods.focusWebView = [delegate respondsToSelector:@selector(_focusWebView:)];
     m_delegateMethods.unfocusWebView = [delegate respondsToSelector:@selector(_unfocusWebView:)];
     m_delegateMethods.webViewTakeFocus = [delegate respondsToSelector:@selector(_webView:takeFocus:)];
+    m_delegateMethods.webViewDidNotHandleWheelEvent = [delegate respondsToSelector:@selector(_webView:didNotHandleWheelEvent:)];
     m_delegateMethods.webViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:)];
 #endif
 
@@ -423,6 +425,18 @@
     [(id <WKUIDelegatePrivate>)delegate _unfocusWebView:m_uiDelegate.m_webView];
 }
 
+void UIDelegate::UIClient::didNotHandleWheelEvent(WebKit::WebPageProxy*, const WebKit::NativeWebWheelEvent& event)
+{
+    if (!m_uiDelegate.m_delegateMethods.webViewDidNotHandleWheelEvent)
+        return;
+    
+    auto delegate = m_uiDelegate.m_delegate.get();
+    if (!delegate)
+        return;
+    
+    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView didNotHandleWheelEvent:event.nativeEvent()];
+}
+
 void UIDelegate::UIClient::showPage(WebPageProxy*)
 {
     if (!m_uiDelegate.m_delegateMethods.showWebView)

Modified: trunk/Tools/ChangeLog (221163 => 221164)


--- trunk/Tools/ChangeLog	2017-08-24 21:53:12 UTC (rev 221163)
+++ trunk/Tools/ChangeLog	2017-08-24 22:10:57 UTC (rev 221164)
@@ -1,3 +1,17 @@
+2017-08-24  Alex Christensen  <achristen...@webkit.org>
+
+        Add WKUIDelegatePrivate callback corresponding to PageUIClient's didNotHandleWheelEvent
+        https://bugs.webkit.org/show_bug.cgi?id=175957
+        <rdar://problem/29270035>
+
+        Reviewed by Geoffrey Garen.
+
+        * TestWebKitAPI/Tests/WebKit2Cocoa/UIDelegate.mm:
+        (synthesizeWheelEvents):
+        (-[WheelDelegate _webView:didNotHandleWheelEvent:]):
+        (-[WheelDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+        (TEST):
+
 2017-08-24  Tim Horton  <timothy_hor...@apple.com>
 
         Layout size override changes during in-flight animated resize are dropped on the floor forever

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UIDelegate.mm (221163 => 221164)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UIDelegate.mm	2017-08-24 21:53:12 UTC (rev 221163)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UIDelegate.mm	2017-08-24 22:10:57 UTC (rev 221164)
@@ -136,6 +136,45 @@
     ASSERT_EQ(takenDirection, WKFocusDirectionBackward);
 }
 
+static void synthesizeWheelEvents(NSView *view, int x, int y)
+{
+    RetainPtr<CGEventRef> cgScrollEvent = adoptCF(CGEventCreateScrollWheelEvent(nullptr, kCGScrollEventUnitLine, 2, y, x));
+    NSEvent* event = [NSEvent eventWithCGEvent:cgScrollEvent.get()];
+    [view scrollWheel:event];
+    
+    // Wheel events get coalesced sometimes. Make more events until one is not handled.
+    dispatch_async(dispatch_get_main_queue(), ^ {
+        synthesizeWheelEvents(view, x, y);
+    });
+}
+
+@interface WheelDelegate : NSObject <WKUIDelegatePrivate>
+@end
+
+@implementation WheelDelegate
+
+- (void)_webView:(WKWebView *)webView didNotHandleWheelEvent:(NSEvent *)event
+{
+    done = true;
+}
+
+- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
+{
+    completionHandler();
+    synthesizeWheelEvents(webView, 1, 1);
+}
+
+@end
+
+TEST(WebKit2, DidNotHandleWheelEvent)
+{
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600)]);
+    auto delegate = adoptNS([[WheelDelegate alloc] init]);
+    [webView setUIDelegate:delegate.get()];
+    [webView loadHTMLString:@"<body _onload_='alert(\"ready\")' _onwheel_='()=>{}' style='overflow:hidden; height:10000vh;'></body>" baseURL:[NSURL URLWithString:@"http://example.com/"]];
+    TestWebKitAPI::Util::run(&done);
+}
+
 #endif // PLATFORM(MAC)
 
 #endif // WK_API_ENABLED
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to