]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Fix regression for handling `mouseenter`/`mouseleave` events introduced by #33310...
authoralpadev <2838324+alpadev@users.noreply.github.com>
Mon, 19 Apr 2021 05:30:33 +0000 (07:30 +0200)
committerGitHub <noreply@github.com>
Mon, 19 Apr 2021 05:30:33 +0000 (08:30 +0300)
* test: update spec for sibling adjacent mouseenter/mouseleave events

there is a regression introduced by #33310 - this would have catched that

* fix: fixup regression for mouseenter/mouseleave events introduced by #33310

the old logic only worked for parent-child movement since it checked for the relatedTarget to contain the delegateTarget - this should be fixed with this

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
js/src/dom/event-handler.js
js/tests/unit/dom/event-handler.spec.js

index 8ccb887fc3bf61061efdbb68c4e702e62f922ca2..3293f397d559fd4d36de4cd1cfb4666d0f64eef2 100644 (file)
@@ -170,7 +170,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
   if (customEventsRegex.test(originalTypeEvent)) {
     const wrapFn = fn => {
       return function (event) {
-        if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && event.relatedTarget.contains(event.delegateTarget))) {
+        if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {
           return fn.call(this, event)
         }
       }
index 5fb1f01956da502be6be87a86b9a3e672bc5ff45..4dc4ffc3532674ea3b64dd68a9037bd6d4351af5 100644 (file)
@@ -86,6 +86,7 @@ describe('EventHandler', () => {
         '<div class="deep"></div>',
         '</div>',
         '</div>',
+        '<div class="sibling"></div>',
         '</div>'
       ]
 
@@ -93,6 +94,7 @@ describe('EventHandler', () => {
       const inner = fixtureEl.querySelector('.inner')
       const nested = fixtureEl.querySelector('.nested')
       const deep = fixtureEl.querySelector('.deep')
+      const sibling = fixtureEl.querySelector('.sibling')
 
       const enterSpy = jasmine.createSpy('mouseenter')
       const leaveSpy = jasmine.createSpy('mouseleave')
@@ -104,6 +106,14 @@ describe('EventHandler', () => {
       EventHandler.on(outer, 'mouseenter', '.inner', delegateEnterSpy)
       EventHandler.on(outer, 'mouseleave', '.inner', delegateLeaveSpy)
 
+      EventHandler.on(sibling, 'mouseenter', () => {
+        expect(enterSpy.calls.count()).toBe(2)
+        expect(leaveSpy.calls.count()).toBe(2)
+        expect(delegateEnterSpy.calls.count()).toBe(2)
+        expect(delegateLeaveSpy.calls.count()).toBe(2)
+        done()
+      })
+
       const moveMouse = (from, to) => {
         from.dispatchEvent(new MouseEvent('mouseout', {
           bubbles: true,
@@ -116,6 +126,7 @@ describe('EventHandler', () => {
         }))
       }
 
+      // from outer to deep and back to outer (nested)
       moveMouse(outer, inner)
       moveMouse(inner, nested)
       moveMouse(nested, deep)
@@ -128,7 +139,10 @@ describe('EventHandler', () => {
         expect(leaveSpy.calls.count()).toBe(1)
         expect(delegateEnterSpy.calls.count()).toBe(1)
         expect(delegateLeaveSpy.calls.count()).toBe(1)
-        done()
+
+        // from outer to inner to sibling (adjacent)
+        moveMouse(outer, inner)
+        moveMouse(inner, sibling)
       }, 20)
     })
   })