Changeset 244755 in webkit


Ignore:
Timestamp:
Apr 29, 2019 2:31:00 PM (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

    r244752 r244755  
     12019-04-29  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-29  Javier Fernandez  <jfernandez@igalia.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r244752 r244755  
     12019-04-29  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-29  Youenn Fablet  <youenn@apple.com>
    217
  • trunk/Source/WebCore/page/Frame.h

    r243735 r244755  
    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

    r243919 r244755  
    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

    r244754 r244755  
     12019-04-29  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-29  Tim Horton  <timothy_horton@apple.com>
    232
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r244633 r244755  
    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

    r244751 r244755  
    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

    r244586 r244755  
    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, _nonBlockingDoubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
     1794        return YES;
     1795
     1796    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _doubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
     1797        return YES;
     1798
    17821799    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _previewSecondaryGestureRecognizer.get()))
    17831800        return YES;
     
    19761993        || gestureRecognizer == _doubleTapGestureRecognizer
    19771994        || gestureRecognizer == _nonBlockingDoubleTapGestureRecognizer
     1995        || gestureRecognizer == _doubleTapGestureRecognizerForDoubleClick
    19781996        || gestureRecognizer == _twoFingerDoubleTapGestureRecognizer) {
    19791997
     
    23762394    _lastInteractionLocation = gestureRecognizer.location;
    23772395    _isDoubleTapPending = YES;
     2396}
     2397
     2398- (void)_doubleTapRecognizedForDoubleClick:(UITapGestureRecognizer *)gestureRecognizer
     2399{
     2400    _page->handleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint(gestureRecognizer.location), WebKit::webEventModifierFlags(gestureRecognizerModifierFlags(gestureRecognizer)), _layerTreeTransactionIdAtLastTouchStart);
    23782401}
    23792402
  • trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm

    r244559 r244755  
    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

    r244717 r244755  
    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

    r244582 r244755  
    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

    r244682 r244755  
    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.