Changeset 246122 in webkit


Ignore:
Timestamp:
Jun 5, 2019 12:21:38 PM (5 years ago)
Author:
commit-queue@webkit.org
Message:

[Pointer Events] Fire pointerout and pointerleave events after firing pointercancel
https://bugs.webkit.org/show_bug.cgi?id=198560

Patch by Antoine Quint <Antoine Quint> on 2019-06-05
Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

Mark WPT progressions. Notably, the iOS-specific tests now have 100% PASS rate.

  • web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt:
  • web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt:
  • web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt:
  • web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt:

Source/WebCore:

The Pointer Events specification mandates that "pointerout" and "pointerleave" events must be dispatched
immediately after dispatching a "pointercancel" event.

Since we needed to determine the bubbling, cancelable and composed nature of those events in additional
places, we now have static methods to determine this defined in PointerEvent.h such that both PointerEvent.cpp
and PointerEventIOS.cpp may use them. This should guarantee consistency going forward.

  • dom/PointerEvent.cpp:

(WebCore::PointerEvent::create):
(WebCore::PointerEvent::PointerEvent):

  • dom/PointerEvent.h:
  • dom/ios/PointerEventIOS.cpp:

(WebCore::pointerEventType):
(WebCore::PointerEvent::create):
(WebCore::PointerEvent::PointerEvent):
(WebCore::phaseIsCancelable): Deleted.
(WebCore::typeCanBubble): Deleted.

  • page/PointerCaptureController.cpp:

