WebKit Bugzilla
Attachment 370735 Details for
Bug 198036
: The "mouseenter" and "pointerenter" events are fired from the bottom up
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198036-20190528160442.patch (text/plain), 18.01 KB, created by
Antoine Quint
on 2019-05-28 07:04:43 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Antoine Quint
Created:
2019-05-28 07:04:43 PDT
Size:
18.01 KB
patch
obsolete
>Subversion Revision: 245809 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 79f0deff07e67936dfbee83a868dd9a2bf11faf9..c4888d9a505be474df02bf12f1d02a1535002c43 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2019-05-28 Antoine Quint <graouts@apple.com> >+ >+ The "mouseenter" and "pointerenter" events are fired from the bottom up >+ https://bugs.webkit.org/show_bug.cgi?id=198036 >+ <rdar://problem/50940350> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Ensure "mouseenter" and "pointerenter" events are dispatched from the bottom up to match the UI Events spec >+ at https://w3c.github.io/uievents/#events-mouseevent-event-order. >+ >+ Tests: pointerevents/ios/enter-leave-order.html >+ pointerevents/mouse/enter-leave-order.html >+ >+ * page/EventHandler.cpp: >+ (WebCore::EventHandler::updateMouseEventTargetNode): >+ * page/PointerCaptureController.cpp: >+ (WebCore::PointerCaptureController::dispatchEventForTouchAtIndex): >+ > 2019-05-27 Antoine Quint <graouts@apple.com> > > [Pointer Events] Check that capturing data managed by the PointerCaptureController gets cleared upon navigation >diff --git a/Source/WebCore/page/EventHandler.cpp b/Source/WebCore/page/EventHandler.cpp >index ffbbac6732e446a9d42b6d15c18401d9eda957f3..a1f85110a0e81d0fa4a8538dfea35f0ed832f75e 100644 >--- a/Source/WebCore/page/EventHandler.cpp >+++ b/Source/WebCore/page/EventHandler.cpp >@@ -2594,7 +2594,7 @@ void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo > if (m_elementUnderMouse) > m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get()); > >- for (auto& chain : enteredElementsChain) { >+ for (auto& chain : WTF::makeReversedRange(enteredElementsChain)) { > if (hasCapturingMouseEnterListener || chain->hasEventListeners(eventNames().pointerenterEvent) || chain->hasEventListeners(eventNames().mouseenterEvent)) > chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseenterEvent, 0, m_lastElementUnderMouse.get()); > } >diff --git a/Source/WebCore/page/PointerCaptureController.cpp b/Source/WebCore/page/PointerCaptureController.cpp >index efa12a15d9bd7e19d2ae1841160a8694a0a66391..6e65edc0f2b71e35746e962822273ba0e4729b3d 100644 >--- a/Source/WebCore/page/PointerCaptureController.cpp >+++ b/Source/WebCore/page/PointerCaptureController.cpp >@@ -190,9 +190,20 @@ void PointerCaptureController::dispatchEventForTouchAtIndex(EventTarget& target, > } > } > >- for (Element* element = &downcast<Element>(target); element; element = element->parentElementInComposedTree()) { >- if (hasCapturingListenerInHierarchy || element->hasEventListeners(type)) >+ if (type == eventNames().pointerenterEvent) { >+ Vector<Ref<Element>, 32> enterChain; >+ for (Element* element = &downcast<Element>(target); element; element = element->parentElementInComposedTree()) { >+ if (hasCapturingListenerInHierarchy || element->hasEventListeners(type)) >+ enterChain.append(*element); >+ } >+ >+ for (auto& element : WTF::makeReversedRange(enterChain)) > element->dispatchEvent(PointerEvent::create(type, platformTouchEvent, index, isPrimary, view)); >+ } else { >+ for (Element* element = &downcast<Element>(target); element; element = element->parentElementInComposedTree()) { >+ if (hasCapturingListenerInHierarchy || element->hasEventListeners(type)) >+ element->dispatchEvent(PointerEvent::create(type, platformTouchEvent, index, isPrimary, view)); >+ } > } > }; > >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index f25cbbca484b80edf9224ee4cfc0c14ed82c49dd..b914e10d0195f6b5a6fb61c5eec522572c94c11d 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,25 @@ >+2019-05-28 Antoine Quint <graouts@apple.com> >+ >+ The "mouseenter" and "pointerenter" events are fired from the bottom up >+ https://bugs.webkit.org/show_bug.cgi?id=198036 >+ <rdar://problem/50940350> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * fast/events/mouseenter-mouseleave-capture-expected.txt: >+ * fast/events/mouseenter-mouseleave-expected.txt: >+ * fast/events/mouseenterleave-on-subframe-expected.txt: >+ * fast/events/shadow-event-path-expected.txt: >+ * fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt: >+ * fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt: >+ * fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt: >+ * platform/mac-wk2/fast/events/shadow-event-path-expected.txt: >+ * platform/mac/fast/events/shadow-event-path-2-expected.txt: >+ * pointerevents/ios/enter-leave-order-expected.txt: Added. >+ * pointerevents/ios/enter-leave-order.html: Added. >+ * pointerevents/mouse/enter-leave-order-expected.txt: Added. >+ * pointerevents/mouse/enter-leave-order.html: Added. >+ > 2019-05-27 Takashi Komori <Takashi.Komori@sony.com> > > [CURL] Fix crashing SocketStreamHandle. >diff --git a/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt b/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt >index f09f4c3aebf95606c13831482bd886f4953203ac..5c0ff9d1fedd7cd9b91b2bedb7ddf848c579cd46 100644 >--- a/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt >+++ b/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt >@@ -8,8 +8,8 @@ mousemove on html > mouseMoveTo(110,140) > mouseout on html > mouseover on outer1 >-mouseenter on outer1 > mouseenter on body >+mouseenter on outer1 > mousemove on outer1 > > mouseMoveTo(130,140) >@@ -22,8 +22,8 @@ mouseMoveTo(170,140) > mouseout on inner1 > mouseleave on inner1 > mouseover on inner3 >-mouseenter on inner3 > mouseenter on inner2 >+mouseenter on inner3 > mousemove on inner3 > > mouseMoveTo(180,140) >diff --git a/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt b/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt >index ee0ba741c4eec4827cf27c3e94d6ba2300a339f8..efd24199b91c1fd920099e779f7580234b46b67c 100644 >--- a/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt >+++ b/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt >@@ -9,8 +9,8 @@ mousemove on html > mouseMoveTo(110,140) > mouseout on html > mouseover on outer1 >-mouseenter on outer1 > mouseenter on body >+mouseenter on outer1 > mousemove on outer1 > > mouseMoveTo(130,140) >@@ -23,8 +23,8 @@ mouseMoveTo(170,140) > mouseout on inner1 > mouseleave on inner1 > mouseover on inner3 >-mouseenter on inner3 > mouseenter on inner2 >+mouseenter on inner3 > mousemove on inner3 > > mouseMoveTo(180,140) >diff --git a/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt b/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt >index 9ee2f5527d979d57fe782e1bda7e3b403ab51c7b..b7df932a7d1fd4d3f15a1f420f839f33f56f49ef 100644 >--- a/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt >+++ b/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt >@@ -1,9 +1,9 @@ > > This is a test of a mouseleave events in an inner-document. The test is success if we get matching mouseleave events for every mouseenter event, and if the logged nodeNames of event targets does not include '#document'. > >-mouseenter on DIV >-mouseenter on BODY > mouseenter on HTML >+mouseenter on BODY >+mouseenter on DIV > mouseleave on DIV > mouseleave on BODY > mouseleave on HTML >diff --git a/LayoutTests/fast/events/shadow-event-path-expected.txt b/LayoutTests/fast/events/shadow-event-path-expected.txt >index 96a91206f75becc5734ff38c6d992088ccd4f2d0..f0b135b16314a8fc45765fa760e77e024c1d8bcd 100644 >--- a/LayoutTests/fast/events/shadow-event-path-expected.txt >+++ b/LayoutTests/fast/events/shadow-event-path-expected.txt >@@ -39,32 +39,32 @@ mouseover@window > target:input#target > relatedTarget:null > >-mouseenter@input#target >- target:input#target >+mouseenter@html >+ target:html > relatedTarget:null > >-mouseenter@div#divInsideSummary >- target:div#divInsideSummary >+mouseenter@body >+ target:body > relatedTarget:null > >-mouseenter@summary >- target:summary >+mouseenter@div#detailsContainer >+ target:div#detailsContainer > relatedTarget:null > > mouseenter@details > target:details > relatedTarget:null > >-mouseenter@div#detailsContainer >- target:div#detailsContainer >+mouseenter@summary >+ target:summary > relatedTarget:null > >-mouseenter@body >- target:body >+mouseenter@div#divInsideSummary >+ target:div#divInsideSummary > relatedTarget:null > >-mouseenter@html >- target:html >+mouseenter@input#target >+ target:input#target > relatedTarget:null > > mousemove@input#target >diff --git a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt >index 879066adcb65baa979c7453272046bab7c2b40d1..4a061cd5f48ea793ab3a3b9eda7603a146537536 100644 >--- a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt >+++ b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt >@@ -14,8 +14,8 @@ mouseenter on slotParent > mouseenter on slot > > ==Entering slotted element== >-mouseenter on target > mouseenter on targetParent >+mouseenter on target > > ==Leaving slotted element== > mouseleave on target >diff --git a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt >index 6a43024d7470477c88f98eba5f07b3263ea197cd..720449cab4eacda90142436f6f46df4c728f1dc7 100644 >--- a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt >+++ b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt >@@ -4,10 +4,10 @@ WebKit must generate mouseenter and mouseleve events exactly once on host (as we > > > ==Entering target== >-mouseenter on target >-mouseenter on container >-mouseenter on host > mouseenter on hostParent >+mouseenter on host >+mouseenter on container >+mouseenter on target > > ==Leaving target== > mouseleave on target >diff --git a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt >index 0f1d780ddfb11143e60864c784ed868fafced355..0e39255f3501b9961755d2da65a7d2f089b125dc 100644 >--- a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt >+++ b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt >@@ -4,9 +4,9 @@ You should see mouseenter events on slotContainer, slot, and target in that orde > > > ==Entering target== >-mouseenter on target >-mouseenter on slot > mouseenter on slotContainer >+mouseenter on slot >+mouseenter on target > > ==Leaving target== > mouseleave on target >diff --git a/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt b/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt >index 33d65138c1650bea5c4e34605c28f53249538854..7945b694c9e0f4a3bc033a9f5a7a1af6650bb203 100644 >--- a/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt >+++ b/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt >@@ -39,32 +39,32 @@ mouseover@window > target:input#target > relatedTarget:null > >-mouseenter@input#target >- target:input#target >+mouseenter@html >+ target:html > relatedTarget:null > >-mouseenter@div#divInsideSummary >- target:div#divInsideSummary >+mouseenter@body >+ target:body > relatedTarget:null > >-mouseenter@summary >- target:summary >+mouseenter@div#detailsContainer >+ target:div#detailsContainer > relatedTarget:null > > mouseenter@details > target:details > relatedTarget:null > >-mouseenter@div#detailsContainer >- target:div#detailsContainer >+mouseenter@summary >+ target:summary > relatedTarget:null > >-mouseenter@body >- target:body >+mouseenter@div#divInsideSummary >+ target:div#divInsideSummary > relatedTarget:null > >-mouseenter@html >- target:html >+mouseenter@input#target >+ target:input#target > relatedTarget:null > > mousemove@input#target >diff --git a/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt b/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt >index 922c12882c4a3ba88dfa123e8c0c3b16ee8a2973..a21d0f61a17afeed3c632342ceb11a7496d26070 100644 >--- a/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt >+++ b/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt >@@ -67,16 +67,16 @@ mouseover@window > target:input#target > relatedTarget:html > >-mouseenter@input#target >- target:input#target >+mouseenter@body >+ target:body > relatedTarget:html > > mouseenter@div#detailsContainer > target:div#detailsContainer > relatedTarget:html > >-mouseenter@body >- target:body >+mouseenter@input#target >+ target:input#target > relatedTarget:html > > mousemove@input#target >diff --git a/LayoutTests/pointerevents/ios/enter-leave-order-expected.txt b/LayoutTests/pointerevents/ios/enter-leave-order-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..bbe603c0d7b799b68eef5e084e272d4f2b187923 >--- /dev/null >+++ b/LayoutTests/pointerevents/ios/enter-leave-order-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top. >+ >diff --git a/LayoutTests/pointerevents/ios/enter-leave-order.html b/LayoutTests/pointerevents/ios/enter-leave-order.html >new file mode 100644 >index 0000000000000000000000000000000000000000..bc25b358246a728bb43f9f705d4989819c215281 >--- /dev/null >+++ b/LayoutTests/pointerevents/ios/enter-leave-order.html >@@ -0,0 +1,76 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<meta name="viewport" content="width=device-width, initial-scale=1"> >+<style> >+ >+div.test-container { >+ position: absolute; >+ left: 0px; >+ top: 0px; >+ width: 100px; >+ height: 100px; >+} >+ >+#top { >+ left: 50px; >+ top: 50px; >+} >+ >+</style> >+</head> >+<body> >+<script src="../../resources/testharness.js"></script> >+<script src="../../resources/testharnessreport.js"></script> >+<script src="../utils.js"></script> >+<script> >+ >+'use strict'; >+ >+async_test(test => { >+ const expectedEvents = new Set([ >+ "pointerenter@top", >+ "pointerenter@middle", >+ "pointerenter@bottom", >+ "pointerleave@bottom", >+ "pointerleave@middle", >+ "pointerleave@top" >+ ]); >+ >+ const gotEvents = new Promise((resolve, reject) => { >+ const events = new Set; >+ >+ function logEvent(event) >+ { >+ events.add(`${event.type}@${event.target.id}`); >+ if (events.size != expectedEvents.size) >+ return; >+ >+ for (let i = 0; i < events.size; ++i) >+ assert_equals(events[i], expectedEvents[i], `Got expected event at index ${i}.`); >+ >+ resolve(); >+ } >+ >+ function makeDiv(id) >+ { >+ const div = document.createElement("div"); >+ div.addEventListener("pointerenter", logEvent); >+ div.addEventListener("pointerleave", logEvent); >+ div.className = "test-container"; >+ div.id = id; >+ return div; >+ } >+ >+ document.body.appendChild(makeDiv("top")).appendChild(makeDiv("middle")).appendChild(makeDiv("bottom")); >+ }); >+ >+ const tapped = ui.tap({ x: 100, y: 100 }); >+ >+ Promise.all([gotEvents, tapped]).then(() => test.done()); >+}, `Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top.`); >+ >+</script> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/pointerevents/mouse/enter-leave-order-expected.txt b/LayoutTests/pointerevents/mouse/enter-leave-order-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..bbe603c0d7b799b68eef5e084e272d4f2b187923 >--- /dev/null >+++ b/LayoutTests/pointerevents/mouse/enter-leave-order-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top. >+ >diff --git a/LayoutTests/pointerevents/mouse/enter-leave-order.html b/LayoutTests/pointerevents/mouse/enter-leave-order.html >new file mode 100644 >index 0000000000000000000000000000000000000000..7ff2a319e6b2eeb9f75c2a9a62fe451e87934810 >--- /dev/null >+++ b/LayoutTests/pointerevents/mouse/enter-leave-order.html >@@ -0,0 +1,67 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<style> >+ >+div.test-container { >+ position: absolute; >+ left: 0px; >+ top: 0px; >+ width: 100px; >+ height: 100px; >+} >+ >+#top { >+ left: 50px; >+ top: 50px; >+} >+ >+</style> >+</head> >+<body> >+<script src="../../resources/testharness.js"></script> >+<script src="../../resources/testharnessreport.js"></script> >+<script src="../utils.js"></script> >+<script> >+ >+'use strict'; >+ >+const events = []; >+ >+function logEvent(event) >+{ >+ events.push(`${event.type}@${event.target.id}`); >+} >+ >+function makeDiv(id) >+{ >+ const div = document.createElement("div"); >+ div.addEventListener("pointerenter", logEvent); >+ div.addEventListener("pointerleave", logEvent); >+ div.className = "test-container"; >+ div.id = id; >+ return div; >+} >+ >+// Add three nested and fully overlapping elements. >+document.body.appendChild(makeDiv("top")).appendChild(makeDiv("middle")).appendChild(makeDiv("bottom")); >+ >+// mouse over and out of the elements. >+eventSender.mouseMoveTo(75, 75); >+eventSender.mouseMoveTo(25, 25); >+ >+test(() => { >+ assert_array_equals(events, [ >+ "pointerenter@top", >+ "pointerenter@middle", >+ "pointerenter@bottom", >+ "pointerleave@bottom", >+ "pointerleave@middle", >+ "pointerleave@top" >+ ]); >+}, `Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top.`); >+ >+</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
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198036
:
370248
|
370726
|
370728
|
370730
|
370731
|
370733
|
370735
|
370740
|
370747
|
371275