Title: [197866] trunk/Source/WebKit2
Revision
197866
Author
[email protected]
Date
2016-03-09 11:29:29 -0800 (Wed, 09 Mar 2016)

Log Message

Add two finger tap on links.
https://bugs.webkit.org/show_bug.cgi?id=155205
rdar://problem/22937516

Reviewed by Sam Weinig.

Adds two finger tap gesture recognizer. When performed
on a link, it calls the delegate.

* Platform/spi/ios/UIKitSPI.h:
* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView setupInteraction]):
(-[WKContentView cleanupInteraction]):
(-[WKContentView _removeDefaultGestureRecognizers]):
(-[WKContentView _addDefaultGestureRecognizers]):
(-[WKContentView _twoFingerSingleTapGestureRecognized:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::handleTwoFingerTapAtPoint):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::handleTwoFingerTapAtPoint):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (197865 => 197866)


--- trunk/Source/WebKit2/ChangeLog	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/ChangeLog	2016-03-09 19:29:29 UTC (rev 197866)
@@ -1,3 +1,31 @@
+2016-03-09  Enrica Casucci  <[email protected]>
+
+        Add two finger tap on links.
+        https://bugs.webkit.org/show_bug.cgi?id=155205
+        rdar://problem/22937516
+
+        Reviewed by Sam Weinig.
+
+        Adds two finger tap gesture recognizer. When performed
+        on a link, it calls the delegate.
+
+        * Platform/spi/ios/UIKitSPI.h:
+        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView setupInteraction]):
+        (-[WKContentView cleanupInteraction]):
+        (-[WKContentView _removeDefaultGestureRecognizers]):
+        (-[WKContentView _addDefaultGestureRecognizers]):
+        (-[WKContentView _twoFingerSingleTapGestureRecognized:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::handleTwoFingerTapAtPoint):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::handleTwoFingerTapAtPoint):
+
 2016-03-09  Alex Christensen  <[email protected]>
 
         Always call NSURLSession completion handlers

Modified: trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h (197865 => 197866)


--- trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h	2016-03-09 19:29:29 UTC (rev 197866)
@@ -316,6 +316,8 @@
 
 @interface UITapGestureRecognizer ()
 @property (nonatomic, readonly) CGPoint location;
+@property (nonatomic) CGFloat allowableMovement;
+@property (nonatomic, readonly) CGPoint centroid;
 @end
 
 @class WebEvent;

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (197865 => 197866)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2016-03-09 19:29:29 UTC (rev 197866)
@@ -72,6 +72,7 @@
 - (void)_webView:(WKWebView *)webView didDismissPreviewViewController:(UIViewController *)previewedViewController committing:(BOOL)committing WK_AVAILABLE(NA, 9_0);
 - (void)_webView:(WKWebView *)webView didDismissPreviewViewController:(UIViewController *)previewedViewController WK_AVAILABLE(NA, 9_0);
 - (BOOL)_webView:(WKWebView *)webView showCustomSheetForElement:(_WKActivatedElementInfo *)element WK_AVAILABLE(NA, WK_IOS_TBA);
+- (void)_webView:(WKWebView *)webView alternateActionForURL:(NSURL *)url WK_AVAILABLE(NA, WK_IOS_TBA);
 - (NSArray *)_attachmentListForWebView:(WKWebView *)webView WK_AVAILABLE(NA, WK_IOS_TBA);
 - (NSUInteger)_webView:(WKWebView *)webView indexIntoAttachmentListForElement:(_WKActivatedElementInfo *)element WK_AVAILABLE(NA, WK_IOS_TBA);
 - (UIEdgeInsets)_webView:(WKWebView *)webView finalObscuredInsetsForScrollView:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset WK_AVAILABLE(NA, 9_0);

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (197865 => 197866)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2016-03-09 19:29:29 UTC (rev 197866)
@@ -519,6 +519,7 @@
     void didFinishDrawingPagesToPDF(const IPC::DataReference&);
     void contentSizeCategoryDidChange(const String& contentSizeCategory);
     void getLookupContextAtPoint(const WebCore::IntPoint&, std::function<void(const String&, CallbackBase::Error)>);
+    void handleTwoFingerTapAtPoint(const WebCore::IntPoint&, std::function<void(const String&, CallbackBase::Error)>);
 #endif
 #if ENABLE(DATA_DETECTION)
     void setDataDetectionResult(const DataDetectionResult&);

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h (197865 => 197866)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h	2016-03-09 19:29:29 UTC (rev 197866)
@@ -104,6 +104,7 @@
     RetainPtr<UITapGestureRecognizer> _doubleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _nonBlockingDoubleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _twoFingerDoubleTapGestureRecognizer;
+    RetainPtr<UITapGestureRecognizer> _twoFingerSingleTapGestureRecognizer;
     RetainPtr<WKInspectorNodeSearchGestureRecognizer> _inspectorNodeSearchGestureRecognizer;
 
     RetainPtr<UIWKTextInteractionAssistant> _textSelectionAssistant;

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (197865 => 197866)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2016-03-09 19:29:29 UTC (rev 197866)
@@ -486,6 +486,14 @@
     [_longPressGestureRecognizer _setRequiresQuietImpulse:YES];
     [self addGestureRecognizer:_longPressGestureRecognizer.get()];
 