(WebCore::PointerCaptureController::cancelPointer):

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r246104 r246122  
     12019-06-05  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Fire pointerout and pointerleave events after firing pointercancel
     4        https://bugs.webkit.org/show_bug.cgi?id=198560
     5
     6        Reviewed by Dean Jackson.
     7
     8        Mark WPT progressions. Notably, the iOS-specific tests now have 100% PASS rate.
     9
     10        * web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt:
     11        * web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt:
     12        * web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt:
     13        * web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt:
     14
    1152019-06-05  Javier Fernandez  <jfernandez@igalia.com>
    216
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt

    r246103 r246122  
    11
    22FAIL Mouse down and capture to green. assert_array_equals: Received events: green received pointerover,green received pointerenter,green received pointermove,green received pointerdown,green received gotpointercapture,green received pointermove,green received pointerout,green received pointerleave,green received pointerover,green received pointerenter,green received pointermove lengths differ, expected 7 got 11
    3 FAIL Mouse down at green and capture to blue. assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received pointermove,green received pointermove lengths differ, expected 11 got 6
    4 FAIL Mouse down and capture to green, move to blue and release capture assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received lostpointercapture,green received pointerout,green received pointerleave,blue received pointerover,blue received pointerenter,blue received pointermove,blue received pointermove lengths differ, expected 12 got 11
     3FAIL Mouse down at green and capture to blue. assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received pointermove,green received pointermove,green received pointermove lengths differ, expected 11 got 7
     4FAIL Mouse down and capture to green, move to blue and release capture assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received lostpointercapture,green received pointermove,green received pointerout,green received pointerleave,blue received pointerover,blue received pointerenter,blue received pointermove,blue received pointermove property 0, expected "green received pointerover" but got "green received pointerout"
    55
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt

    r245020 r246122  
    1212
    1313
    14 FAIL pointercancel event received assert_true: pointerleave should be received before the test finished expected true got false
     14PASS pointercancel event received
    1515PASS  touch pointercancel event is a PointerEvent event
    1616PASS  touch pointercancel.pointerId attribute exists
     
    4949PASS  touch pointercancel.toElement is readonly
    5050PASS  touch pointercancel.toElement IDL type object (JS type was object)
    51 FAIL  touch pointercancel.toElement value is null. assert_equals: toElement attribute value expected null but got Element node <div id="target0" style="background: black"></div>
     51PASS  touch pointercancel.toElement value is null.
    5252PASS  touch pointercancel.pressure value is valid
    5353
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt

    r245584 r246122  
    1010
    1111
    12 FAIL pointerleave event received assert_true: pointerleave should be received before the test finishes expected true got false
     12PASS pointerleave event received
    1313
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt

    r245584 r246122  
    1010
    1111
    12 FAIL pointerout event received assert_true: pointerout should be received before the test finishes expected true got false
     12PASS pointerout event received
    1313
  • trunk/Source/WebCore/ChangeLog

    r246121 r246122  
     12019-06-05  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Fire pointerout and pointerleave events after firing pointercancel
     4        https://bugs.webkit.org/show_bug.cgi?id=198560
     5
     6        Reviewed by Dean Jackson.
     7
     8        The Pointer Events specification mandates that "pointerout" and "pointerleave" events must be dispatched
     9        immediately after dispatching a "pointercancel" event.
     10
     11        Since we needed to determine the bubbling, cancelable and composed nature of those events in additional
     12        places, we now have static methods to determine this defined in PointerEvent.h such that both PointerEvent.cpp
     13        and PointerEventIOS.cpp may use them. This should guarantee consistency going forward.
     14
     15        * dom/PointerEvent.cpp:
     16        (WebCore::PointerEvent::create):
     17        (WebCore::PointerEvent::PointerEvent):
     18        * dom/PointerEvent.h:
     19        * dom/ios/PointerEventIOS.cpp:
     20        (WebCore::pointerEventType):
     21        (WebCore::PointerEvent::create):
     22        (WebCore::PointerEvent::PointerEvent):
     23        (WebCore::phaseIsCancelable): Deleted.
     24        (WebCore::typeCanBubble): Deleted.
     25        * page/PointerCaptureController.cpp:
     26        (WebCore::PointerCaptureController::cancelPointer):
     27
    1282019-06-05  Saam Barati  <sbarati@apple.com>
    229
  • trunk/Source/WebCore/dom/PointerEvent.cpp

    r246103 r246122  
    8383Ref<PointerEvent> PointerEvent::create(const String& type, short button, const MouseEvent& mouseEvent)
    8484{
    85     auto isEnterOrLeave = type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent;
    86     auto canBubble = isEnterOrLeave ? CanBubble::No : CanBubble::Yes;
    87     auto isCancelable = isEnterOrLeave ? IsCancelable::No : IsCancelable::Yes;
    88     auto isComposed = isEnterOrLeave ? IsComposed::No : IsComposed::Yes;
    89     return adoptRef(*new PointerEvent(type, canBubble, isCancelable, isComposed, button, mouseEvent));
     85    return adoptRef(*new PointerEvent(type, button, mouseEvent));
    9086}
    9187
    9288Ref<PointerEvent> PointerEvent::create(const String& type, PointerID pointerId, const String& pointerType, IsPrimary isPrimary)
    9389{
    94     return adoptRef(*new PointerEvent(type, CanBubble::Yes, IsCancelable::No, IsComposed::Yes, pointerId, pointerType, isPrimary));
     90    return adoptRef(*new PointerEvent(type, pointerId, pointerType, isPrimary));
    9591}
    9692
     
    112108}
    113109
    114 PointerEvent::PointerEvent(const AtomicString& type, CanBubble canBubble, IsCancelable isCancelable, IsComposed isComposed, short button, const MouseEvent& mouseEvent)
    115     : MouseEvent(type, canBubble, isCancelable, isComposed, mouseEvent.view(), mouseEvent.detail(), mouseEvent.screenLocation(), { mouseEvent.clientX(), mouseEvent.clientY() }, mouseEvent.modifierKeys(), button, mouseEvent.buttons(), mouseEvent.syntheticClickType(), mouseEvent.relatedTarget())
     110PointerEvent::PointerEvent(const AtomicString& type, short button, const MouseEvent& mouseEvent)
     111    : MouseEvent(type, typeCanBubble(type), typeIsCancelable(type), typeIsComposed(type), mouseEvent.view(), mouseEvent.detail(), mouseEvent.screenLocation(), { mouseEvent.clientX(), mouseEvent.clientY() }, mouseEvent.modifierKeys(), button, mouseEvent.buttons(), mouseEvent.syntheticClickType(), mouseEvent.relatedTarget())
    116112    , m_isPrimary(true)
    117113{
    118114}
    119115
    120 PointerEvent::PointerEvent(const AtomicString& type, CanBubble canBubble, IsCancelable isCancelable, IsComposed isComposed, PointerID pointerId, const String& pointerType, IsPrimary isPrimary)
    121     : MouseEvent(type, canBubble, isCancelable, isComposed, nullptr, 0, { }, { }, { }, 0, 0, 0, nullptr)
     116PointerEvent::PointerEvent(const AtomicString& type, PointerID pointerId, const String& pointerType, IsPrimary isPrimary)
     117    : MouseEvent(type, typeCanBubble(type), typeIsCancelable(type), typeIsComposed(type), nullptr, 0, { }, { }, { }, 0, 0, 0, nullptr)
    122118    , m_pointerId(pointerId)
    123119    , m_pointerType(pointerType)
  • trunk/Source/WebCore/dom/PointerEvent.h

    r246103 r246122  
    2828#if ENABLE(POINTER_EVENTS)
    2929
     30#include "EventNames.h"
    3031#include "MouseEvent.h"
    3132#include "Node.h"
     
    115116
    116117private:
     118    static bool typeIsEnterOrLeave(const AtomicString& type) { return type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent; }
     119    static CanBubble typeCanBubble(const AtomicString& type) { return typeIsEnterOrLeave(type) ? CanBubble::No : CanBubble::Yes; }
     120    static IsCancelable typeIsCancelable(const AtomicString& type) { return typeIsEnterOrLeave(type) ? IsCancelable::No : IsCancelable::Yes; }
     121    static IsComposed typeIsComposed(const AtomicString& type) { return typeIsEnterOrLeave(type) ? IsComposed::No : IsComposed::Yes; }
     122
    117123    PointerEvent();
    118124    PointerEvent(const AtomicString&, Init&&);
    119     PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, short button, const MouseEvent&);
    120     PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, PointerID, const String& pointerType, IsPrimary);
     125    PointerEvent(const AtomicString& type, short button, const MouseEvent&);
     126    PointerEvent(const AtomicString& type, PointerID, const String& pointerType, IsPrimary);
    121127#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
    122128    PointerEvent(const AtomicString& type, const PlatformTouchEvent&, IsCancelable isCancelable, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&);
  • trunk/Source/WebCore/dom/ios/PointerEventIOS.cpp

    r246061 r246122  
    3333namespace WebCore {
    3434
    35 static AtomicString pointerEventType(PlatformTouchPoint::TouchPhaseType phase)
     35static const AtomicString& pointerEventType(PlatformTouchPoint::TouchPhaseType phase)
    3636{
    3737    switch (phase) {
     
    5151}
    5252
    53 static PointerEvent::IsCancelable phaseIsCancelable(PlatformTouchPoint::TouchPhaseType phase)
    54 {
    55     if (phase == PlatformTouchPoint::TouchPhaseCancelled)
    56         return PointerEvent::IsCancelable::No;
    57     return PointerEvent::IsCancelable::Yes;
    58 }
    59 
    60 static Event::CanBubble typeCanBubble(const AtomicString& type)
    61 {
    62     return (type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent) ? Event::CanBubble::No : Event::CanBubble::Yes;
    63 }
    64 
    6553Ref<PointerEvent> PointerEvent::create(const PlatformTouchEvent& event, unsigned index, bool isPrimary, Ref<WindowProxy>&& view)
    6654{
    67     auto phase = event.touchPhaseAtIndex(index);
    68     return adoptRef(*new PointerEvent(pointerEventType(phase), event, phaseIsCancelable(phase), index, isPrimary, WTFMove(view)));
     55    const auto& type = pointerEventType(event.touchPhaseAtIndex(index));
     56    return adoptRef(*new PointerEvent(type, event, typeIsCancelable(type), index, isPrimary, WTFMove(view)));
    6957}
    7058
    7159Ref<PointerEvent> PointerEvent::create(const String& type, const PlatformTouchEvent& event, unsigned index, bool isPrimary, Ref<WindowProxy>&& view)
    7260{
    73     return adoptRef(*new PointerEvent(type, event, phaseIsCancelable(event.touchPhaseAtIndex(index)), index, isPrimary, WTFMove(view)));
     61    return adoptRef(*new PointerEvent(type, event, typeIsCancelable(type), index, isPrimary, WTFMove(view)));
    7462}
    7563
    7664PointerEvent::PointerEvent(const AtomicString& type, const PlatformTouchEvent& event, IsCancelable isCancelable, unsigned index, bool isPrimary, Ref<WindowProxy>&& view)
    77     : MouseEvent(type, typeCanBubble(type), isCancelable, IsComposed::Yes, event.timestamp().approximateMonotonicTime(), WTFMove(view), 0, event.touchLocationAtIndex(index), event.touchLocationAtIndex(index), { }, event.modifiers(), 0, 0, nullptr, 0, 0, nullptr, IsSimulated::No, IsTrusted::Yes)
     65    : MouseEvent(type, typeCanBubble(type), isCancelable, typeIsComposed(type), event.timestamp().approximateMonotonicTime(), WTFMove(view), 0, event.touchLocationAtIndex(index), event.touchLocationAtIndex(index), { }, event.modifiers(), 0, 0, nullptr, 0, 0, nullptr, IsSimulated::No, IsTrusted::Yes)
    7866    , m_pointerId(event.touchIdentifierAtIndex(index))
    7967    , m_width(2 * event.radiusXAtIndex(index))
  • trunk/Source/WebCore/page/PointerCaptureController.cpp

    r246103 r246122  
    390390        return;
    391391
    392     auto event = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType, capturingData.isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No);
    393     target->dispatchEvent(event);
    394     processPendingPointerCapture(WTFMove(event));
     392    // After firing the pointercancel event, a user agent MUST also fire a pointer event named pointerout
     393    // followed by firing a pointer event named pointerleave.
     394    auto isPrimary = capturingData.isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No;
     395    auto cancelEvent = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType, isPrimary);
     396    target->dispatchEvent(cancelEvent);
     397    target->dispatchEvent(PointerEvent::create(eventNames().pointeroutEvent, pointerId, capturingData.pointerType, isPrimary));
     398    target->dispatchEvent(PointerEvent::create(eventNames().pointerleaveEvent, pointerId, capturingData.pointerType, isPrimary));
     399    processPendingPointerCapture(WTFMove(cancelEvent));
    395400}
    396401
Note: See TracChangeset for help on using the changeset viewer.