Diff
Modified: trunk/Source/WebCore/ChangeLog (211226 => 211227)
--- trunk/Source/WebCore/ChangeLog 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebCore/ChangeLog 2017-01-26 20:58:08 UTC (rev 211227)
@@ -1,3 +1,39 @@
+2017-01-26 Wenson Hsieh <wenson_hs...@apple.com>
+
+ Add support for recognizing data interaction gestures in WebKit2
+ https://bugs.webkit.org/show_bug.cgi?id=167444
+
+ Reviewed by Beth Dakin.
+
+ Minor tweaks to pasteboard code to support data interaction.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/PlatformPasteboard.h:
+ * platform/ios/PasteboardIOS.mm:
+ (WebCore::Pasteboard::read):
+ * platform/ios/PlatformPasteboardIOS.mm:
+ (WebCore::PlatformPasteboard::PlatformPasteboard):
+
+ If the pasteboard is the special data interaction type, use the shared item provider pasteboard; otherwise,
+ fall back to the general pasteboard.
+
+ (WebCore::PlatformPasteboard::getTypes):
+
+ Actually populate the list of available types using available pasteboardTypes.
+
+ (WebCore::PlatformPasteboard::write):
+
+ Add UTF8 plaintext type (kUTTypeUTF8PlainText) when vending data representations of rich text.
+
+ * platform/ios/WebItemProviderPasteboard.mm:
+ (-[WebItemProviderPasteboard setItems:]):
+ (-[WebItemProviderPasteboard dataForPasteboardType:inItemSet:]):
+ (-[WebItemProviderPasteboard valuesForPasteboardType:inItemSet:]):
+
+ Move off of deprecated methods when retrieving and supplying data to the item provider pasteboard.
+
+ * platform/spi/ios/UIKitSPI.h:
+
2017-01-26 Matt Rajca <mra...@apple.com>
Notify clients when the user plays media otherwise prevented from autoplaying
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (211226 => 211227)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-01-26 20:58:08 UTC (rev 211227)
@@ -6511,8 +6511,8 @@
F47A5E3E195B8C8A00483100 /* StyleScrollSnapPoints.h in Headers */ = {isa = PBXBuildFile; fileRef = F47A5E3B195B8C8A00483100 /* StyleScrollSnapPoints.h */; settings = {ATTRIBUTES = (Private, ); }; };
F47A5E3F195B8E4800483100 /* StyleScrollSnapPoints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F47A5E3A195B8C8A00483100 /* StyleScrollSnapPoints.cpp */; };
F48223101E3869B80066FC79 /* WebItemProviderPasteboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = F482230E1E3869B80066FC79 /* WebItemProviderPasteboard.mm */; };
- F48223111E3869B80066FC79 /* WebItemProviderPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F482230F1E3869B80066FC79 /* WebItemProviderPasteboard.h */; };
- F48223131E386E240066FC79 /* AbstractPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F48223121E386E240066FC79 /* AbstractPasteboard.h */; };
+ F48223111E3869B80066FC79 /* WebItemProviderPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F482230F1E3869B80066FC79 /* WebItemProviderPasteboard.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ F48223131E386E240066FC79 /* AbstractPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F48223121E386E240066FC79 /* AbstractPasteboard.h */; settings = {ATTRIBUTES = (Private, ); }; };
F4BFB9851E1DDF9B00862C24 /* DumpEditingHistory.js in Copy Scripts */ = {isa = PBXBuildFile; fileRef = F48389831E1DDF2B0076B7EA /* DumpEditingHistory.js */; };
F4BFB9861E1DDF9B00862C24 /* EditingHistoryUtil.js in Copy Scripts */ = {isa = PBXBuildFile; fileRef = F48389841E1DDF2B0076B7EA /* EditingHistoryUtil.js */; };
F50664F7157F52DC00AC226F /* FormController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F50664F5157F52DC00AC226F /* FormController.cpp */; };
Modified: trunk/Source/WebCore/platform/PlatformPasteboard.h (211226 => 211227)
--- trunk/Source/WebCore/platform/PlatformPasteboard.h 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebCore/platform/PlatformPasteboard.h 2017-01-26 20:58:08 UTC (rev 211227)
@@ -92,7 +92,7 @@
RetainPtr<NSPasteboard> m_pasteboard;
#endif
#if PLATFORM(IOS)
- RetainPtr<UIPasteboard> m_pasteboard;
+ RetainPtr<id> m_pasteboard;
#endif
#if PLATFORM(GTK)
GtkClipboard* m_clipboard;
Modified: trunk/Source/WebCore/platform/ios/PasteboardIOS.mm (211226 => 211227)
--- trunk/Source/WebCore/platform/ios/PasteboardIOS.mm 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebCore/platform/ios/PasteboardIOS.mm 2017-01-26 20:58:08 UTC (rev 211227)
@@ -150,9 +150,14 @@
void Pasteboard::read(PasteboardPlainText& text)
{
PasteboardStrategy& strategy = *platformStrategies()->pasteboardStrategy();
+ text.text = strategy.readStringFromPasteboard(0, kUTTypeURL, m_pasteboardName);
+ if (!text.text.isNull() && !text.text.isEmpty()) {
+ text.isURL = true;
+ return;
+ }
+
text.text = strategy.readStringFromPasteboard(0, kUTTypeText, m_pasteboardName);
- if (text.text.isEmpty())
- text.text = strategy.readStringFromPasteboard(0, kUTTypeURL, m_pasteboardName);
+ text.isURL = false;
}
static NSArray* supportedImageTypes()
Modified: trunk/Source/WebCore/platform/ios/PlatformPasteboardIOS.mm (211226 => 211227)
--- trunk/Source/WebCore/platform/ios/PlatformPasteboardIOS.mm 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebCore/platform/ios/PlatformPasteboardIOS.mm 2017-01-26 20:58:08 UTC (rev 211227)
@@ -32,6 +32,7 @@
#import "Pasteboard.h"
#import "SharedBuffer.h"
#import "SoftLinking.h"
+#import "WebItemProviderPasteboard.h"
#import <MobileCoreServices/MobileCoreServices.h>
SOFT_LINK_FRAMEWORK(UIKit)
@@ -53,13 +54,25 @@
{
}
+#if ENABLE(DATA_INTERACTION)
+PlatformPasteboard::PlatformPasteboard(const String& name)
+{
+ if (name == "data interaction pasteboard")
+ m_pasteboard = [WebItemProviderPasteboard sharedInstance];
+ else
+ m_pasteboard = [getUIPasteboardClass() generalPasteboard];
+}
+#else
PlatformPasteboard::PlatformPasteboard(const String&)
: m_pasteboard([getUIPasteboardClass() generalPasteboard])
{
}
+#endif
-void PlatformPasteboard::getTypes(Vector<String>&)
+void PlatformPasteboard::getTypes(Vector<String>& types)
{
+ for (NSString *pasteboardType in [m_pasteboard pasteboardTypes])
+ types.append(pasteboardType);
}
RefPtr<SharedBuffer> PlatformPasteboard::bufferForType(const String&)
@@ -145,7 +158,9 @@
[representations setValue:content.dataInRTFDFormat->createNSData().get() forKey:(NSString *)kUTTypeFlatRTFD];
if (content.dataInRTFFormat)
[representations setValue:content.dataInRTFFormat->createNSData().get() forKey:(NSString *)kUTTypeRTF];
+
[representations setValue:content.dataInStringFormat forKey:(NSString *)kUTTypeText];
+ [representations setValue:[(NSString *)content.dataInStringFormat dataUsingEncoding:NSUTF8StringEncoding] forKey:(NSString *)kUTTypeUTF8PlainText];
[m_pasteboard setItems:@[representations.get()]];
}
Modified: trunk/Source/WebCore/platform/ios/WebItemProviderPasteboard.mm (211226 => 211227)
--- trunk/Source/WebCore/platform/ios/WebItemProviderPasteboard.mm 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebCore/platform/ios/WebItemProviderPasteboard.mm 2017-01-26 20:58:08 UTC (rev 211227)
@@ -30,6 +30,7 @@
#import "SoftLinking.h"
#import "UIKitSPI.h"
+#import <Foundation/NSProgress.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import <UIKit/UIColor.h>
#import <UIKit/UIImage.h>
@@ -131,8 +132,10 @@
continue;
UIItemProvider *itemProvider = [[getUIItemProviderClass() alloc] init];
for (NSString *typeIdentifier in item) {
- [itemProvider registerDataRepresentationForTypeIdentifier:typeIdentifier loadHandler:^(UIItemProviderDataLoadCompletionBlock completionBlock, NSDictionary *) {
+ [itemProvider registerDataRepresentationForTypeIdentifier:typeIdentifier options:nil loadHandler:^NSProgress *(UIItemProviderDataLoadCompletionBlock completionBlock)
+ {
completionBlock(item[typeIdentifier], nil);
+ return [NSProgress discreteProgressWithTotalUnitCount:100];
}];
}
[providers addObject:itemProvider];
@@ -149,7 +152,7 @@
if (!provider)
return;
- NSData *data = "" copyDataRepresentationForTypeIdentifier:pasteboardType options:nil error:nil];
+ NSData *data = "" copyDataRepresentationForTypeIdentifier:pasteboardType error:nil];
if (data)
[values addObject:data];
}];
@@ -165,28 +168,29 @@
if (!provider)
return;
- if (isRichTextType(pasteboardType) && [provider canInstantiateObjectOfClass:[NSAttributedString class]]) {
- [values addObject:[provider instantiateObjectOfClass:[NSAttributedString class] options:nil error:nil]];
+ // FIXME: These should be refactored to use asynchronous calls.
+ if (isColorType(pasteboardType) && [provider canCreateObjectOfClass:[getUIColorClass() class]]) {
+ [values addObject:[provider createObjectOfClass:[getUIColorClass() class] error:nil]];
return;
}
- if (isStringType(pasteboardType) && [provider canInstantiateObjectOfClass:[NSString class]]) {
- [values addObject:[provider instantiateObjectOfClass:[NSString class] options:nil error:nil]];
+ if (isImageType(pasteboardType) && [provider canCreateObjectOfClass:[getUIImageClass() class]]) {
+ [values addObject:[provider createObjectOfClass:[getUIImageClass() class] error:nil]];
return;
}
- if (isColorType(pasteboardType) && [provider canInstantiateObjectOfClass:[getUIColorClass() class]]) {
- [values addObject:[provider instantiateObjectOfClass:[getUIColorClass() class] options:nil error:nil]];
+ if (isURLType(pasteboardType) && [provider canCreateObjectOfClass:[NSURL class]]) {
+ [values addObject:[provider createObjectOfClass:[NSURL class] error:nil]];
return;
}
- if (isURLType(pasteboardType) && [provider canInstantiateObjectOfClass:[NSURL class]]) {
- [values addObject:[provider instantiateObjectOfClass:[NSURL class] options:nil error:nil]];
+ if (isRichTextType(pasteboardType) && [provider canCreateObjectOfClass:[NSAttributedString class]]) {
+ [values addObject:[provider createObjectOfClass:[NSAttributedString class] error:nil]];
return;
}
- if (isImageType(pasteboardType) && [provider canInstantiateObjectOfClass:[getUIImageClass() class]]) {
- [values addObject:[provider instantiateObjectOfClass:[getUIImageClass() class] options:nil error:nil]];
+ if (isStringType(pasteboardType) && [provider canCreateObjectOfClass:[NSString class]]) {
+ [values addObject:[provider createObjectOfClass:[NSString class] error:nil]];
return;
}
Modified: trunk/Source/WebKit2/ChangeLog (211226 => 211227)
--- trunk/Source/WebKit2/ChangeLog 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebKit2/ChangeLog 2017-01-26 20:58:08 UTC (rev 211227)
@@ -1,3 +1,36 @@
+2017-01-26 Wenson Hsieh <wenson_hs...@apple.com>
+
+ Add support for recognizing data interaction gestures in WebKit2
+ https://bugs.webkit.org/show_bug.cgi?id=167444
+
+ Reviewed by Beth Dakin.
+
+ Adds a new data interaction gesture recognizer, responsible for determining when to begin data interaction. This
+ is a new long press gesture recognizer that fires simultaneously with the existing long press gesture
+ recognizers (for performing long-press actions, and for showing the tap highlight).
+
+ Also tweaks logic for determining whether selection gesture recognizers should fire to account for data
+ interaction -- in particular, we don't want selection gesture recognizers to cause the current selection to
+ change while data interaction is possible. See -hasSelectablePositionAtPoint and -pointIsInAssistedNode for
+ more details.
+
+ * UIProcess/ios/PageClientImplIOS.mm:
+ (WebKit::PageClientImpl::didPerformDataInteractionControllerOperation):
+ (WebKit::PageClientImpl::startDataInteractionWithImage):
+ * UIProcess/ios/WKContentViewInteraction.h:
+ * UIProcess/ios/WKContentViewInteraction.mm:
+ (-[WKContentView _createAndConfigureLongPressGestureRecognizer]):
+ (-[WKContentView setupInteraction]):
+ (-[WKContentView cleanupInteraction]):
+ (-[WKContentView _removeDefaultGestureRecognizers]):
+ (-[WKContentView _addDefaultGestureRecognizers]):
+ (-[WKContentView resignFirstResponder]):
+ (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
+ (-[WKContentView gestureRecognizerShouldBegin:]):
+ (-[WKContentView hasSelectablePositionAtPoint:]):
+ (-[WKContentView pointIsInDataInteractionContent:]):
+ (-[WKContentView pointIsInAssistedNode:]):
+
2017-01-26 Matt Rajca <mra...@apple.com>
Notify clients when the user plays media otherwise prevented from autoplaying
Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm (211226 => 211227)
--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm 2017-01-26 20:58:08 UTC (rev 211227)
@@ -765,10 +765,12 @@
#if ENABLE(DATA_INTERACTION)
void PageClientImpl::didPerformDataInteractionControllerOperation()
{
+ [m_contentView _didPerformDataInteractionControllerOperation];
}
-void PageClientImpl::startDataInteractionWithImage(const WebCore::IntPoint& clientPosition, const ShareableBitmap::Handle& image, bool isLink)
+void PageClientImpl::startDataInteractionWithImage(const IntPoint& clientPosition, const ShareableBitmap::Handle& image, bool isLink)
{
+ [m_contentView _startDataInteractionWithImage:ShareableBitmap::create(image)->makeCGImageCopy() atClientPosition:CGPointMake(clientPosition.x(), clientPosition.y()) isLink:isLink];
}
#endif
Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h (211226 => 211227)
--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h 2017-01-26 20:58:08 UTC (rev 211227)
@@ -44,6 +44,10 @@
#import <wtf/Vector.h>
#import <wtf/text/WTFString.h>
+#if USE(APPLE_INTERNAL_SDK) && __has_include(<WebKitAdditions/WKContentViewInteractionAdditions.h>)
+#import <WebKitAdditions/WKContentViewInteractionAdditions.h>
+#endif
+
namespace API {
class OpenPanelParameters;
}
@@ -179,11 +183,22 @@
BOOL _resigningFirstResponder;
BOOL _needsDeferredEndScrollingSelectionUpdate;
+
+#if ENABLE(DATA_INTERACTION)
+ RetainPtr<UILongPressGestureRecognizer> _dataInteractionGestureRecognizer;
+ RetainPtr<UIImage> _currentDataInteractionImage;
+ CGPoint _currentDataInteractionOrigin;
+ BOOL _shouldHandleLongPressActionAfterDataInteraction;
+#endif
}
@end
-@interface WKContentView (WKInteraction) <UIGestureRecognizerDelegate, UIWebTouchEventsGestureRecognizerDelegate, UITextInputPrivate, UIWebFormAccessoryDelegate, UIWKInteractionViewProtocol, WKFileUploadPanelDelegate, WKActionSheetAssistantDelegate>
+@interface WKContentView (WKInteraction) <UIGestureRecognizerDelegate, UIWebTouchEventsGestureRecognizerDelegate, UITextInputPrivate, UIWebFormAccessoryDelegate, UIWKInteractionViewProtocol, WKFileUploadPanelDelegate, WKActionSheetAssistantDelegate
+#if ENABLE(DATA_INTERACTION)
+ , WKViewDataInteractionSourceDelegate, WKDataInteractionSessionDelegate, WKViewDataInteractionDestinationDelegate, WKDataInteractionItemVisualTarget
+#endif
+>
@property (nonatomic, readonly) CGPoint lastInteractionLocation;
@property (nonatomic, readonly) BOOL isEditable;
@@ -232,6 +247,12 @@
- (NSArray *)_dataDetectionResults;
- (NSArray<NSValue *> *)_uiTextSelectionRects;
- (void)accessibilityRetrieveSpeakSelectionContent;
+
+#if ENABLE(DATA_INTERACTION)
+- (void)_didPerformDataInteractionControllerOperation;
+- (void)_startDataInteractionWithImage:(RetainPtr<CGImageRef>)image atClientPosition:(CGPoint)clientPosition isLink:(BOOL)isLink;
+#endif
+
@end
@interface WKContentView (WKTesting)
Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (211226 => 211227)
--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm 2017-01-26 20:41:13 UTC (rev 211226)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm 2017-01-26 20:58:08 UTC (rev 211227)
@@ -67,6 +67,7 @@
#import <WebCore/DataDetectorsCoreSPI.h>
#import <WebCore/DataDetectorsUISPI.h>
#import <WebCore/FloatQuad.h>
+#import <WebCore/NotImplemented.h>
#import <WebCore/Pasteboard.h>
#import <WebCore/Path.h>
#import <WebCore/PathUtilities.h>
@@ -80,6 +81,11 @@
#import <WebKit/WebSelectionRect.h> // FIXME: WK2 should not include WebKit headers!
#import <wtf/RetainPtr.h>
+#if ENABLE(DATA_INTERACTION)
+#import <WebCore/PlatformPasteboard.h>
+#import <WebCore/WebItemProviderPasteboard.h>
+#endif
+
@interface UIEvent(UIEventInternal)
@property (nonatomic, assign) UIKeyboardInputFlags _inputFlags;
@end
@@ -493,6 +499,10 @@
@implementation WKContentView (WKInteraction)
+#if USE(APPLE_INTERNAL_SDK) && __has_include(<WebKitAdditions/WKContentViewInteractionAdditions.mm>)
+#import <WebKitAdditions/WKContentViewInteractionAdditions.mm>
+#endif
+
static UIWebSelectionMode toUIWebSelectionMode(WKSelectionGranularity granularity)
{
switch (granularity) {
@@ -515,6 +525,15 @@
[_singleTapGestureRecognizer requireGestureRecognizerToFail:_doubleTapGestureRecognizer.get()];
}
+- (void)_createAndConfigureLongPressGestureRecognizer
+{
+ _longPressGestureRecognizer = adoptNS([[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_longPressRecognized:)]);
+ [_longPressGestureRecognizer setDelay:tapAndHoldDelay];
+ [_longPressGestureRecognizer setDelegate:self];
+ [_longPressGestureRecognizer _setRequiresQuietImpulse:YES];
+ [self addGestureRecognizer:_longPressGestureRecognizer.get()];
+}
+
- (void)setupInteraction
{
if (!_interactionViewsContainerView) {
@@ -557,12 +576,17 @@
[_highlightLongPressGestureRecognizer setDelegate:self];
[self addGestureRecognizer:_highlightLongPressGestureRecognizer.get()];
- _longPressGestureRecognizer = adoptNS([[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_longPressRecognized:)]);
- [_longPressGestureRecognizer setDelay:tapAndHoldDelay];
- [_longPressGestureRecognizer setDelegate:self];
- [_longPressGestureRecognizer _setRequiresQuietImpulse:YES];
- [self addGestureRecognizer:_longPressGestureRecognizer.get()];
+ [self _createAndConfigureLongPressGestureRecognizer];
+#if ENABLE(DATA_INTERACTION)
+ _dataInteractionGestureRecognizer = adoptNS([[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_dataInteractionGestureRecognizer:)]);
+ [_dataInteractionGestureRecognizer setDelay:0.25];
+ [_dataInteractionGestureRecognizer setDelegate:self];
+ [_dataInteractionGestureRecognizer _setRequiresQuietImpulse:YES];
+ [self addGestureRecognizer:_dataInteractionGestureRecognizer.get()];
+ [self setupDataInteractionDelegates];
+#endif
+
_twoFingerSingleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_twoFingerSingleTapGestureRecognized:)]);
[_twoFingerSingleTapGestureRecognizer setAllowableMovement:60];
[_twoFingerSingleTapGestureRecognizer _setAllowableSeparation:150];
@@ -637,6 +661,12 @@
[_twoFingerSingleTapGestureRecognizer setDelegate:nil];
[self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
+#if ENABLE(DATA_INTERACTION)
+ [_dataInteractionGestureRecognizer setDelegate:nil];
+ [self removeGestureRecognizer:_dataInteractionGestureRecognizer.get()];
+ [self teardownDataInteractionDelegates];
+#endif
+
_inspectorNodeSearchEnabled = NO;
if (_inspectorNodeSearchGestureRecognizer) {
[_inspectorNodeSearchGestureRecognizer setDelegate:nil];
@@ -664,6 +694,9 @@
[self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
[self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
[self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
+#if ENABLE(DATA_INTERACTION)
+ [self removeGestureRecognizer:_dataInteractionGestureRecognizer.get()];
+#endif
}
- (void)_addDefaultGestureRecognizers
@@ -675,6 +708,9 @@
[self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
[self addGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
[self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
+#if ENABLE(DATA_INTERACTION)
+ [self addGestureRecognizer:_dataInteractionGestureRecognizer.get()];
+#endif
}
- (UIView*)unscaledView
@@ -812,6 +848,9 @@
- (BOOL)resignFirstResponder
{
+#if ENABLE(DATA_INTERACTION)
+ _shouldHandleLongPressActionAfterDataInteraction = NO;
+#endif
// FIXME: Maybe we should call resignFirstResponder on the superclass
// and do nothing if the return value is NO.
@@ -1190,6 +1229,14 @@
if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _previewGestureRecognizer.get()))
return YES;
+#if ENABLE(DATA_INTERACTION)
+ if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _dataInteractionGestureRecognizer.get()))
+ return YES;
+
+ if (isSamePair(gestureRecognizer, otherGestureRecognizer, _longPressGestureRecognizer.get(), _dataInteractionGestureRecognizer.get()))
+ return YES;
+#endif
+
return NO;
}
@@ -1360,6 +1407,11 @@
}
}
+#if ENABLE(DATA_INTERACTION)
+ if (gestureRecognizer == _dataInteractionGestureRecognizer)
+ return [self pointIsInDataInteractionContent:point];
+#endif
+
return YES;
}
@@ -1390,9 +1442,37 @@
InteractionInformationRequest request(roundedIntPoint(point));
[self ensurePositionInformationIsUpToDate:request];
+
+#if ENABLE(DATA_INTERACTION)
+ if (_positionInformation.hasDataInteractionAtPosition) {
+ // If the position might initiate a data interaction, we don't want to consider the content at this position to be selectable.
+ // FIXME: This should be renamed to something more precise, such as textSelectionShouldRecognizeGestureAtPoint:
+ return NO;
+ }
+#endif
+
return _positionInformation.isSelectable;
}
+#if ENABLE(DATA_INTERACTION)
+
+- (BOOL)pointIsInDataInteractionContent:(CGPoint)point
+{
+ InteractionInformationRequest request(roundedIntPoint(point));
+ [self ensurePositionInformationIsUpToDate:request];
+
+ if (_positionInformation.isImage)
+ return YES;
+
+ // FIXME: Add support for links.
+ if (_positionInformation.isLink)
+ return NO;
+
+ return _positionInformation.hasDataInteractionAtPosition;
+}
+
+#endif
+
- (BOOL)pointIsNearMarkedText:(CGPoint)point
{
InteractionInformationRequest request(roundedIntPoint(point));
@@ -1404,6 +1484,15 @@
{
InteractionInformationRequest request(roundedIntPoint(point));
[self ensurePositionInformationIsUpToDate:request];
+
+#if ENABLE(DATA_INTERACTION)
+ if (_positionInformation.hasDataInteractionAtPosition) {
+ // If the position might initiate data interaction, we don't want to change the selection.
+ // FIXME: This should be renamed to something more precise, such as textInteractionShouldRecognizeGestureAtPoint:
+ return NO;
+ }
+#endif
+
return _positionInformation.nodeAtPositionIsAssistedNode;
}