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);