[Pointer Events] isPrimary property of pointercancel events should match previous...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 May 2019 18:43:27 +0000 (18:43 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 May 2019 18:43:27 +0000 (18:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=197665

Patch by Antoine Quint <graouts@apple.com> on 2019-05-07
Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

Record WPT progressions.

* web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt:

Source/WebCore:

The test at web-platform-tests/pointerevents/pointerevent_pointercancel_touch.html would fail early because one of the first assertions
would check that isPrimary for a pointercancel event would match the isPrimary property of the previous pointer event dispatched for that
pointer id. This prevented many further assertions from passing and also was the cause of flakiness for the next test since this test was
ended early and the state of touches created using UIScriptController were not in a clean state.

We now track the isPrimary state for a given pointer using the CapturingData and use that value when dispatching a pointercancel event.

* dom/PointerEvent.cpp:
(WebCore::PointerEvent::create):
(WebCore::PointerEvent::PointerEvent):
* dom/PointerEvent.h:
* page/PointerCaptureController.cpp:
(WebCore::PointerCaptureController::pointerEventWasDispatched):
(WebCore::PointerCaptureController::cancelPointer):
* page/PointerCaptureController.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@245020 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/PointerEvent.cpp
Source/WebCore/dom/PointerEvent.h
Source/WebCore/page/PointerCaptureController.cpp
Source/WebCore/page/PointerCaptureController.h

index 08ef14f..0a05cee 100644 (file)
@@ -1,3 +1,14 @@
+2019-05-07  Antoine Quint  <graouts@apple.com>
+
+        [Pointer Events] isPrimary property of pointercancel events should match previous events for that pointer
+        https://bugs.webkit.org/show_bug.cgi?id=197665
+
+        Reviewed by Dean Jackson.
+
+        Record WPT progressions.
+
+        * web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt:
+
 2019-05-07  Youenn Fablet  <youenn@apple.com>
 
         Import WPT referrer-policy tests
index edc0cbb..3be4271 100644 (file)
@@ -11,5 +11,43 @@ Pointer Events pointercancel Tests
 The following pointer types were detected: touch.
 
 
-FAIL pointercancel event received assert_equals: isPrimary should be the same for pointerdown and pointercancel expected true but got false
+FAIL pointercancel event received assert_true: pointerleave should be received before the test finished expected true got false
+PASS  touch pointercancel event is a PointerEvent event 
+PASS  touch pointercancel.pointerId attribute exists 
+PASS  touch pointercancel.pointerId is readonly 
+PASS  touch pointercancel.pointerId IDL type long (JS type was number) 
+PASS  touch pointercancel.width attribute exists 
+PASS  touch pointercancel.width is readonly 
+PASS  touch pointercancel.width IDL type float (JS type was number) 
+PASS  touch pointercancel.height attribute exists 
+PASS  touch pointercancel.height is readonly 
+PASS  touch pointercancel.height IDL type float (JS type was number) 
+PASS  touch pointercancel.pressure attribute exists 
+PASS  touch pointercancel.pressure is readonly 
+PASS  touch pointercancel.pressure IDL type float (JS type was number) 
+PASS  touch pointercancel.tiltX attribute exists 
+PASS  touch pointercancel.tiltX is readonly 
+PASS  touch pointercancel.tiltX IDL type long (JS type was number) 
+PASS  touch pointercancel.tiltY attribute exists 
+PASS  touch pointercancel.tiltY is readonly 
+PASS  touch pointercancel.tiltY IDL type long (JS type was number) 
+PASS  touch pointercancel.pointerType attribute exists 
+PASS  touch pointercancel.pointerType is readonly 
+PASS  touch pointercancel.pointerType IDL type string (JS type was string) 
+PASS  touch pointercancel.isPrimary attribute exists 
+PASS  touch pointercancel.isPrimary is readonly 
+PASS  touch pointercancel.isPrimary IDL type boolean (JS type was boolean) 
+PASS  touch pointercancel.detail attribute exists 
+PASS  touch pointercancel.detail is readonly 
+PASS  touch pointercancel.detail IDL type long (JS type was number) 
+PASS  touch pointercancel.detail value is 0. 
+PASS  touch pointercancel.fromElement attribute exists 
+PASS  touch pointercancel.fromElement is readonly 
+PASS  touch pointercancel.fromElement IDL type object (JS type was object) 
+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.pressure value is valid 
 
index a421106..1b2d9db 100644 (file)
@@ -1,3 +1,26 @@
+2019-05-07  Antoine Quint  <graouts@apple.com>
+
+        [Pointer Events] isPrimary property of pointercancel events should match previous events for that pointer
+        https://bugs.webkit.org/show_bug.cgi?id=197665
+
+        Reviewed by Dean Jackson.
+
+        The test at web-platform-tests/pointerevents/pointerevent_pointercancel_touch.html would fail early because one of the first assertions
+        would check that isPrimary for a pointercancel event would match the isPrimary property of the previous pointer event dispatched for that
+        pointer id. This prevented many further assertions from passing and also was the cause of flakiness for the next test since this test was
+        ended early and the state of touches created using UIScriptController were not in a clean state.
+
+        We now track the isPrimary state for a given pointer using the CapturingData and use that value when dispatching a pointercancel event.
+
+        * dom/PointerEvent.cpp:
+        (WebCore::PointerEvent::create):
+        (WebCore::PointerEvent::PointerEvent):
+        * dom/PointerEvent.h:
+        * page/PointerCaptureController.cpp:
+        (WebCore::PointerCaptureController::pointerEventWasDispatched):
+        (WebCore::PointerCaptureController::cancelPointer):
+        * page/PointerCaptureController.h:
+
 2019-05-07  Ryan Haddad  <ryanhaddad@apple.com>
 
         Unreviewed, rolling out r244900.
index b679a13..7a18898 100644 (file)
@@ -84,9 +84,9 @@ RefPtr<PointerEvent> PointerEvent::create(const MouseEvent& mouseEvent)
     return adoptRef(*new PointerEvent(type, canBubble, isCancelable, isComposed, mouseEvent));
 }
 
-Ref<PointerEvent> PointerEvent::create(const String& type, PointerID pointerId, const String& pointerType)
+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));
+    return adoptRef(*new PointerEvent(type, CanBubble::Yes, IsCancelable::No, IsComposed::Yes, pointerId, pointerType, isPrimary));
 }
 
 PointerEvent::PointerEvent() = default;
