Skip to content

Commit 956d1a0

Browse files
committed
feat(material/menu): allow focus origin to be optional input in focus method
1 parent 5f2407e commit 956d1a0

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

src/material/menu/menu-item.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ export class MatMenuItem extends _MatMenuItemMixinBase
9494
}
9595

9696
/** Focuses the menu item. */
97-
focus(origin: FocusOrigin = 'program', options?: FocusOptions): void {
98-
if (this._focusMonitor) {
97+
focus(origin?: FocusOrigin, options?: FocusOptions): void {
98+
if (this._focusMonitor && origin) {
9999
this._focusMonitor.focusVia(this._getHostElement(), origin, options);
100100
} else {
101101
this._getHostElement().focus(options);

src/material/menu/menu-trigger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,8 @@ export class MatMenuTrigger implements AfterContentInit, OnDestroy {
275275
* Focuses the menu trigger.
276276
* @param origin Source of the menu trigger's focus.
277277
*/
278-
focus(origin: FocusOrigin = 'program', options?: FocusOptions) {
279-
if (this._focusMonitor) {
278+
focus(origin?: FocusOrigin, options?: FocusOptions) {
279+
if (this._focusMonitor && origin) {
280280
this._focusMonitor.focusVia(this._element, origin, options);
281281
} else {
282282
this._element.nativeElement.focus(options);

src/material/menu/menu.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,25 @@ describe('MatMenu', () => {
615615
expect(items.every(item => item.getAttribute('role') === 'menuitemcheckbox')).toBe(true);
616616
});
617617

618+
it('should not change focus origin if origin not specified for menu items', () => {
619+
const fixture = createComponent(MenuWithCheckboxItems);
620+
fixture.detectChanges();
621+
fixture.componentInstance.trigger.openMenu();
622+
fixture.detectChanges();
623+
624+
let [firstMenuItemDebugEl, secondMenuItemDebugEl] =
625+
fixture.debugElement.queryAll(By.css('.mat-menu-item'))!;
626+
627+
const firstMenuItemInstance = firstMenuItemDebugEl.componentInstance as MatMenuItem;
628+
const secondMenuItemInstance = secondMenuItemDebugEl.componentInstance as MatMenuItem;
629+
630+
firstMenuItemInstance.focus('mouse');
631+
secondMenuItemInstance.focus();
632+
633+
expect(secondMenuItemDebugEl.nativeElement.classList).toContain('cdk-focused');
634+
expect(secondMenuItemDebugEl.nativeElement.classList).toContain('cdk-mouse-focused');
635+
});
636+
618637
it('should not throw an error on destroy', () => {
619638
const fixture = createComponent(SimpleMenu, [], [FakeIcon]);
620639
expect(fixture.destroy.bind(fixture)).not.toThrow();
@@ -2006,6 +2025,24 @@ describe('MatMenu', () => {
20062025
.toContain('mat-elevation-z4', 'Expected menu to have the proper updated elevation.');
20072026
}));
20082027

2028+
it('should not change focus origin if origin not specified for menu trigger',
2029+
fakeAsync(() => {
2030+
compileTestComponent();
2031+
2032+
instance.levelOneTrigger.openMenu();
2033+
instance.levelOneTrigger.focus('mouse');
2034+
fixture.detectChanges();
2035+
2036+
instance.levelTwoTrigger.focus();
2037+
fixture.detectChanges();
2038+
tick(500);
2039+
2040+
const levelTwoTrigger = overlay.querySelector('#level-two-trigger')! as HTMLElement;
2041+
2042+
expect(levelTwoTrigger.classList).toContain('cdk-focused');
2043+
expect(levelTwoTrigger.classList).toContain('cdk-mouse-focused');
2044+
}));
2045+
20092046
it('should not increase the elevation if the user specified a custom one', () => {
20102047
const elevationFixture = createComponent(NestedMenuCustomElevation);
20112048

0 commit comments

Comments
 (0)