Skip to content

Commit

Permalink
fix(dialog): don't move focus to dialog container if focus is already…
Browse files Browse the repository at this point in the history
… inside the dialog (#16297)

This is a follow-up to #16221. What we hadn't accounted for in the aforementioned PR is that the consumer may have turned off `autoFocus` so that they can handle it themselves and with our changes focus would be reset back to the container. These changes add an extra check which will ensure that focus is only moved if it's not inside the dialog already.
  • Loading branch information
crisbeto authored and andrewseguin committed Jul 2, 2019
1 parent f4ed57c commit 62447be
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/material/dialog/dialog-container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,20 +132,28 @@ export class MatDialogContainer extends BasePortalOutlet {

/** Moves the focus inside the focus trap. */
private _trapFocus() {
const element = this._elementRef.nativeElement;

if (!this._focusTrap) {
this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);
this._focusTrap = this._focusTrapFactory.create(element);
}

// If were to attempt to focus immediately, then the content of the dialog would not yet be
// If we were to attempt to focus immediately, then the content of the dialog would not yet be
// ready in instances where change detection has to run first. To deal with this, we simply
// wait for the microtask queue to be empty.
if (this._config.autoFocus) {
this._focusTrap.focusInitialElementWhenReady();
} else {
const activeElement = this._document.activeElement;

// Otherwise ensure that focus is on the dialog container. It's possible that a different
// component tried to move focus while the open animation was running. See:
// https://github.com/angular/components/issues/16215
this._elementRef.nativeElement.focus();
// https://github.com/angular/components/issues/16215. Note that we only want to do this
// if the focus isn't inside the dialog already, because it's possible that the consumer
// turned off `autoFocus` in order to move focus themselves.
if (activeElement !== element && !element.contains(activeElement)) {
element.focus();
}
}
}

Expand Down

0 comments on commit 62447be

Please sign in to comment.