Skip to content
Permalink
Browse files

Fix #14180. Allow cross-frame use of focusin/out. Close gh-1369.

  • Loading branch information...
dmethvin committed Sep 17, 2013
1 parent 083edd6 commit 9b6f0745805941a6d7b7c16c02cf56ab00021c82
Showing with 59 additions and 7 deletions.
  1. +14 −7 src/event.js
  2. +18 −0 test/data/event/focusinCrossFrame.html
  3. +27 −0 test/unit/event.js
@@ -727,22 +727,29 @@ jQuery.each({
if ( !support.focusinBubbles ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {

// Attach a single capturing handler while someone wants focusin/focusout
var attaches = 0,
handler = function( event ) {
// Attach a single capturing handler on the document while someone wants focusin/focusout
var handler = function( event ) {
jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
};

jQuery.event.special[ fix ] = {
setup: function() {
if ( attaches++ === 0 ) {
document.addEventListener( orig, handler, true );
var doc = this.ownerDocument,
attaches = data_priv.access( doc, "focusCount" );

if ( !attaches ) {
doc.addEventListener( orig, handler, true );
}
data_priv.access( doc, "focusCount", ( attaches || 0 ) + 1 );
},
teardown: function() {
if ( --attaches === 0 ) {
document.removeEventListener( orig, handler, true );
var doc = this.ownerDocument,
attaches = data_priv.access( doc, "focusCount" ) - 1;

if ( !attaches ) {
doc.removeEventListener( orig, handler, true );
}
data_priv.access( doc, "focusCount", attaches );
}
};
});
@@ -0,0 +1,18 @@
<!doctype html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>focusin event cross-frame (#14180)</title>

<script src="../../jquery.js"></script>
</head>
<body>
<input type="text" id="frame-input" />
<script>
// Call parent when this frame is fully loaded, it will mess with #frame-input
jQuery( window ).one( "load", function() {
window.parent.iframeCallback( document );
});
</script>
</body>
</html>
@@ -2434,6 +2434,33 @@ test("fixHooks extensions", function() {
jQuery.event.fixHooks.click = saved;
});

testIframeWithCallback( "focusin from an iframe", "event/focusinCrossFrame.html", function( frameDoc ) {
expect(1);

var 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() {
ok( false, "fired a focusin event in the parent document" );
});

input.on( "focusin", function() {
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" );

// Remove body handler manually since it's outside the fixture
jQuery( "body" ).off( "focusin.iframeTest" );
});

testIframeWithCallback( "jQuery.ready promise", "event/promiseReady.html", function( isOk ) {
expect(1);
ok( isOk, "$.when( $.ready ) works" );

0 comments on commit 9b6f074

Please sign in to comment.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.