WebKit Bugzilla
Attachment 362297 Details for
Bug 194776
: [iOS] Dispatch additional events along with pointerdown and pointerup
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-194776-20190218171008.patch (text/plain), 14.65 KB, created by
Antoine Quint
on 2019-02-18 08:10:09 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Antoine Quint
Created:
2019-02-18 08:10:09 PST
Size:
14.65 KB
patch
obsolete
>Subversion Revision: 241658 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 2141a8fc3dfb31427975501667bd3751a04b2ce6..6b52a46e9b7031e2b8a043d735cf7a983aa27aaf 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,32 @@ >+2019-02-18 Antoine Quint <graouts@apple.com> >+ >+ [iOS] Dispatch additional events along with pointerdown and pointerup >+ https://bugs.webkit.org/show_bug.cgi?id=194776 >+ <rdar://problem/48164284> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ The Pointer Events specification mandates that "pointerover" and "pointerenter" events precede a "pointerdown" event and that "pointerout" >+ and "pointerleave" events follow a "pointerup" event. We remove the EventHandler::dispatchPointerEventForTouchAtIndex() method and replace >+ it with a PointerCaptureController::dispatchEventForTouchAtIndex() that can handle the dispatch of such additional events correctly, also >+ allowing for two PointerCaptureController methods (pointerEventWillBeDispatched and pointerEventWasDispatched) to become private. >+ >+ Test: pointerevents/ios/over-enter-out-leave.html >+ >+ * dom/EventNames.h: Add the new "pointerover", "pointerenter", "pointerout" and "pointerleave" event types. >+ * dom/PointerEvent.h: >+ * dom/ios/PointerEventIOS.cpp: >+ (WebCore::PointerEvent::create): >+ * page/EventHandler.cpp: >+ (WebCore::EventHandler::dispatchPointerEventForTouchAtIndex): Deleted. >+ * page/EventHandler.h: >+ * page/PointerCaptureController.cpp: >+ (WebCore::PointerCaptureController::dispatchEventForTouchAtIndex): Take the existing code from EventHandler::dispatchPointerEventForTouchAtIndex() >+ and extend it to dispatch additional events as mandated. Since several events may be dispatched we check whether the dispatch of any of those events >+ had defaultPrevented() or defaultHanded() return true and return those values as a pair. >+ (WebCore::PointerCaptureController::pointerEventWasDispatched): >+ * page/PointerCaptureController.h: >+ > 2019-02-17 David Kilzer <ddkilzer@apple.com> > > Unreviewed, rolling out r241620. >diff --git a/Source/WebCore/dom/EventNames.h b/Source/WebCore/dom/EventNames.h >index 068014d0221dce245f26872970c27a139a6481d9..f4d7d73e6be95ea5fafc2705be1e3fc76d2b611e 100644 >--- a/Source/WebCore/dom/EventNames.h >+++ b/Source/WebCore/dom/EventNames.h >@@ -206,7 +206,11 @@ namespace WebCore { > macro(pointerlockerror) \ > macro(pointercancel) \ > macro(pointerdown) \ >+ macro(pointerenter) \ >+ macro(pointerleave) \ > macro(pointermove) \ >+ macro(pointerout) \ >+ macro(pointerover) \ > macro(pointerup) \ > macro(popstate) \ > macro(previoustrack) \ >diff --git a/Source/WebCore/dom/PointerEvent.h b/Source/WebCore/dom/PointerEvent.h >index de780931bd490e149a96edd4b30f11ea544a22a3..76d328cb4cce8cf502486655baff802278d0c663 100644 >--- a/Source/WebCore/dom/PointerEvent.h >+++ b/Source/WebCore/dom/PointerEvent.h >@@ -83,6 +83,7 @@ public: > > #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY) > static Ref<PointerEvent> create(const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&); >+ static Ref<PointerEvent> create(const String& type, const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&); > #endif > > static const String& mousePointerType(); >diff --git a/Source/WebCore/dom/ios/PointerEventIOS.cpp b/Source/WebCore/dom/ios/PointerEventIOS.cpp >index b191d19988def516844e9385e25d441dc858ba5f..6403e514352847170c36abb7b5563ba0e3c2aff3 100644 >--- a/Source/WebCore/dom/ios/PointerEventIOS.cpp >+++ b/Source/WebCore/dom/ios/PointerEventIOS.cpp >@@ -63,6 +63,11 @@ Ref<PointerEvent> PointerEvent::create(const PlatformTouchEvent& event, unsigned > return adoptRef(*new PointerEvent(pointerEventType(phase), event, phaseIsCancelable(phase), 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))); >+} >+ > PointerEvent::PointerEvent(const AtomicString& type, const PlatformTouchEvent& event, IsCancelable isCancelable, unsigned index, bool isPrimary, Ref<WindowProxy>&& view) > : MouseEvent(type, CanBubble::Yes, 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) > , m_pointerId(event.touchIdentifierAtIndex(index)) >diff --git a/Source/WebCore/page/EventHandler.cpp b/Source/WebCore/page/EventHandler.cpp >index 2024a76f4a15784e52595d7e14c0a14443531f2a..59fd3e01af9dd757dd031321852c6197c296c2a3 100644 >--- a/Source/WebCore/page/EventHandler.cpp >+++ b/Source/WebCore/page/EventHandler.cpp >@@ -114,11 +114,6 @@ > #include "TouchList.h" > #endif > >-#if ENABLE(TOUCH_EVENTS) && ENABLE(POINTER_EVENTS) >-#include "PointerCaptureController.h" >-#include "PointerEvent.h" >-#endif >- > #if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS) > #include "PlatformTouchEvent.h" > #endif >@@ -4271,18 +4266,6 @@ bool EventHandler::dispatchSyntheticTouchEventIfEnabled(const PlatformMouseEvent > } > #endif // ENABLE(TOUCH_EVENTS) > >-#if ENABLE(TOUCH_EVENTS) && ENABLE(POINTER_EVENTS) >-Ref<PointerEvent> EventHandler::dispatchPointerEventForTouchAtIndex(EventTarget& target, const PlatformTouchEvent& platformTouchEvent, unsigned index, bool isPrimary) >-{ >- auto& pointerCaptureController = m_frame.page()->pointerCaptureController(); >- auto pointerEvent = PointerEvent::create(platformTouchEvent, index, isPrimary, m_frame.windowProxy()); >- pointerCaptureController.pointerEventWillBeDispatched(pointerEvent, &target); >- target.dispatchEvent(pointerEvent); >- pointerCaptureController.pointerEventWasDispatched(pointerEvent); >- return pointerEvent; >-} >-#endif // ENABLE(TOUCH_EVENTS) && ENABLE(POINTER_EVENTS) >- > void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event) > { > m_mousePositionIsUnknown = false; >diff --git a/Source/WebCore/page/EventHandler.h b/Source/WebCore/page/EventHandler.h >index 43720db6391298b113aed62a18e2965966c5170a..9ea9e0c9620a9674d0fa74fe56528a7b1475dd8a 100644 >--- a/Source/WebCore/page/EventHandler.h >+++ b/Source/WebCore/page/EventHandler.h >@@ -81,7 +81,6 @@ class PlatformGestureEvent; > class PlatformKeyboardEvent; > class PlatformTouchEvent; > class PlatformWheelEvent; >-class PointerEvent; > class RenderBox; > class RenderElement; > class RenderLayer; >@@ -320,10 +319,6 @@ public: > WEBCORE_EXPORT bool handleTouchEvent(const PlatformTouchEvent&); > #endif > >-#if ENABLE(TOUCH_EVENTS) && ENABLE(POINTER_EVENTS) >- Ref<PointerEvent> dispatchPointerEventForTouchAtIndex(EventTarget&, const PlatformTouchEvent&, unsigned, bool isPrimary); >-#endif >- > bool useHandCursor(Node*, bool isOverLink, bool shiftKey); > void updateCursor(); > >diff --git a/Source/WebCore/page/PointerCaptureController.cpp b/Source/WebCore/page/PointerCaptureController.cpp >index edcc3ff4f01f68101982115510bbbe52ffa6dcd8..0ba0ae9929987a7bcedd5100cb92d681604d71aa 100644 >--- a/Source/WebCore/page/PointerCaptureController.cpp >+++ b/Source/WebCore/page/PointerCaptureController.cpp >@@ -134,6 +134,45 @@ bool PointerCaptureController::hasCancelledPointerEventForIdentifier(PointerID p > return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.cancelled; > } > >+std::pair<bool, bool> PointerCaptureController::dispatchEventForTouchAtIndex(EventTarget& target, const PlatformTouchEvent& platformTouchEvent, unsigned index, bool isPrimary, WindowProxy& view) >+{ >+ bool defaultPrevented = false; >+ bool defaultHandled = false; >+ >+ auto dispatchEvent = [&](const String& type) { >+ auto event = PointerEvent::create(type, platformTouchEvent, index, isPrimary, view); >+ target.dispatchEvent(event); >+ defaultPrevented |= event->defaultPrevented(); >+ defaultHandled |= event->defaultHandled(); >+ }; >+ >+ auto pointerEvent = PointerEvent::create(platformTouchEvent, index, isPrimary, view); >+ >+ if (pointerEvent->type() == eventNames().pointerdownEvent) { >+ // https://w3c.github.io/pointerevents/#the-pointerdown-event >+ // For input devices that do not support hover, a user agent MUST also fire a pointer event named pointerover followed by a pointer event named >+ // pointerenter prior to dispatching the pointerdown event. >+ dispatchEvent(eventNames().pointeroverEvent); >+ dispatchEvent(eventNames().pointerenterEvent); >+ } >+ >+ pointerEventWillBeDispatched(pointerEvent, &target); >+ target.dispatchEvent(pointerEvent); >+ defaultPrevented |= pointerEvent->defaultPrevented(); >+ defaultHandled |= pointerEvent->defaultHandled(); >+ pointerEventWasDispatched(pointerEvent); >+ >+ if (pointerEvent->type() == eventNames().pointerupEvent) { >+ // https://w3c.github.io/pointerevents/#the-pointerup-event >+ // For input devices that do not support hover, a user agent MUST also fire a pointer event named pointerout followed by a >+ // pointer event named pointerleave after dispatching the pointerup event. >+ dispatchEvent(eventNames().pointeroutEvent); >+ dispatchEvent(eventNames().pointerleaveEvent); >+ } >+ >+ return { defaultPrevented, defaultHandled }; >+} >+ > void PointerCaptureController::pointerEventWillBeDispatched(const PointerEvent& event, EventTarget* target) > { > // https://w3c.github.io/pointerevents/#implicit-pointer-capture >@@ -170,7 +209,7 @@ void PointerCaptureController::pointerEventWasDispatched(const PointerEvent& eve > // Pointer Capture steps to fire lostpointercapture if necessary. > if (event.type() == eventNames().pointerupEvent) > capturingData.pendingTargetOverride = nullptr; >- >+ > // When the pointer capture target override is no longer connected, the pending pointer capture target override and pointer > // capture target override nodes SHOULD be cleared and also a PointerEvent named lostpointercapture corresponding to the captured > // pointer SHOULD be fired at the document. >diff --git a/Source/WebCore/page/PointerCaptureController.h b/Source/WebCore/page/PointerCaptureController.h >index 5cfb1e957282f8e4056407e0a5f88a2de3cac404..b6184cb0142fe5037e550f9ccf81d8debbb29613 100644 >--- a/Source/WebCore/page/PointerCaptureController.h >+++ b/Source/WebCore/page/PointerCaptureController.h >@@ -47,10 +47,13 @@ public: > > void pointerLockWasApplied(); > >+#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY) >+ std::pair<bool, bool> dispatchEventForTouchAtIndex(EventTarget&, const PlatformTouchEvent&, unsigned, bool isPrimary, WindowProxy&); >+#endif >+ > void touchEndedOrWasCancelledForIdentifier(PointerID); > bool hasCancelledPointerEventForIdentifier(PointerID); >- void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*); >- void pointerEventWasDispatched(const PointerEvent&); >+ void dispatchEvent(PointerEvent&, EventTarget*); > WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&); > > private: >@@ -61,6 +64,8 @@ private: > bool cancelled { false }; > }; > >+ void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*); >+ void pointerEventWasDispatched(const PointerEvent&); > void processPendingPointerCapture(const PointerEvent&); > > Page& m_page; >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index aff6228eb60819cc69266067fa02eada18d9bc28..3c0ac90c71470d67717fd23738e9cb66fbaef324 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,16 @@ >+2019-02-18 Antoine Quint <graouts@apple.com> >+ >+ [iOS] Dispatch additional events along with pointerdown and pointerup >+ https://bugs.webkit.org/show_bug.cgi?id=194776 >+ <rdar://problem/48164284> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new test that checks that "pointerover" and "pointerenter" precede "pointerdown" and that "pointerout" and "pointerleave" follow "pointerup". >+ >+ * pointerevents/ios/over-enter-out-leave-expected.txt: Added. >+ * pointerevents/ios/over-enter-out-leave.html: Added. >+ > 2019-02-17 Fujii Hironori <Hironori.Fujii@sony.com> > > Use dumpJSConsoleLogInStdErr=true webkit-test-runner option for non-imported tests instead of using DumpJSConsoleLogInStdErr expectation in TestExpectations >diff --git a/LayoutTests/pointerevents/ios/over-enter-out-leave-expected.txt b/LayoutTests/pointerevents/ios/over-enter-out-leave-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..6d82f460b2ba4bb6372528151c9177da5b724d49 >--- /dev/null >+++ b/LayoutTests/pointerevents/ios/over-enter-out-leave-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Testing that "pointerover" and "pointerenter" precede "pointerdown" and that "pointerout" and "pointerleave" follow "pointerup". >+ >diff --git a/LayoutTests/pointerevents/ios/over-enter-out-leave.html b/LayoutTests/pointerevents/ios/over-enter-out-leave.html >new file mode 100644 >index 0000000000000000000000000000000000000000..a1ca1c275a42fc34b47fdb9bbb98236175b14b2f >--- /dev/null >+++ b/LayoutTests/pointerevents/ios/over-enter-out-leave.html >@@ -0,0 +1,40 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset=utf-8> >+<meta name="viewport" content="width=device-width, initial-scale=1"> >+</head> >+<body> >+<script src="../../resources/testharness.js"></script> >+<script src="../../resources/testharnessreport.js"></script> >+<script src="../utils.js"></script> >+<script> >+ >+'use strict'; >+ >+target_test({ width: "200px", height: "200px" }, (target, test) => { >+ document.body.style.width = "2000px"; >+ document.body.style.height = "2000px"; >+ >+ const eventTracker = new EventTracker(target, ["pointerover", "pointerenter", "pointerdown", "pointerup", "pointerout", "pointerleave"]); >+ >+ const touch = ui.finger(); >+ ui.sequence([ >+ touch.begin({ x: 100, y: 100 }), >+ touch.end() >+ ]).then(() => { >+ eventTracker.assertMatchesEvents([ >+ { type: "pointerover", x: 100, y: 100, isPrimary: true }, >+ { type: "pointerenter", x: 100, y: 100, isPrimary: true }, >+ { type: "pointerdown", x: 100, y: 100, isPrimary: true }, >+ { type: "pointerup", x: 100, y: 100, isPrimary: false }, >+ { type: "pointerout", x: 100, y: 100, isPrimary: false }, >+ { type: "pointerleave", x: 100, y: 100, isPrimary: false }, >+ ]); >+ test.done(); >+ }); >+}, `Testing that "pointerover" and "pointerenter" precede "pointerdown" and that "pointerout" and "pointerleave" follow "pointerup".`); >+ >+</script> >+</body> >+</html> >\ No newline at end of file
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
Flags:
bfulgham
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 194776
: 362297