- 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