Skip to content

Commit

Permalink
Dialog: Fix shared event handler for modal dialogs
Browse files Browse the repository at this point in the history
The old logic worked when all widgets of the same type used the same
event namespace. However, now that each instance has its own namespace,
we cannot use `_on()` for shared event handlers.

Fixes #15182
Closes gh-1817
  • Loading branch information
scottgonzalez committed May 17, 2017
1 parent 809f29e commit 5708046
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions ui/widgets/dialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ $.widget( "ui.dialog", {
that._trigger( "focus" );
} );

// Track the dialog immediately upon openening in case a focus event
// Track the dialog immediately upon opening in case a focus event
// somehow occurs outside of the dialog before an element inside the
// dialog is focused (#10152)
this._makeFocusTarget();
Expand Down Expand Up @@ -863,20 +863,19 @@ $.widget( "ui.dialog", {
if ( !this.document.data( "ui-dialog-overlays" ) ) {

// Prevent use of anchors and inputs
// Using _on() for an event handler shared across many instances is
// safe because the dialogs stack and must be closed in reverse order
this._on( this.document, {
focusin: function( event ) {
if ( isOpening ) {
return;
}

if ( !this._allowInteraction( event ) ) {
event.preventDefault();
this._trackingInstances()[ 0 ]._focusTabbable();
}
// This doesn't use `_on()` because it is a shared event handler
// across all open modal dialogs.
this.document.on( "focusin.ui-dialog", function( event ) {
if ( isOpening ) {
return;
}
} );

var instance = this._trackingInstances()[ 0 ];
if ( !instance._allowInteraction( event ) ) {
event.preventDefault();
instance._focusTabbable();
}
}.bind( this ) );
}

this.overlay = $( "<div>" )
Expand All @@ -899,7 +898,7 @@ $.widget( "ui.dialog", {
var overlays = this.document.data( "ui-dialog-overlays" ) - 1;

if ( !overlays ) {
this._off( this.document, "focusin" );
this.document.off( "focusin.ui-dialog" );
this.document.removeData( "ui-dialog-overlays" );
} else {
this.document.data( "ui-dialog-overlays", overlays );
Expand Down

0 comments on commit 5708046

Please sign in to comment.