From 50c9a782ad2cf3b1b662966455187f8a9ec41bac Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Sat, 20 Apr 2019 00:06:32 +0000 Subject: [PATCH] fixes #72574 --- src/vs/base/browser/ui/dialog/dialog.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/dialog/dialog.ts b/src/vs/base/browser/ui/dialog/dialog.ts index d5884ce09e4..c19356b4355 100644 --- a/src/vs/base/browser/ui/dialog/dialog.ts +++ b/src/vs/base/browser/ui/dialog/dialog.ts @@ -6,7 +6,7 @@ import 'vs/css!./dialog'; import * as nls from 'vs/nls'; import { Disposable } from 'vs/base/common/lifecycle'; -import { $, hide, show, EventHelper, clearNode, removeClasses, addClass, removeNode } from 'vs/base/browser/dom'; +import { $, hide, show, EventHelper, clearNode, removeClasses, addClass, removeNode, isAncestor } from 'vs/base/browser/dom'; import { domEvent } from 'vs/base/browser/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; @@ -39,6 +39,7 @@ export class Dialog extends Disposable { private toolbarContainer: HTMLElement | undefined; private buttonGroup: ButtonGroup | undefined; private styles: IDialogStyles | undefined; + private focusToReturn: HTMLElement | undefined; constructor(private container: HTMLElement, private message: string, private buttons: string[], private options: IDialogOptions) { super(); @@ -72,6 +73,8 @@ export class Dialog extends Disposable { } async show(): Promise { + this.focusToReturn = document.activeElement as HTMLElement; + return new Promise((resolve) => { if (!this.element || !this.buttonsContainer || !this.iconElement || !this.toolbarContainer) { resolve(0); @@ -135,6 +138,19 @@ export class Dialog extends Disposable { } })); + this._register(domEvent(this.element, 'focusout', false)((e: FocusEvent) => { + if (!!e.relatedTarget && !!this.element) { + if (!isAncestor(e.relatedTarget as HTMLElement, this.element)) { + this.focusToReturn = e.relatedTarget as HTMLElement; + + if (e.target) { + (e.target as HTMLElement).focus(); + EventHelper.stop(e, true); + } + } + } + })); + removeClasses(this.iconElement, 'icon-error', 'icon-warning', 'icon-info'); switch (this.options.type) { @@ -206,5 +222,10 @@ export class Dialog extends Disposable { removeNode(this.modal); this.modal = undefined; } + + if (this.focusToReturn && isAncestor(this.focusToReturn, document.body)) { + this.focusToReturn.focus(); + this.focusToReturn = undefined; + } } } \ No newline at end of file -- GitLab