@@ -23,6 +23,8 @@ export class HoverService implements IHoverService {
2323 private _currentHoverOptions : IHoverOptions | undefined ;
2424 private _currentHover : HoverWidget | undefined ;
2525
26+ private _lastFocusedElementBeforeOpen : HTMLElement | undefined ;
27+
2628 constructor (
2729 @IInstantiationService private readonly _instantiationService : IInstantiationService ,
2830 @IContextViewService private readonly _contextViewService : IContextViewService ,
@@ -37,10 +39,16 @@ export class HoverService implements IHoverService {
3739 return undefined ;
3840 }
3941 this . _currentHoverOptions = options ;
42+ if ( document . activeElement ) {
43+ this . _lastFocusedElementBeforeOpen = document . activeElement as HTMLElement ;
44+ }
4045
4146 const hoverDisposables = new DisposableStore ( ) ;
4247 const hover = this . _instantiationService . createInstance ( HoverWidget , options ) ;
4348 hover . onDispose ( ( ) => {
49+ // Required to handle cases such as closing the hover with the escape key
50+ this . _lastFocusedElementBeforeOpen ?. focus ( ) ;
51+
4452 // Only clear the current options if it's the current hover, the current options help
4553 // reduce flickering when the same hover is shown multiple times
4654 if ( this . _currentHoverOptions === options ) {
@@ -64,11 +72,11 @@ export class HoverService implements IHoverService {
6472 hoverDisposables . add ( addDisposableListener ( document , EventType . KEY_DOWN , e => this . _keyDown ( e , hover ) ) ) ;
6573 hoverDisposables . add ( addDisposableListener ( focusedElement , EventType . KEY_UP , e => this . _keyUp ( e , hover ) ) ) ;
6674 hoverDisposables . add ( addDisposableListener ( document , EventType . KEY_UP , e => this . _keyUp ( e , hover ) ) ) ;
67- }
68- if ( options . hideOnKeyDown ) {
69- const focusedElement = document . activeElement ;
70- if ( focusedElement ) {
71- hoverDisposables . add ( addDisposableListener ( focusedElement , EventType . KEY_DOWN , ( ) => this . hideHover ( ) ) ) ;
75+ if ( options . hideOnKeyDown ) {
76+ hoverDisposables . add ( addDisposableListener ( focusedElement , EventType . KEY_DOWN , ( ) => {
77+ this . hideHover ( ) ;
78+ this . _lastFocusedElementBeforeOpen ?. focus ( ) ;
79+ } ) ) ;
7280 }
7381 }
7482
@@ -110,7 +118,10 @@ export class HoverService implements IHoverService {
110118 if ( keybinding . getSingleModifierDispatchParts ( ) . some ( value => ! ! value ) || this . _keybindingService . softDispatch ( event , event . target ) ) {
111119 return ;
112120 }
113- this . hideHover ( ) ;
121+ if ( e . key !== 'Tab' ) {
122+ this . hideHover ( ) ;
123+ this . _lastFocusedElementBeforeOpen ?. focus ( ) ;
124+ }
114125 }
115126
116127 private _keyUp ( e : KeyboardEvent , hover : HoverWidget ) {
@@ -119,6 +130,7 @@ export class HoverService implements IHoverService {
119130 // Hide if alt is released while the mouse os not over hover/target
120131 if ( ! hover . isMouseIn ) {
121132 this . hideHover ( ) ;
133+ this . _lastFocusedElementBeforeOpen ?. focus ( ) ;
122134 }
123135 }
124136 }
0 commit comments