@@ -112,10 +112,11 @@ PointerEvent::PointerEvent(const AtomicString& type, CanBubble canBubble, IsCanc
 {
 }
 
-PointerEvent::PointerEvent(const AtomicString& type, CanBubble canBubble, IsCancelable isCancelable, IsComposed isComposed, PointerID pointerId, const String& pointerType)
+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)
     , m_pointerId(pointerId)
     , m_pointerType(pointerType)
+    , m_isPrimary(isPrimary == IsPrimary::Yes)
 {
 }
 
index b12ab2d..d51de26 100644 (file)
@@ -52,6 +52,8 @@ public:
         bool isPrimary { false };
     };
 
+    enum class IsPrimary : uint8_t { No, Yes };
+
     static Ref<PointerEvent> create(const AtomicString& type, Init&& initializer)
     {
         return adoptRef(*new PointerEvent(type, WTFMove(initializer)));
@@ -73,7 +75,7 @@ public:
     }
 
     static RefPtr<PointerEvent> create(const MouseEvent&);
-    static Ref<PointerEvent> create(const String& type, PointerID, const String& pointerType);
+    static Ref<PointerEvent> create(const String& type, PointerID, const String& pointerType, IsPrimary = IsPrimary::No);
 
 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
     static Ref<PointerEvent> create(const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&);
@@ -106,7 +108,7 @@ private:
     PointerEvent();
     PointerEvent(const AtomicString&, Init&&);
     PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, const MouseEvent&);
-    PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, PointerID, const String& pointerType);
+    PointerEvent(const AtomicString& type, CanBubble, IsCancelable, IsComposed, 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
index a071e7a..a0fd087 100644 (file)
@@ -234,6 +234,8 @@ void PointerCaptureController::pointerEventWasDispatched(const PointerEvent& eve
     auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
     if (iterator != m_activePointerIdsToCapturingData.end()) {
         auto& capturingData = iterator->value;
+        capturingData.isPrimary = event.isPrimary();
+
         // Immediately after firing the pointerup or pointercancel events, a user agent MUST clear the pending pointer capture target
         // override for the pointerId of the pointerup or pointercancel event that was just dispatched, and then run Process Pending
         // Pointer Capture steps to fire lostpointercapture if necessary.
@@ -281,7 +283,7 @@ void PointerCaptureController::cancelPointer(PointerID pointerId, const IntPoint
     if (!target)
         return;
 
-    auto event = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType);
+    auto event = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType, capturingData.isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No);
     target->dispatchEvent(event);
     processPendingPointerCapture(WTFMove(event));
 }
index db3f7b8..ab8279d 100644 (file)
@@ -63,6 +63,7 @@ private:
         RefPtr<Element> targetOverride;
         String pointerType;
         bool cancelled { false };
+        bool isPrimary { false };
     };
 
     void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*);