+    _twoFingerSingleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_twoFingerSingleTapGestureRecognized:)]);
+    [_twoFingerSingleTapGestureRecognizer setAllowableMovement:60];
+    [_twoFingerSingleTapGestureRecognizer setNumberOfTapsRequired:1];
+    [_twoFingerSingleTapGestureRecognizer setNumberOfTouchesRequired:2];
+    [_twoFingerSingleTapGestureRecognizer setDelaysTouchesEnded:NO];
+    [_twoFingerSingleTapGestureRecognizer setDelegate:self];
+    [self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
+
 #if HAVE(LINK_PREVIEW)
     [self _registerPreview];
 #endif
@@ -546,6 +554,9 @@
     [_twoFingerDoubleTapGestureRecognizer setDelegate:nil];
     [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
 
+    [_twoFingerSingleTapGestureRecognizer setDelegate:nil];
+    [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
+
     _inspectorNodeSearchEnabled = NO;
     if (_inspectorNodeSearchGestureRecognizer) {
         [_inspectorNodeSearchGestureRecognizer setDelegate:nil];
@@ -572,6 +583,7 @@
     [self removeGestureRecognizer:_doubleTapGestureRecognizer.get()];
     [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
     [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
+    [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
 }
 
 - (void)_addDefaultGestureRecognizers
@@ -582,6 +594,7 @@
     [self addGestureRecognizer:_doubleTapGestureRecognizer.get()];
     [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
     [self addGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
+    [self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
 }
 
 - (UIView*)unscaledView
@@ -1293,6 +1306,25 @@
     }
 }
 
+- (void)_twoFingerSingleTapGestureRecognized:(UITapGestureRecognizer *)gestureRecognizer
+{
+    _page->tapHighlightAtPosition(gestureRecognizer.centroid, ++_latestTapID);
+    _isTapHighlightIDValid = YES;
+    RetainPtr<WKContentView> view = self;
+    WKWebView *webView = _webView;
+    _page->handleTwoFingerTapAtPoint(roundedIntPoint(gestureRecognizer.centroid), [view, webView](const String& string, CallbackBase::Error error) {
+        if (error != CallbackBase::Error::None)
+            return;
+        if (!string.isEmpty()) {
+            id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([webView UIDelegate]);
+            if ([uiDelegate respondsToSelector:@selector(_webView:alternateActionForURL:)])
+                [uiDelegate _webView:webView alternateActionForURL:[NSURL _web_URLWithWTFString:string]];
+            [view _finishInteraction];
+        } else
+            [view _cancelInteraction];
+    });
+}
+
 - (void)_longPressRecognized:(UILongPressGestureRecognizer *)gestureRecognizer
 {
     ASSERT(gestureRecognizer == _longPressGestureRecognizer);

Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (197865 => 197866)


--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2016-03-09 19:29:29 UTC (rev 197866)
@@ -556,6 +556,17 @@
     m_process->send(Messages::WebPage::GetLookupContextAtPoint(point, callbackID), m_pageID);
 }
 
+void WebPageProxy::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, std::function<void(const String&, CallbackBase::Error)> callbackFunction)
+{
+    if (!isValid()) {
+        callbackFunction(String(), CallbackBase::Error::Unknown);
+        return;
+    }
+    
+    uint64_t callbackID = m_callbacks.put(WTFMove(callbackFunction), m_process->throttler().backgroundActivityToken());
+    process().send(Messages::WebPage::HandleTwoFingerTapAtPoint(point, callbackID), m_pageID);
+}
+
 void WebPageProxy::selectWithTwoTouches(const WebCore::IntPoint from, const WebCore::IntPoint to, uint32_t gestureType, uint32_t gestureState, std::function<void (const WebCore::IntPoint&, uint32_t, uint32_t, uint32_t, CallbackBase::Error)> callbackFunction)
 {
     if (!isValid()) {

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (197865 => 197866)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2016-03-09 19:29:29 UTC (rev 197866)
@@ -556,7 +556,7 @@
     WebCore::IntRect rectForElementAtInteractionLocation();
     void updateSelectionAppearance();
     void getLookupContextAtPoint(const WebCore::IntPoint, uint64_t callbackID);
-
+    void handleTwoFingerTapAtPoint(const WebCore::IntPoint&, uint64_t callbackID);
 #if ENABLE(IOS_TOUCH_EVENTS)
     void dispatchAsynchronousTouchEvents(const Vector<WebTouchEvent, 1>& queue);
 #endif

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (197865 => 197866)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2016-03-09 19:29:29 UTC (rev 197866)
@@ -92,6 +92,7 @@
     ExecuteEditCommandWithCallback(String name, uint64_t callbackID)
     GetLookupContextAtPoint(WebCore::IntPoint point, uint64_t callbackID)
     SetAllowsMediaDocumentInlinePlayback(bool allows)
+    HandleTwoFingerTapAtPoint(WebCore::IntPoint point, uint64_t callbackID)
 #endif
 
     SetControlledByAutomation(bool controlled)

Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (197865 => 197866)


--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm	2016-03-09 19:04:07 UTC (rev 197865)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm	2016-03-09 19:29:29 UTC (rev 197866)
@@ -630,6 +630,17 @@
 #endif
 }
 
+void WebPage::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, uint64_t callbackID)
+{
+    FloatPoint adjustedPoint;
+    Node* nodeRespondingToClick = m_page->mainFrame().nodeRespondingToClickEvents(point, adjustedPoint);
+    Element* element = (nodeRespondingToClick && is<Element>(*nodeRespondingToClick)) ? downcast<Element>(nodeRespondingToClick) : nullptr;
+    String url;
+    if (element && element->isLink())
+        url = "" *)element->document().completeURL(stripLeadingAndTrailingHTMLSpaces(element->getAttribute(HTMLNames::hrefAttr))) absoluteString];
+    send(Messages::WebPageProxy::StringCallback(url, callbackID));
+}
+
 void WebPage::potentialTapAtPosition(uint64_t requestID, const WebCore::FloatPoint& position)
 {
     m_potentialTapNode = m_page->mainFrame().nodeRespondingToClickEvents(position, m_potentialTapLocation);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to