Changeset 244775 in webkit


Ignore:
Timestamp:
Apr 30, 2019 9:07:48 AM (5 years ago)
Author:
Alan Bujtas
Message:

Source/WebCore:
Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
https://bugs.webkit.org/show_bug.cgi?id=197347
<rdar://problem/49393423>

Reviewed by Wenson Hsieh.

Tests: fast/events/touch/ios/double-tap-for-double-click1.html

fast/events/touch/ios/double-tap-for-double-click2.html

  • page/Frame.h:
  • page/ios/FrameIOS.mm:

(WebCore::Frame::nodeRespondingToDoubleClickEvent):

Source/WebKit:
[iOS] Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
https://bugs.webkit.org/show_bug.cgi?id=197347
<rdar://problem/49393423>

Reviewed by Wenson Hsieh.

This patch adds support for dispatching dblclick event as the result of the double tap gesture.

  1. The new double tap gesture recognizer always fires regardless of what type of action the other, existing double gesture recognizers (double-tap to zoom) trigger.
  2. The dblclick event is dispatched on the node with registered dblclick event handler unless the node prohibits double tap gesture (touch-action != auto).
  • UIProcess/WebPageProxy.h:
  • UIProcess/ios/WKContentViewInteraction.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView setupInteraction]):
(-[WKContentView cleanupInteraction]):
(-[WKContentView _removeDefaultGestureRecognizers]):
(-[WKContentView _addDefaultGestureRecognizers]):
(-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
(-[WKContentView gestureRecognizerShouldBegin:]):
(-[WKContentView _doubleTapRecognizedForDoubleClick:]):

  • UIProcess/ios/WebPageProxyIOS.mm:

(WebKit::WebPageProxy::handleDoubleTapForDoubleClickAtPoint):

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:
  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::handleDoubleTapForDoubleClickAtPoint):

LayoutTests:
Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
https://bugs.webkit.org/show_bug.cgi?id=197347
<rdar://problem/49393423>

Reviewed by Wenson Hsieh.

  • fast/events/touch/ios/double-tap-for-double-click1-expected.txt: Added.
  • fast/events/touch/ios/double-tap-for-double-click1.html: Added.
  • fast/events/touch/ios/double-tap-for-double-click2-expected.txt: Added.
  • fast/events/touch/ios/double-tap-for-double-click2.html: Added.
