Changeset 211227 in webkit


Ignore:
Timestamp:
Jan 26, 2017 12:58:08 PM (7 years ago)
Author:
Wenson Hsieh
Message:

Add support for recognizing data interaction gestures in WebKit2
https://bugs.webkit.org/show_bug.cgi?id=167444

Reviewed by Beth Dakin.

Source/WebCore:

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:

Source/WebKit2:

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:]):

Location:
trunk/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r211226 r211227  
     12017-01-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        Add support for recognizing data interaction gestures in WebKit2
     4        https://bugs.webkit.org/show_bug.cgi?id=167444
     5
     6        Reviewed by Beth Dakin.
     7
     8        Minor tweaks to pasteboard code to support data interaction.
     9
     10        * WebCore.xcodeproj/project.pbxproj:
     11        * platform/PlatformPasteboard.h:
     12        * platform/ios/PasteboardIOS.mm:
     13        (WebCore::Pasteboard::read):
     14        * platform/ios/PlatformPasteboardIOS.mm:
     15        (WebCore::PlatformPasteboard::PlatformPasteboard):
     16
     17        If the pasteboard is the special data interaction type, use the shared item provider pasteboard; otherwise,
     18        fall back to the general pasteboard.
     19
     20        (WebCore::PlatformPasteboard::getTypes):
     21
     22        Actually populate the list of available types using available pasteboardTypes.
     23
     24        (WebCore::PlatformPasteboard::write):
     25
     26        Add UTF8 plaintext type (kUTTypeUTF8PlainText) when vending data representations of rich text.
     27
     28        * platform/ios/WebItemProviderPasteboard.mm:
     29        (-[WebItemProviderPasteboard setItems:]):
     30        (-[WebItemProviderPasteboard dataForPasteboardType:inItemSet:]):
     31        (-[WebItemProviderPasteboard valuesForPasteboardType:inItemSet:]):
     32
     33        Move off of deprecated methods when retrieving and supplying data to the item provider pasteboard.
     34
     35        * platform/spi/ios/UIKitSPI.h:
     36
    1372017-01-26  Matt Rajca  <mrajca@apple.com>
    238
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r211191 r211227  
    65126512                F47A5E3F195B8E4800483100 /* StyleScrollSnapPoints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F47A5E3A195B8C8A00483100 /* StyleScrollSnapPoints.cpp */; };
    65136513                F48223101E3869B80066FC79 /* WebItemProviderPasteboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = F482230E1E3869B80066FC79 /* WebItemProviderPasteboard.mm */; };
    6514                 F48223111E3869B80066FC79 /* WebItemProviderPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F482230F1E3869B80066FC79 /* WebItemProviderPasteboard.h */; };
    6515                 F48223131E386E240066FC79 /* AbstractPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F48223121E386E240066FC79 /* AbstractPasteboard.h */; };
     6514                F48223111E3869B80066FC79 /* WebItemProviderPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F482230F1E3869B80066FC79 /* WebItemProviderPasteboard.h */; settings = {ATTRIBUTES = (Private, ); }; };
     6515                F48223131E386E240066FC79 /* AbstractPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F48223121E386E240066FC79 /* AbstractPasteboard.h */; settings = {ATTRIBUTES = (Private, ); }; };
    65166516                F4BFB9851E1DDF9B00862C24 /* DumpEditingHistory.js in Copy Scripts */ = {isa = PBXBuildFile; fileRef = F48389831E1DDF2B0076B7EA /* DumpEditingHistory.js */; };
    65176517                F4BFB9861E1DDF9B00862C24 /* EditingHistoryUtil.js in Copy Scripts */ = {isa = PBXBuildFile; fileRef = F48389841E1DDF2B0076B7EA /* EditingHistoryUtil.js */; };
  • trunk/Source/WebCore/platform/PlatformPasteboard.h

    r211158 r211227  
    9393#endif
    9494#if PLATFORM(IOS)
    95     RetainPtr<UIPasteboard> m_pasteboard;
     95    RetainPtr<id> m_pasteboard;
    9696#endif
    9797#if PLATFORM(GTK)
  • trunk/Source/WebCore/platform/ios/PasteboardIOS.mm

    r211192 r211227  
    151151{
    152152    PasteboardStrategy& strategy = *platformStrategies()->pasteboardStrategy();
     153    text.text = strategy.readStringFromPasteboard(0, kUTTypeURL, m_pasteboardName);
     154    if (!text.text.isNull() && !text.text.isEmpty()) {
     155        text.isURL = true;
     156        return;
     157    }
     158
    153159    text.text = strategy.readStringFromPasteboard(0, kUTTypeText, m_pasteboardName);
    154     if (text.text.isEmpty())
    155         text.text = strategy.readStringFromPasteboard(0, kUTTypeURL, m_pasteboardName);
     160    text.isURL = false;
    156161}
    157162
  • trunk/Source/WebCore/platform/ios/PlatformPasteboardIOS.mm

    r209307 r211227  
    3333#import "SharedBuffer.h"
    3434#import "SoftLinking.h"
     35#import "WebItemProviderPasteboard.h"
    3536#import <MobileCoreServices/MobileCoreServices.h>
    3637
     
    5455}
    5556
     57#if ENABLE(DATA_INTERACTION)
     58PlatformPasteboard::PlatformPasteboard(const String& name)
     59{
     60    if (name == "data interaction pasteboard")
     61        m_pasteboard = [WebItemProviderPasteboard sharedInstance];
     62    else
     63        m_pasteboard = [getUIPasteboardClass() generalPasteboard];
     64}
     65#else
    5666PlatformPasteboard::PlatformPasteboard(const String&)
    5767    : m_pasteboard([getUIPasteboardClass() generalPasteboard])
    5868{
    5969}
    60 
    61 void PlatformPasteboard::getTypes(Vector<String>&)
    62 {
     70#endif
     71
     72void PlatformPasteboard::getTypes(Vector<String>& types)
     73{
     74    for (NSString *pasteboardType in [m_pasteboard pasteboardTypes])
     75        types.append(pasteboardType);
    6376}
    6477
     
    146159    if (content.dataInRTFFormat)
    147160        [representations setValue:content.dataInRTFFormat->createNSData().get() forKey:(NSString *)kUTTypeRTF];
     161
    148162    [representations setValue:content.dataInStringFormat forKey:(NSString *)kUTTypeText];
     163    [representations setValue:[(NSString *)content.dataInStringFormat dataUsingEncoding:NSUTF8StringEncoding] forKey:(NSString *)kUTTypeUTF8PlainText];
    149164    [m_pasteboard setItems:@[representations.get()]];
    150165}
  • trunk/Source/WebCore/platform/ios/WebItemProviderPasteboard.mm

    r211175 r211227  
    3131#import "SoftLinking.h"
    3232#import "UIKitSPI.h"
     33#import <Foundation/NSProgress.h>
    3334#import <MobileCoreServices/MobileCoreServices.h>
    3435#import <UIKit/UIColor.h>
     
    132133        UIItemProvider *itemProvider = [[getUIItemProviderClass() alloc] init];
    133134        for (NSString *typeIdentifier in item) {
    134             [itemProvider registerDataRepresentationForTypeIdentifier:typeIdentifier loadHandler:^(UIItemProviderDataLoadCompletionBlock completionBlock, NSDictionary *) {
     135            [itemProvider registerDataRepresentationForTypeIdentifier:typeIdentifier options:nil loadHandler:^NSProgress *(UIItemProviderDataLoadCompletionBlock completionBlock)
     136            {
    135137                completionBlock(item[typeIdentifier], nil);
     138                return [NSProgress discreteProgressWithTotalUnitCount:100];
    136139            }];
    137140        }
     
    150153            return;
    151154
    152         NSData *data = [provider copyDataRepresentationForTypeIdentifier:pasteboardType options:nil error:nil];
     155        NSData *data = [provider copyDataRepresentationForTypeIdentifier:pasteboardType error:nil];
    153156        if (data)
    154157            [values addObject:data];
     
    166169            return;
    167170
    168         if (isRichTextType(pasteboardType) && [provider canInstantiateObjectOfClass:[NSAttributedString class]]) {
    169             [values addObject:[provider instantiateObjectOfClass:[NSAttributedString class] options:nil error:nil]];
    170             return;
    171         }
    172 
    173         if (isStringType(pasteboardType) && [provider canInstantiateObjectOfClass:[NSString class]]) {
    174             [values addObject:[provider instantiateObjectOfClass:[NSString class] options:nil error:nil]];
    175             return;
    176         }
    177 
    178         if (isColorType(pasteboardType) && [provider canInstantiateObjectOfClass:[getUIColorClass() class]]) {
    179             [values addObject:[provider instantiateObjectOfClass:[getUIColorClass() class] options:nil error:nil]];
    180             return;
    181         }
    182 
    183         if (isURLType(pasteboardType) && [provider canInstantiateObjectOfClass:[NSURL class]]) {
    184             [values addObject:[provider instantiateObjectOfClass:[NSURL class] options:nil error:nil]];
    185             return;
    186         }
    187 
    188         if (isImageType(pasteboardType) && [provider canInstantiateObjectOfClass:[getUIImageClass() class]]) {
    189             [values addObject:[provider instantiateObjectOfClass:[getUIImageClass() class] options:nil error:nil]];
     171        // FIXME: These should be refactored to use asynchronous calls.
     172        if (isColorType(pasteboardType) && [provider canCreateObjectOfClass:[getUIColorClass() class]]) {
     173            [values addObject:[provider createObjectOfClass:[getUIColorClass() class] error:nil]];
     174            return;
     175        }
     176
     177        if (isImageType(pasteboardType) && [provider canCreateObjectOfClass:[getUIImageClass() class]]) {
     178            [values addObject:[provider createObjectOfClass:[getUIImageClass() class] error:nil]];
     179            return;
     180        }
     181
     182        if (isURLType(pasteboardType) && [provider canCreateObjectOfClass:[NSURL class]]) {
     183            [values addObject:[provider createObjectOfClass:[NSURL class] error:nil]];
     184            return;
     185        }
     186
     187        if (isRichTextType(pasteboardType) && [provider canCreateObjectOfClass:[NSAttributedString class]]) {
     188            [values addObject:[provider createObjectOfClass:[NSAttributedString class] error:nil]];
     189            return;
     190        }
     191
     192        if (isStringType(pasteboardType) && [provider canCreateObjectOfClass:[NSString class]]) {
     193            [values addObject:[provider createObjectOfClass:[NSString class] error:nil]];
    190194            return;
    191195        }
  • trunk/Source/WebKit2/ChangeLog

    r211226 r211227  
     12017-01-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        Add support for recognizing data interaction gestures in WebKit2
     4        https://bugs.webkit.org/show_bug.cgi?id=167444
     5
     6        Reviewed by Beth Dakin.
     7
     8        Adds a new data interaction gesture recognizer, responsible for determining when to begin data interaction. This
     9        is a new long press gesture recognizer that fires simultaneously with the existing long press gesture
     10        recognizers (for performing long-press actions, and for showing the tap highlight).
     11
     12        Also tweaks logic for determining whether selection gesture recognizers should fire to account for data
     13        interaction -- in particular, we don't want selection gesture recognizers to cause the current selection to
     14        change while data interaction is possible. See -hasSelectablePositionAtPoint and -pointIsInAssistedNode for
     15        more details.
     16
     17        * UIProcess/ios/PageClientImplIOS.mm:
     18        (WebKit::PageClientImpl::didPerformDataInteractionControllerOperation):
     19        (WebKit::PageClientImpl::startDataInteractionWithImage):
     20        * UIProcess/ios/WKContentViewInteraction.h:
     21        * UIProcess/ios/WKContentViewInteraction.mm:
     22        (-[WKContentView _createAndConfigureLongPressGestureRecognizer]):
     23        (-[WKContentView setupInteraction]):
     24        (-[WKContentView cleanupInteraction]):
     25        (-[WKContentView _removeDefaultGestureRecognizers]):
     26        (-[WKContentView _addDefaultGestureRecognizers]):
     27        (-[WKContentView resignFirstResponder]):
     28        (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
     29        (-[WKContentView gestureRecognizerShouldBegin:]):
     30        (-[WKContentView hasSelectablePositionAtPoint:]):
     31        (-[WKContentView pointIsInDataInteractionContent:]):
     32        (-[WKContentView pointIsInAssistedNode:]):
     33
    1342017-01-26  Matt Rajca  <mrajca@apple.com>
    235
  • trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm

    r211199 r211227  
    766766void PageClientImpl::didPerformDataInteractionControllerOperation()
    767767{
    768 }
    769 
    770 void PageClientImpl::startDataInteractionWithImage(const WebCore::IntPoint& clientPosition, const ShareableBitmap::Handle& image, bool isLink)
    771 {
     768    [m_contentView _didPerformDataInteractionControllerOperation];
     769}
     770
     771void PageClientImpl::startDataInteractionWithImage(const IntPoint& clientPosition, const ShareableBitmap::Handle& image, bool isLink)
     772{
     773    [m_contentView _startDataInteractionWithImage:ShareableBitmap::create(image)->makeCGImageCopy() atClientPosition:CGPointMake(clientPosition.x(), clientPosition.y()) isLink:isLink];
    772774}
    773775#endif
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h

    r211095 r211227  
    4545#import <wtf/text/WTFString.h>
    4646
     47#if USE(APPLE_INTERNAL_SDK) && __has_include(<WebKitAdditions/WKContentViewInteractionAdditions.h>)
     48#import <WebKitAdditions/WKContentViewInteractionAdditions.h>
     49#endif
     50
    4751namespace API {
    4852class OpenPanelParameters;
     
    180184    BOOL _resigningFirstResponder;
    181185    BOOL _needsDeferredEndScrollingSelectionUpdate;
    182 }
    183 
    184 @end
    185 
    186 @interface WKContentView (WKInteraction) <UIGestureRecognizerDelegate, UIWebTouchEventsGestureRecognizerDelegate, UITextInputPrivate, UIWebFormAccessoryDelegate, UIWKInteractionViewProtocol, WKFileUploadPanelDelegate, WKActionSheetAssistantDelegate>
     186
     187#if ENABLE(DATA_INTERACTION)
     188    RetainPtr<UILongPressGestureRecognizer> _dataInteractionGestureRecognizer;
     189    RetainPtr<UIImage> _currentDataInteractionImage;
     190    CGPoint _currentDataInteractionOrigin;
     191    BOOL _shouldHandleLongPressActionAfterDataInteraction;
     192#endif
     193}
     194
     195@end
     196
     197@interface WKContentView (WKInteraction) <UIGestureRecognizerDelegate, UIWebTouchEventsGestureRecognizerDelegate, UITextInputPrivate, UIWebFormAccessoryDelegate, UIWKInteractionViewProtocol, WKFileUploadPanelDelegate, WKActionSheetAssistantDelegate
     198#if ENABLE(DATA_INTERACTION)
     199    , WKViewDataInteractionSourceDelegate, WKDataInteractionSessionDelegate, WKViewDataInteractionDestinationDelegate, WKDataInteractionItemVisualTarget
     200#endif
     201>
    187202
    188203@property (nonatomic, readonly) CGPoint lastInteractionLocation;
     
    233248- (NSArray<NSValue *> *)_uiTextSelectionRects;
    234249- (void)accessibilityRetrieveSpeakSelectionContent;
     250
     251#if ENABLE(DATA_INTERACTION)
     252- (void)_didPerformDataInteractionControllerOperation;
     253- (void)_startDataInteractionWithImage:(RetainPtr<CGImageRef>)image atClientPosition:(CGPoint)clientPosition isLink:(BOOL)isLink;
     254#endif
     255
    235256@end
    236257
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm

    r211121 r211227  
    6868#import <WebCore/DataDetectorsUISPI.h>
    6969#import <WebCore/FloatQuad.h>
     70#import <WebCore/NotImplemented.h>
    7071#import <WebCore/Pasteboard.h>
    7172#import <WebCore/Path.h>
     
    8081#import <WebKit/WebSelectionRect.h> // FIXME: WK2 should not include WebKit headers!
    8182#import <wtf/RetainPtr.h>
     83
     84#if ENABLE(DATA_INTERACTION)
     85#import <WebCore/PlatformPasteboard.h>
     86#import <WebCore/WebItemProviderPasteboard.h>
     87#endif
    8288
    8389@interface UIEvent(UIEventInternal)
     
    494500@implementation WKContentView (WKInteraction)
    495501
     502#if USE(APPLE_INTERNAL_SDK) && __has_include(<WebKitAdditions/WKContentViewInteractionAdditions.mm>)
     503#import <WebKitAdditions/WKContentViewInteractionAdditions.mm>
     504#endif
     505
    496506static UIWebSelectionMode toUIWebSelectionMode(WKSelectionGranularity granularity)
    497507{
     
    516526}
    517527
     528- (void)_createAndConfigureLongPressGestureRecognizer
     529{
     530    _longPressGestureRecognizer = adoptNS([[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_longPressRecognized:)]);
     531    [_longPressGestureRecognizer setDelay:tapAndHoldDelay];
     532    [_longPressGestureRecognizer setDelegate:self];
     533    [_longPressGestureRecognizer _setRequiresQuietImpulse:YES];
     534    [self addGestureRecognizer:_longPressGestureRecognizer.get()];
     535}
     536
    518537- (void)setupInteraction
    519538{
     
    558577    [self addGestureRecognizer:_highlightLongPressGestureRecognizer.get()];
    559578
    560     _longPressGestureRecognizer = adoptNS([[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_longPressRecognized:)]);
    561     [_longPressGestureRecognizer setDelay:tapAndHoldDelay];
    562     [_longPressGestureRecognizer setDelegate:self];
    563     [_longPressGestureRecognizer _setRequiresQuietImpulse:YES];
    564     [self addGestureRecognizer:_longPressGestureRecognizer.get()];
     579    [self _createAndConfigureLongPressGestureRecognizer];
     580
     581#if ENABLE(DATA_INTERACTION)
     582    _dataInteractionGestureRecognizer = adoptNS([[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_dataInteractionGestureRecognizer:)]);
     583    [_dataInteractionGestureRecognizer setDelay:0.25];
     584    [_dataInteractionGestureRecognizer setDelegate:self];
     585    [_dataInteractionGestureRecognizer _setRequiresQuietImpulse:YES];
     586    [self addGestureRecognizer:_dataInteractionGestureRecognizer.get()];
     587    [self setupDataInteractionDelegates];
     588#endif
    565589
    566590    _twoFingerSingleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_twoFingerSingleTapGestureRecognized:)]);
     
    638662    [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
    639663
     664#if ENABLE(DATA_INTERACTION)
     665    [_dataInteractionGestureRecognizer setDelegate:nil];
     666    [self removeGestureRecognizer:_dataInteractionGestureRecognizer.get()];
     667    [self teardownDataInteractionDelegates];
     668#endif
     669
    640670    _inspectorNodeSearchEnabled = NO;
    641671    if (_inspectorNodeSearchGestureRecognizer) {
     
    665695    [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
    666696    [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     697#if ENABLE(DATA_INTERACTION)
     698    [self removeGestureRecognizer:_dataInteractionGestureRecognizer.get()];
     699#endif
    667700}
    668701
     
    676709    [self addGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
    677710    [self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     711#if ENABLE(DATA_INTERACTION)
     712    [self addGestureRecognizer:_dataInteractionGestureRecognizer.get()];
     713#endif
    678714}
    679715
     
    813849- (BOOL)resignFirstResponder
    814850{
     851#if ENABLE(DATA_INTERACTION)
     852    _shouldHandleLongPressActionAfterDataInteraction = NO;
     853#endif
    815854    // FIXME: Maybe we should call resignFirstResponder on the superclass
    816855    // and do nothing if the return value is NO.
     
    11911230        return YES;
    11921231
     1232#if ENABLE(DATA_INTERACTION)
     1233    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _dataInteractionGestureRecognizer.get()))
     1234        return YES;
     1235
     1236    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _longPressGestureRecognizer.get(), _dataInteractionGestureRecognizer.get()))
     1237        return YES;
     1238#endif
     1239
    11931240    return NO;
    11941241}
     
    13611408    }
    13621409
     1410#if ENABLE(DATA_INTERACTION)
     1411    if (gestureRecognizer == _dataInteractionGestureRecognizer)
     1412        return [self pointIsInDataInteractionContent:point];
     1413#endif
     1414
    13631415    return YES;
    13641416}
     
    13911443    InteractionInformationRequest request(roundedIntPoint(point));
    13921444    [self ensurePositionInformationIsUpToDate:request];
     1445
     1446#if ENABLE(DATA_INTERACTION)
     1447    if (_positionInformation.hasDataInteractionAtPosition) {
     1448        // If the position might initiate a data interaction, we don't want to consider the content at this position to be selectable.
     1449        // FIXME: This should be renamed to something more precise, such as textSelectionShouldRecognizeGestureAtPoint:
     1450        return NO;
     1451    }
     1452#endif
     1453
    13931454    return _positionInformation.isSelectable;
    13941455}
     1456
     1457#if ENABLE(DATA_INTERACTION)
     1458
     1459- (BOOL)pointIsInDataInteractionContent:(CGPoint)point
     1460{
     1461    InteractionInformationRequest request(roundedIntPoint(point));
     1462    [self ensurePositionInformationIsUpToDate:request];
     1463
     1464    if (_positionInformation.isImage)
     1465        return YES;
     1466
     1467    // FIXME: Add support for links.
     1468    if (_positionInformation.isLink)
     1469        return NO;
     1470
     1471    return _positionInformation.hasDataInteractionAtPosition;
     1472}
     1473
     1474#endif
    13951475
    13961476- (BOOL)pointIsNearMarkedText:(CGPoint)point
     
    14051485    InteractionInformationRequest request(roundedIntPoint(point));
    14061486    [self ensurePositionInformationIsUpToDate:request];
     1487
     1488#if ENABLE(DATA_INTERACTION)
     1489    if (_positionInformation.hasDataInteractionAtPosition) {
     1490        // If the position might initiate data interaction, we don't want to change the selection.
     1491        // FIXME: This should be renamed to something more precise, such as textInteractionShouldRecognizeGestureAtPoint:
     1492        return NO;
     1493    }
     1494#endif
     1495
    14071496    return _positionInformation.nodeAtPositionIsAssistedNode;
    14081497}
Note: See TracChangeset for help on using the changeset viewer.