diff options
author | Michał Gołębiowski-Owczarek <m.goleb@gmail.com> | 2020-04-06 20:34:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-06 20:34:40 +0200 |
commit | 9e15d6b469556eccfa607c5ecf53b20c84529125 (patch) | |
tree | 5ab7cd218af745a872248083d13069ca11e0ab4c /test/unit | |
parent | 966a70909019aa09632c87c0002c522fa4a1e30e (diff) | |
download | jquery-9e15d6b469556eccfa607c5ecf53b20c84529125.tar.gz jquery-9e15d6b469556eccfa607c5ecf53b20c84529125.zip |
Event: Use only one focusin/out handler per matching window & document
The `doc` variable in:
https://github.com/jquery/jquery/blob/3.4.1/src/event/focusin.js#L30
matched `document` for `document` & `window` for `window`, creating two
separate wrapper event handlers & calling handlers twice if at least one
`focusout` or `focusin` handler was attached on *both* `window` & `document`,
or on `window` & another regular node.
Also, fix the "focusin from an iframe" test to actually verify the behavior
from commit 1cecf64e5aa415367a7dae0b55c2dd17b591442d - the commit that
introduced the regression - to make sure we don't regress on either front.
Fixes gh-4652
Closes gh-4656
Diffstat (limited to 'test/unit')
-rw-r--r-- | test/unit/event.js | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/test/unit/event.js b/test/unit/event.js index ea9b67f16..d0d451e11 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -2555,7 +2555,9 @@ testIframe( function( assert, framejQuery, frameWin, frameDoc ) { assert.expect( 1 ); - var input = jQuery( frameDoc ).find( "#frame-input" ); + var done = assert.async(), + focus = false, + input = jQuery( frameDoc ).find( "#frame-input" ); // Create a focusin handler on the parent; shouldn't affect the iframe's fate jQuery( "body" ).on( "focusin.iframeTest", function() { @@ -2563,23 +2565,56 @@ testIframe( } ); input.on( "focusin", function() { + focus = true; assert.ok( true, "fired a focusin event in the iframe" ); } ); // Avoid a native event; Chrome can't force focus to another frame - input.trigger( "focusin" ); - - // Must manually remove handler to avoid leaks in our data store - input.remove(); - - // Be sure it was removed; nothing should happen - input.trigger( "focusin" ); + input[ 0 ].focus(); // Remove body handler manually since it's outside the fixture jQuery( "body" ).off( "focusin.iframeTest" ); + + setTimeout( function() { + + // DOM focus is unreliable in TestSwarm + if ( QUnit.isSwarm && !focus ) { + assert.ok( true, "GAP: Could not observe focus change" ); + } + + done(); + }, 50 ); } ); +QUnit.test( "focusin on document & window", function( assert ) { + assert.expect( 1 ); + + var counter = 0, + input = jQuery( "<input />" ); + + input.appendTo( "#qunit-fixture" ); + + input[ 0 ].focus(); + + jQuery( window ).on( "focusout", function() { + counter++; + } ); + jQuery( document ).on( "focusout", function() { + counter++; + } ); + + input[ 0 ].blur(); + + // DOM focus is unreliable in TestSwarm + if ( QUnit.isSwarm && counter === 0 ) { + assert.ok( true, "GAP: Could not observe focus change" ); + } + + assert.strictEqual( counter, 2, + "focusout handlers on document/window fired once only" ); +} ); + testIframe( "jQuery.ready promise", "event/promiseReady.html", |