@@ -104,6 +104,43 @@ describe('MatMenu', () => {
104
104
expect ( overlayContainerElement . textContent ) . toBe ( '' ) ;
105
105
} ) ) ;
106
106
107
+ it ( 'should restore focus to the trigger when the menu was opened by keyboard' , fakeAsync ( ( ) => {
108
+ const fixture = TestBed . createComponent ( SimpleMenu ) ;
109
+ fixture . detectChanges ( ) ;
110
+
111
+ const triggerEl = fixture . componentInstance . triggerEl . nativeElement ;
112
+
113
+ // A click without a mousedown before it is considered a keyboard open.
114
+ triggerEl . click ( ) ;
115
+ fixture . detectChanges ( ) ;
116
+
117
+ expect ( overlayContainerElement . querySelector ( '.mat-menu-panel' ) ) . toBeTruthy ( ) ;
118
+
119
+ fixture . componentInstance . trigger . closeMenu ( ) ;
120
+ fixture . detectChanges ( ) ;
121
+ tick ( 500 ) ;
122
+
123
+ expect ( document . activeElement ) . toBe ( triggerEl ) ;
124
+ } ) ) ;
125
+
126
+ it ( 'should restore focus to the root trigger when the menu was opened by mouse' , fakeAsync ( ( ) => {
127
+ const fixture = TestBed . createComponent ( SimpleMenu ) ;
128
+ fixture . detectChanges ( ) ;
129
+
130
+ const triggerEl = fixture . componentInstance . triggerEl . nativeElement ;
131
+ dispatchFakeEvent ( triggerEl , 'mousedown' ) ;
132
+ triggerEl . click ( ) ;
133
+ fixture . detectChanges ( ) ;
134
+
135
+ expect ( overlayContainerElement . querySelector ( '.mat-menu-panel' ) ) . toBeTruthy ( ) ;
136
+
137
+ fixture . componentInstance . trigger . closeMenu ( ) ;
138
+ fixture . detectChanges ( ) ;
139
+ tick ( 500 ) ;
140
+
141
+ expect ( document . activeElement ) . toBe ( triggerEl ) ;
142
+ } ) ) ;
143
+
107
144
it ( 'should close the menu when pressing ESCAPE' , fakeAsync ( ( ) => {
108
145
const fixture = TestBed . createComponent ( SimpleMenu ) ;
109
146
fixture . detectChanges ( ) ;
@@ -1096,6 +1133,28 @@ describe('MatMenu', () => {
1096
1133
expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 2 , 'Expected two open menus' ) ;
1097
1134
} ) ) ;
1098
1135
1136
+ it ( 'should not re-focus a child menu trigger when hovering another trigger' , fakeAsync ( ( ) => {
1137
+ compileTestComponent ( ) ;
1138
+
1139
+ dispatchFakeEvent ( instance . rootTriggerEl . nativeElement , 'mousedown' ) ;
1140
+ instance . rootTriggerEl . nativeElement . click ( ) ;
1141
+ fixture . detectChanges ( ) ;
1142
+
1143
+ const items = Array . from ( overlay . querySelectorAll ( '.mat-menu-panel [mat-menu-item]' ) ) ;
1144
+ const levelOneTrigger = overlay . querySelector ( '#level-one-trigger' ) ! ;
1145
+
1146
+ dispatchMouseEvent ( levelOneTrigger , 'mouseenter' ) ;
1147
+ fixture . detectChanges ( ) ;
1148
+ expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 2 , 'Expected two open menus' ) ;
1149
+
1150
+ dispatchMouseEvent ( items [ items . indexOf ( levelOneTrigger ) + 1 ] , 'mouseenter' ) ;
1151
+ fixture . detectChanges ( ) ;
1152
+ tick ( 500 ) ;
1153
+
1154
+ expect ( document . activeElement )
1155
+ . not . toBe ( levelOneTrigger , 'Expected focus not to be returned to the initial trigger.' ) ;
1156
+ } ) ) ;
1157
+
1099
1158
} ) ;
1100
1159
1101
1160
} ) ;
0 commit comments