Location:
trunk
Files:
6 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244774 r244775  
     12019-04-30  Zalan Bujtas  <zalan@apple.com>
     2
     3        Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
     4        https://bugs.webkit.org/show_bug.cgi?id=197347
     5        <rdar://problem/49393423>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        * fast/events/touch/ios/double-tap-for-double-click1-expected.txt: Added.
     10        * fast/events/touch/ios/double-tap-for-double-click1.html: Added.
     11        * fast/events/touch/ios/double-tap-for-double-click2-expected.txt: Added.
     12        * fast/events/touch/ios/double-tap-for-double-click2.html: Added.
     13
    1142019-04-30  Youenn Fablet  <youenn@apple.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r244774 r244775  
     12019-04-30  Zalan Bujtas  <zalan@apple.com>
     2
     3        Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
     4        https://bugs.webkit.org/show_bug.cgi?id=197347
     5        <rdar://problem/49393423>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        Tests: fast/events/touch/ios/double-tap-for-double-click1.html
     10               fast/events/touch/ios/double-tap-for-double-click2.html
     11
     12        * page/Frame.h:
     13        * page/ios/FrameIOS.mm:
     14        (WebCore::Frame::nodeRespondingToDoubleClickEvent):
     15
    1162019-04-30  Youenn Fablet  <youenn@apple.com>
    217
  • trunk/Source/WebCore/page/Frame.h

    r244762 r244775  
    220220    WEBCORE_EXPORT Node* deepestNodeAtLocation(const FloatPoint& viewportLocation);
    221221    WEBCORE_EXPORT Node* nodeRespondingToClickEvents(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation, SecurityOrigin* = nullptr);
     222    WEBCORE_EXPORT Node* nodeRespondingToDoubleClickEvent(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation);
    222223    WEBCORE_EXPORT Node* nodeRespondingToScrollWheelEvents(const FloatPoint& viewportLocation);
    223224
  • trunk/Source/WebCore/page/ios/FrameIOS.mm

    r244762 r244775  
    419419}
    420420
     421Node* Frame::nodeRespondingToDoubleClickEvent(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation)
     422{
     423    auto&& ancestorRespondingToDoubleClickEvent = [](const HitTestResult& hitTestResult, Node* terminationNode, IntRect* nodeBounds) -> Node* {
     424        if (nodeBounds)
     425            *nodeBounds = IntRect();
     426
     427        auto* node = hitTestResult.innerNode();
     428        if (!node)
     429            return nullptr;
     430
     431        for (; node && node != terminationNode; node = node->parentInComposedTree()) {
     432            if (!node->hasEventListeners(eventNames().dblclickEvent))
     433                continue;
     434#if ENABLE(TOUCH_EVENTS)
     435            if (!node->allowsDoubleTapGesture())
     436                continue;
     437#endif
     438            if (nodeBounds && node->renderer())
     439                *nodeBounds = node->renderer()->absoluteBoundingBoxRect(true);
     440            return node;
     441        }
     442        return nullptr;
     443    };
     444
     445    return qualifyingNodeAtViewportLocation(viewportLocation, adjustedViewportLocation, WTFMove(ancestorRespondingToDoubleClickEvent), true);
     446}
     447
    421448Node* Frame::nodeRespondingToScrollWheelEvents(const FloatPoint& viewportLocation)
    422449{
  • trunk/Source/WebKit/ChangeLog

    r244772 r244775  
     12019-04-30  Zalan Bujtas  <zalan@apple.com>
     2
     3        [iOS] Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
     4        https://bugs.webkit.org/show_bug.cgi?id=197347
     5        <rdar://problem/49393423>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        This patch adds support for dispatching dblclick event as the result of the double tap gesture.
     10
     11        1. The new double tap gesture recognizer always fires regardless of what type of action the other, existing double gesture recognizers (double-tap to zoom) trigger.
     12        2. The dblclick event is dispatched on the node with registered dblclick event handler unless the node prohibits double tap gesture (touch-action != auto).
     13
     14        * UIProcess/WebPageProxy.h:
     15        * UIProcess/ios/WKContentViewInteraction.h:
     16        * UIProcess/ios/WKContentViewInteraction.mm:
     17        (-[WKContentView setupInteraction]):
     18        (-[WKContentView cleanupInteraction]):
     19        (-[WKContentView _removeDefaultGestureRecognizers]):
     20        (-[WKContentView _addDefaultGestureRecognizers]):
     21        (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
     22        (-[WKContentView gestureRecognizerShouldBegin:]):
     23        (-[WKContentView _doubleTapRecognizedForDoubleClick:]):
     24        * UIProcess/ios/WebPageProxyIOS.mm:
     25        (WebKit::WebPageProxy::handleDoubleTapForDoubleClickAtPoint):
     26        * WebProcess/WebPage/WebPage.h:
     27        * WebProcess/WebPage/WebPage.messages.in:
     28        * WebProcess/WebPage/ios/WebPageIOS.mm:
     29        (WebKit::WebPage::handleDoubleTapForDoubleClickAtPoint):
     30
    1312019-04-30  Antti Koivisto  <antti@apple.com>
    232
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r244762 r244775  
    12111211    void handleTap(const WebCore::FloatPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart);
    12121212    void didRecognizeLongPress();
     1213    void handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint&, OptionSet<WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart);
    12131214
    12141215    void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h

    r244762 r244775  
    222222    RetainPtr<WKSyntheticTapGestureRecognizer> _doubleTapGestureRecognizer;
    223223    RetainPtr<UITapGestureRecognizer> _nonBlockingDoubleTapGestureRecognizer;
     224    RetainPtr<UITapGestureRecognizer> _doubleTapGestureRecognizerForDoubleClick;
    224225    RetainPtr<UITapGestureRecognizer> _twoFingerDoubleTapGestureRecognizer;
    225226    RetainPtr<UITapGestureRecognizer> _twoFingerSingleTapGestureRecognizer;
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r244762 r244775  
    735735    [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
    736736
     737    _doubleTapGestureRecognizerForDoubleClick = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_doubleTapRecognizedForDoubleClick:)]);
     738    [_doubleTapGestureRecognizerForDoubleClick setNumberOfTapsRequired:2];
     739    [_doubleTapGestureRecognizerForDoubleClick setDelegate:self];
     740    [_doubleTapGestureRecognizerForDoubleClick setEnabled:YES];
     741    [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
     742
    737743    [self _createAndConfigureDoubleTapGestureRecognizer];
    738744
     
    868874    [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
    869875
     876    [_doubleTapGestureRecognizerForDoubleClick setDelegate:nil];
     877    [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
     878
    870879    [_twoFingerDoubleTapGestureRecognizer setDelegate:nil];
    871880    [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
     
    941950    [self removeGestureRecognizer:_doubleTapGestureRecognizer.get()];
    942951    [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
     952    [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
    943953    [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
    944954    [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     
    957967    [self addGestureRecognizer:_doubleTapGestureRecognizer.get()];
    958968    [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
     969    [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
    959970    [self addGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
    960971    [self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     
    17801791        return YES;
    17811792
     1793    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _singleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
     1794        return YES;
     1795
     1796    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _nonBlockingDoubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
     1797        return YES;
     1798
     1799    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _doubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
     1800        return YES;
     1801
    17821802    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _previewSecondaryGestureRecognizer.get()))
    17831803        return YES;
     
    19761996        || gestureRecognizer == _doubleTapGestureRecognizer
    19771997        || gestureRecognizer == _nonBlockingDoubleTapGestureRecognizer
     1998        || gestureRecognizer == _doubleTapGestureRecognizerForDoubleClick
    19781999        || gestureRecognizer == _twoFingerDoubleTapGestureRecognizer) {
    19792000
     
    23762397    _lastInteractionLocation = gestureRecognizer.location;
    23772398    _isDoubleTapPending = YES;
     2399}
     2400
     2401- (void)_doubleTapRecognizedForDoubleClick:(UITapGestureRecognizer *)gestureRecognizer
     2402{
     2403    _page->handleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint(gestureRecognizer.location), WebKit::webEventModifierFlags(gestureRecognizerModifierFlags(gestureRecognizer)), _layerTreeTransactionIdAtLastTouchStart);
    23782404}
    23792405
  • trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm

    r244762 r244775  
    868868}
    869869
     870void WebPageProxy::handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t layerTreeTransactionIdAtLastTouchStart)
     871{
     872    process().send(Messages::WebPage::HandleDoubleTapForDoubleClickAtPoint(point, modifiers, layerTreeTransactionIdAtLastTouchStart), m_pageID);
     873}
     874
    870875void WebPageProxy::inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint& position)
    871876{
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r244762 r244775  
    623623    void tapHighlightAtPosition(uint64_t requestID, const WebCore::FloatPoint&);
    624624    void didRecognizeLongPress();
     625    void handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId);
    625626
    626627    void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r244762 r244775  
    5858    TapHighlightAtPosition(uint64_t requestID, WebCore::FloatPoint point)
    5959    DidRecognizeLongPress()
     60    HandleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint point, OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
    6061    InspectorNodeSearchMovedToPosition(WebCore::FloatPoint point)
    6162    InspectorNodeSearchEndedAtPosition(WebCore::FloatPoint point)
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r244762 r244775  
    723723}
    724724
     725void WebPage::handleDoubleTapForDoubleClickAtPoint(const IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
     726{
     727    FloatPoint adjustedPoint;
     728    auto* nodeRespondingToDoubleClick = m_page->mainFrame().nodeRespondingToDoubleClickEvent(point, adjustedPoint);
     729    if (!nodeRespondingToDoubleClick)
     730        return;
     731
     732    auto* frameRespondingToDoubleClick = nodeRespondingToDoubleClick->document().frame();
     733    if (!frameRespondingToDoubleClick || lastLayerTreeTransactionId < WebFrame::fromCoreFrame(*frameRespondingToDoubleClick)->firstLayerTreeTransactionIDAfterDidCommitLoad())
     734        return;
     735
     736    bool shiftKey = modifiers.contains(WebEvent::Modifier::ShiftKey);
     737    bool ctrlKey = modifiers.contains(WebEvent::Modifier::ControlKey);
     738    bool altKey = modifiers.contains(WebEvent::Modifier::AltKey);
     739    bool metaKey = modifiers.contains(WebEvent::Modifier::MetaKey);
     740    auto roundedAdjustedPoint = roundedIntPoint(adjustedPoint);
     741    nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMousePressEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MousePressed, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
     742    if (m_isClosed)
     743        return;
     744    nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMouseReleaseEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MouseReleased, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
     745}
     746
    725747void WebPage::requestFocusedElementInformation(WebKit::CallbackID callbackID)
    726748{
Note: See TracChangeset for help on using the changeset viewer.