Skip to content

Commit d2df024

Browse files
committed
fix(menu): nested trigger staying highlighted after click
Prevents the sub-menu trigger from staying highlighted if the user clicks on it and moves away to another menu item. Fixes #6838.
1 parent 1b6b270 commit d2df024

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

src/cdk/testing/event-objects.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ export function createKeyboardEvent(type: string, keyCode: number, target?: Elem
5757

5858
/** Creates a fake event object with any desired event type. */
5959
export function createFakeEvent(type: string) {
60-
let event = document.createEvent('Event');
60+
const event = document.createEvent('Event');
6161
event.initEvent(type, true, true);
62+
63+
// IE won't set `defaultPrevented` on synthetic events so we need to do it manually.
64+
event.preventDefault = () => Object.defineProperty(event, 'defaultPrevented', {get: () => true});
65+
6266
return event;
6367
}

src/lib/menu/menu-trigger.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,13 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
413413
_handleMousedown(event: MouseEvent): void {
414414
if (!isFakeMousedownFromScreenReader(event)) {
415415
this._openedByMouse = true;
416+
417+
// Since clicking on the trigger won't close the menu if it opens a sub-menu,
418+
// we should prevent focus from moving onto it via click to avoid the
419+
// highlight from lingering on the menu item.
420+
if (this.triggersSubmenu) {
421+
event.preventDefault();
422+
}
416423
}
417424
}
418425

src/lib/menu/menu.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
dispatchMouseEvent,
3030
dispatchEvent,
3131
createKeyboardEvent,
32+
dispatchFakeEvent,
3233
} from '@angular/cdk/testing';
3334

3435

@@ -996,6 +997,14 @@ describe('MdMenu', () => {
996997
expect(overlay.querySelectorAll('.mat-menu-panel').length).toBe(0, 'Expected no open menus');
997998
}));
998999

1000+
it('should prevent the default mousedown action if the menu item opens a sub-menu', () => {
1001+
compileTestComponent();
1002+
instance.rootTrigger.openMenu();
1003+
fixture.detectChanges();
1004+
1005+
const event = dispatchFakeEvent(overlay.querySelector('[md-menu-item]')!, 'mousedown');
1006+
expect(event.defaultPrevented).toBe(true);
1007+
});
9991008

10001009
});
10011010

0 commit comments

Comments
 (0)