Skip to content

Commit 5e2fc44

Browse files
mgolgibson042
andauthored
Tests: Account for extra focus/blur listeners in jQuery >=3.4
jQuery >=3.4.0 uses a special focus/blur handler pair needed to fix various issues with checkboxes/radio buttons as well as being able to pass data in focus triggers. However, this leaves dummy focus & blur events if any of these events were ever listened to at a particular element. There's not a lot UI can do to fix this so we now just skip these handlers for data comparisons in tests. Ref jquery/jquery#4496 Closes gh-1930 Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
1 parent 91037d6 commit 5e2fc44

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

tests/lib/qunit-assert-domequal.js

+70
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,28 @@ function getElementStyles( elem ) {
9393
return styles;
9494
}
9595

96+
// Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
97+
function compareVersions( v1, v2 ) {
98+
var i,
99+
rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
100+
v1p = rVersionParts.exec( v1 ) || [ ],
101+
v2p = rVersionParts.exec( v2 ) || [ ];
102+
103+
for ( i = 1; i <= 3; i++ ) {
104+
if ( +v1p[ i ] > +v2p[ i ] ) {
105+
return 1;
106+
}
107+
if ( +v1p[ i ] < +v2p[ i ] ) {
108+
return -1;
109+
}
110+
}
111+
return 0;
112+
}
113+
114+
function jQueryVersionSince( version ) {
115+
return compareVersions( $.fn.jquery, version ) >= 0;
116+
}
117+
96118
function extract( selector, message ) {
97119
var elem = $( selector );
98120
if ( !elem.length ) {
@@ -113,6 +135,54 @@ function extract( selector, message ) {
113135
} );
114136
result.style = getElementStyles( elem[ 0 ] );
115137
result.events = $._data( elem[ 0 ], "events" );
138+
139+
// jQuery >=3.4.0 uses a special focus/blur handler pair
140+
// needed to fix various issues with checkboxes/radio buttons
141+
// as well as being able to pass data in focus triggers.
142+
// However, this leaves dummy focus & blur events if any of these
143+
// events were ever listened to at a particular element. There's not
144+
// a lot UI can do to fix this so just skip these handlers for
145+
// data comparisons in tests.
146+
// See https://github.com/jquery/jquery/issues/4496
147+
if ( result.events && jQueryVersionSince( "3.4.0" ) ) {
148+
var i, eventDataList, eventData;
149+
$.each( [ "focus", "blur" ], function( index, eventType ) {
150+
if ( !result.events[ eventType ] ) {
151+
return;
152+
}
153+
154+
// Only the special internal handlers
155+
// have the namespace field set to boolean `false`;
156+
// filter them out.
157+
result.events[ eventType ] = result.events[ eventType ].filter( function( eventData ) {
158+
return eventData.namespace !== false;
159+
} );
160+
161+
eventDataList = result.events[ eventType ];
162+
for ( i = eventDataList.length - 1; i > -1; i-- ) {
163+
eventData = eventDataList[ i ];
164+
165+
// Only these special jQuery internal handlers
166+
// have the `namespace` field set to `false`;
167+
// all other events use a string value, possibly
168+
// an empty string if no namespace was set.
169+
if ( eventData.namespace === false ) {
170+
eventDataList.splice( i, 1 );
171+
}
172+
}
173+
174+
// Remove empty eventData collections to follow jQuery behavior.
175+
if ( !eventDataList.length ) {
176+
delete result.events[ eventType ];
177+
}
178+
} );
179+
180+
// Simulate empty events collections removal to follow jQuery behavior.
181+
if ( !Object.keys( result.events ).length ) {
182+
result.events = undefined;
183+
}
184+
}
185+
116186
result.data = $.extend( {}, elem.data() );
117187
delete result.data[ $.expando ];
118188
children = elem.children();

0 commit comments

Comments
 (0)