diff options
author | Michał Gołębiowski-Owczarek <m.goleb@gmail.com> | 2021-02-20 19:11:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-20 19:11:03 +0100 |
commit | 5b5fda7cd24e6265814ddda23b9af2ceef8bcd99 (patch) | |
tree | 5c5a07e0313d4ec14a59f3acda3166f53c018c6b | |
parent | 19c628675dadc714616af975969694267f3840df (diff) | |
download | jquery-ui-5b5fda7cd24e6265814ddda23b9af2ceef8bcd99.tar.gz jquery-ui-5b5fda7cd24e6265814ddda23b9af2ceef8bcd99.zip |
Tests: Account for an extra noop focus/blur listener 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. This leaves extra focus & blur events if any of these events were ever
listened to at a particular element.
We've started skipping these handlers in the `domEqual` assertion in gh-1930 but
we missed a case where an event is triggered before any handler is attached -
jQuery >=3.4.0 attaches then an extra noop listener just to force the code path
to go through the setup code before the trigger happens. We now skip this extra
handler as well.
This fixes a test failure in "dialog: methods" destroy tests.
Closes gh-1945
Ref jquery/jquery#4496
Ref gh-1930
-rw-r--r-- | tests/lib/qunit-assert-domequal.js | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/tests/lib/qunit-assert-domequal.js b/tests/lib/qunit-assert-domequal.js index 83ac60b97..26c131137 100644 --- a/tests/lib/qunit-assert-domequal.js +++ b/tests/lib/qunit-assert-domequal.js @@ -145,34 +145,35 @@ function extract( selector, message ) { // data comparisons in tests. // See https://github.com/jquery/jquery/issues/4496 if ( result.events && jQueryVersionSince( "3.4.0" ) ) { - var i, eventDataList, eventData; $.each( [ "focus", "blur" ], function( index, eventType ) { if ( !result.events[ eventType ] ) { return; } - // Only the special internal handlers - // have the namespace field set to boolean `false`; - // filter them out. - result.events[ eventType ] = result.events[ eventType ].filter( function( eventData ) { - return eventData.namespace !== false; - } ); - - eventDataList = result.events[ eventType ]; - for ( i = eventDataList.length - 1; i > -1; i-- ) { - eventData = eventDataList[ i ]; - - // Only these special jQuery internal handlers - // have the `namespace` field set to `false`; - // all other events use a string value, possibly - // an empty string if no namespace was set. - if ( eventData.namespace === false ) { - eventDataList.splice( i, 1 ); - } - } + // Filter special jQuery focus-related handlers out. + result.events[ eventType ] = result.events[ eventType ] + .filter( function( eventData ) { + var handlerBody = eventData.handler.toString().replace( + /^[^{]+\{[\s\n]*((?:.|\n)*?)\s*;?\s*\}[^}]*$/, + "$1" + ); + + // Only these special jQuery internal handlers + // have the `namespace` field set to `false`; + // all other events use a string value, possibly + // an empty string if no namespace was set. + return eventData.namespace !== false && + + // If a focus event was triggered without adding a handler first, + // jQuery attaches an empty handler at the beginning of a trigger + // call. Ignore this handler as well; it's a function with just + // `return true;` in the body. + // Handle the minified version as well. + handlerBody !== "return true" && handlerBody !== "return!0"; + } ); // Remove empty eventData collections to follow jQuery behavior. - if ( !eventDataList.length ) { + if ( !result.events[ eventType ].length ) { delete result.events[ eventType ]; } } ); |