WebKit Bugzilla
Attachment 371388 Details for
Bug 198560
: [Pointer Events] Fire pointerout and pointerleave events after firing pointercancel
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198560-20190605140228.patch (text/plain), 17.66 KB, created by
Antoine Quint
on 2019-06-05 05:02:30 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Antoine Quint
Created:
2019-06-05 05:02:30 PDT
Size:
17.66 KB
patch
obsolete
>Subversion Revision: 246103 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 9e7d226de2ddffe2b80e5067f84fbf780fb64f65..614461c408cdc11cefc2182842512d9091296209 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,30 @@ >+2019-06-05 Antoine Quint <graouts@apple.com> >+ >+ [Pointer Events] Fire pointerout and pointerleave events after firing pointercancel >+ https://bugs.webkit.org/show_bug.cgi?id=198560 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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): >+ > 2019-06-01 Antoine Quint <graouts@apple.com> > > [Pointer Events] Add support for chorded button interactions >diff --git a/Source/WebCore/dom/PointerEvent.cpp b/Source/WebCore/dom/PointerEvent.cpp >index 93e37f034c77bdc387b8872d73bfb94cd218086d..01150983bc5592ebc00b6eff2049d2d128763ed6 100644 >--- a/Source/WebCore/dom/PointerEvent.cpp >+++ b/Source/WebCore/dom/PointerEvent.cpp >@@ -82,16 +82,12 @@ RefPtr<PointerEvent> PointerEvent::create(short button, const MouseEvent& mouseE > > Ref<PointerEvent> PointerEvent::create(const String& type, short button, const MouseEvent& mouseEvent) > { >- auto isEnterOrLeave = type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent; >- auto canBubble = isEnterOrLeave ? CanBubble::No : CanBubble::Yes; >- auto isCancelable = isEnterOrLeave ? IsCancelable::No : IsCancelable::Yes; >- auto isComposed = isEnterOrLeave ? IsComposed::No : IsComposed::Yes; >- return adoptRef(*new PointerEvent(type, canBubble, isCancelable, isComposed, button, mouseEvent)); >+ return adoptRef(*new PointerEvent(type, button, mouseEvent)); > } > > Ref<PointerEvent> PointerEvent::create(const String& type, PointerID pointerId, const String& pointerType, IsPrimary isPrimary) > { >- return adoptRef(*new PointerEvent(type, CanBubble::Yes, IsCancelable::No, IsComposed::Yes, pointerId, pointerType, isPrimary)); >+ return adoptRef(*new PointerEvent(type, pointerId, pointerType, isPrimary)); > } > > PointerEvent::PointerEvent() = default; >@@ -111,14 +107,14 @@ PointerEvent::PointerEvent(const AtomicString& type, Init&& initializer) > { > } > >-PointerEvent::PointerEvent(const AtomicString& type, CanBubble canBubble, IsCancelable isCancelable, IsComposed isComposed, short button, const MouseEvent& mouseEvent) >- : MouseEvent(type, canBubble, isCancelable, isComposed, mouseEvent.view(), mouseEvent.detail(), mouseEvent.screenLocation(), { mouseEvent.clientX(), mouseEvent.clientY() }, mouseEvent.modifierKeys(), button, mouseEvent.buttons(), mouseEvent.syntheticClickType(), mouseEvent.relatedTarget()) >+PointerEvent::PointerEvent(const AtomicString& type, short button, const MouseEvent& mouseEvent) >+ : 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()) > , m_isPrimary(true) > { > } > >-PointerEvent::PointerEvent(const AtomicString& type, CanBubble canBubble, IsCancelable isCancelable, IsComposed isComposed, PointerID pointerId, const String& pointerType, IsPrimary isPrimary) >- : MouseEvent(type, canBubble, isCancelable, isComposed, nullptr, 0, { }, { }, { }, 0, 0, 0, nullptr) >+PointerEvent::PointerEvent(const AtomicString& type, PointerID pointerId, const String& pointerType, IsPrimary isPrimary) >+ : MouseEvent(type, typeCanBubble(type), typeIsCancelable(type), typeIsComposed(type), nullptr, 0, { }, { }, { }, 0, 0, 0, nullptr) > , m_pointerId(pointerId) > , m_pointerType(pointerType) > , m_isPrimary(isPrimary == IsPrimary::Yes) >diff --git a/Source/WebCore/dom/PointerEvent.h b/Source/WebCore/dom/PointerEvent.h >index bc7c97ffdda7e09a42bae8ffab151e5907bb339f..1ec736799ccb0c4f7413ca8e6ab63bd7ef47ea0d 100644 >--- a/Source/WebCore/dom/PointerEvent.h >+++ b/Source/WebCore/dom/PointerEvent.h >@@ -27,6 +27,7 @@ > > #if ENABLE(POINTER_EVENTS) > >+#include "EventNames.h" > #include "MouseEvent.h" > #include "Node.h" > #include "PointerID.h" >@@ -114,10 +115,15 @@ public: > EventInterface eventInterface() const override; > > private: >+ static bool typeIsEnterOrLeave(const AtomicString& type) { return type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent; } >+ static CanBubble typeCanBubble(const AtomicString& type) { return typeIsEnterOrLeave(type) ? CanBubble::No : CanBubble::Yes; } >+ static IsCancelable typeIsCancelable(const AtomicString& type) { return typeIsEnterOrLeave(type) ? IsCancelable::No : IsCancelable::Yes; } >+ static IsComposed typeIsComposed(const AtomicString& type) { return typeIsEnterOrLeave(type) ? IsComposed::No : IsComposed::Yes; } >+ > PointerEvent(); > PointerEvent(const AtomicString&, Init&&); >- PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, short button, const MouseEvent&); >- PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, PointerID, const String& pointerType, IsPrimary); >+ PointerEvent(const AtomicString& type, short button, const MouseEvent&); >+ PointerEvent(const AtomicString& type, PointerID, const String& pointerType, IsPrimary); > #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY) > PointerEvent(const AtomicString& type, const PlatformTouchEvent&, IsCancelable isCancelable, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&); > #endif >diff --git a/Source/WebCore/dom/ios/PointerEventIOS.cpp b/Source/WebCore/dom/ios/PointerEventIOS.cpp >index b687300da486a2a13d6673b14ced054710697423..0e3c076719d136ce75fa06c798aeaef400bd4838 100644 >--- a/Source/WebCore/dom/ios/PointerEventIOS.cpp >+++ b/Source/WebCore/dom/ios/PointerEventIOS.cpp >@@ -32,7 +32,7 @@ > > namespace WebCore { > >-static AtomicString pointerEventType(PlatformTouchPoint::TouchPhaseType phase) >+static const AtomicString& pointerEventType(PlatformTouchPoint::TouchPhaseType phase) > { > switch (phase) { > case PlatformTouchPoint::TouchPhaseBegan: >@@ -50,31 +50,19 @@ static AtomicString pointerEventType(PlatformTouchPoint::TouchPhaseType phase) > return nullAtom(); > } > >-static PointerEvent::IsCancelable phaseIsCancelable(PlatformTouchPoint::TouchPhaseType phase) >-{ >- if (phase == PlatformTouchPoint::TouchPhaseCancelled) >- return PointerEvent::IsCancelable::No; >- return PointerEvent::IsCancelable::Yes; >-} >- >-static Event::CanBubble typeCanBubble(const AtomicString& type) >-{ >- return (type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent) ? Event::CanBubble::No : Event::CanBubble::Yes; >-} >- > Ref<PointerEvent> PointerEvent::create(const PlatformTouchEvent& event, unsigned index, bool isPrimary, Ref<WindowProxy>&& view) > { >- auto phase = event.touchPhaseAtIndex(index); >- return adoptRef(*new PointerEvent(pointerEventType(phase), event, phaseIsCancelable(phase), index, isPrimary, WTFMove(view))); >+ const auto& type = pointerEventType(event.touchPhaseAtIndex(index)); >+ return adoptRef(*new PointerEvent(type, event, typeIsCancelable(type), index, isPrimary, WTFMove(view))); > } > > Ref<PointerEvent> PointerEvent::create(const String& type, const PlatformTouchEvent& event, unsigned index, bool isPrimary, Ref<WindowProxy>&& view) > { >- return adoptRef(*new PointerEvent(type, event, phaseIsCancelable(event.touchPhaseAtIndex(index)), index, isPrimary, WTFMove(view))); >+ return adoptRef(*new PointerEvent(type, event, typeIsCancelable(type), index, isPrimary, WTFMove(view))); > } > > PointerEvent::PointerEvent(const AtomicString& type, const PlatformTouchEvent& event, IsCancelable isCancelable, unsigned index, bool isPrimary, Ref<WindowProxy>&& view) >- : 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) >+ : 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) > , m_pointerId(event.touchIdentifierAtIndex(index)) > , m_width(2 * event.radiusXAtIndex(index)) > , m_height(2 * event.radiusYAtIndex(index)) >diff --git a/Source/WebCore/page/PointerCaptureController.cpp b/Source/WebCore/page/PointerCaptureController.cpp >index eedf6142766cc11297d2311de71e0ddc82b6464d..c50c38297a2d0146dd3ac96da1eb9db760fcf496 100644 >--- a/Source/WebCore/page/PointerCaptureController.cpp >+++ b/Source/WebCore/page/PointerCaptureController.cpp >@@ -389,9 +389,14 @@ void PointerCaptureController::cancelPointer(PointerID pointerId, const IntPoint > if (!target) > return; > >- auto event = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType, capturingData.isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No); >- target->dispatchEvent(event); >- processPendingPointerCapture(WTFMove(event)); >+ // After firing the pointercancel event, a user agent MUST also fire a pointer event named pointerout >+ // followed by firing a pointer event named pointerleave. >+ auto isPrimary = capturingData.isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No; >+ auto cancelEvent = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType, isPrimary); >+ target->dispatchEvent(cancelEvent); >+ target->dispatchEvent(PointerEvent::create(eventNames().pointeroutEvent, pointerId, capturingData.pointerType, isPrimary)); >+ target->dispatchEvent(PointerEvent::create(eventNames().pointerleaveEvent, pointerId, capturingData.pointerType, isPrimary)); >+ processPendingPointerCapture(WTFMove(cancelEvent)); > } > > void PointerCaptureController::processPendingPointerCapture(const PointerEvent& event) >diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog >index 4ed797449761e9848ad94f7e34174a38f2649b5e..16a05691fabf99e04016568def8e60c9f75c08b5 100644 >--- a/LayoutTests/imported/w3c/ChangeLog >+++ b/LayoutTests/imported/w3c/ChangeLog >@@ -1,3 +1,17 @@ >+2019-06-05 Antoine Quint <graouts@apple.com> >+ >+ [Pointer Events] Fire pointerout and pointerleave events after firing pointercancel >+ https://bugs.webkit.org/show_bug.cgi?id=198560 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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: >+ > 2019-06-01 Antoine Quint <graouts@apple.com> > > [Pointer Events] Add support for chorded button interactions >diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt >index 295300e2e6cf9652b2c368a69019eb4e6a84a917..8ae0fa221a4940a8fc2a5e64051530324b1b3e4e 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt >@@ -1,5 +1,5 @@ > > FAIL 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 >-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 >-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 >+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,green received pointermove lengths differ, expected 11 got 7 >+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 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" > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt >index 3be427118bf94bd91dffdf74a02c00625a0da64f..a36c9105817281e087677446ac6e5c5798b68ca2 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt >@@ -11,7 +11,7 @@ Pointer Events pointercancel Tests > The following pointer types were detected: touch. > > >-FAIL pointercancel event received assert_true: pointerleave should be received before the test finished expected true got false >+PASS pointercancel event received > PASS touch pointercancel event is a PointerEvent event > PASS touch pointercancel.pointerId attribute exists > PASS touch pointercancel.pointerId is readonly >@@ -48,6 +48,6 @@ PASS touch pointercancel.fromElement value is null. > PASS touch pointercancel.toElement attribute exists > PASS touch pointercancel.toElement is readonly > PASS touch pointercancel.toElement IDL type object (JS type was object) >-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> >+PASS touch pointercancel.toElement value is null. > PASS touch pointercancel.pressure value is valid > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt >index 3c36272a9c761bdd3e36bc57c557491b10078096..0e7a30fe4e0360604eea7f1d3c3096c8c44b948f 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt >@@ -9,5 +9,5 @@ Pointer Events pointerleave tests > The following pointer types were detected: touch. > > >-FAIL pointerleave event received assert_true: pointerleave should be received before the test finishes expected true got false >+PASS pointerleave event received > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt >index 1b457e0c4bc17ca31f81edd1816302c56a06f334..c456e5bfd8b54ee7369342e9c0eda39177275ca9 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt >@@ -9,5 +9,5 @@ Pointer Events pointerout tests > The following pointer types were detected: touch. > > >-FAIL pointerout event received assert_true: pointerout should be received before the test finishes expected true got false >+PASS pointerout event received >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198560
: 371388