From 0da21c5b9431614c4d47541e3e3266e2f009054f Mon Sep 17 00:00:00 2001 From: crisbeto Date: Fri, 5 Oct 2018 15:19:15 +0300 Subject: [PATCH] fix(menu): closing parent overlay when pressing escape Along the same lines as #13413. Since `MatMenu` doesn't consume the `OverlayRef.keydownEvents`, it means that they'll be passed along to the next overlay in the stack. --- src/lib/menu/menu-directive.ts | 1 - src/lib/menu/menu-trigger.ts | 5 +++++ src/lib/menu/menu.spec.ts | 2 -- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib/menu/menu-directive.ts b/src/lib/menu/menu-directive.ts index 008ce1056c6d..2af2a4c524cb 100644 --- a/src/lib/menu/menu-directive.ts +++ b/src/lib/menu/menu-directive.ts @@ -262,7 +262,6 @@ export class MatMenu implements AfterContentInit, MatMenuPanel, OnI switch (keyCode) { case ESCAPE: this.closed.emit('keydown'); - event.stopPropagation(); break; case LEFT_ARROW: if (this.parentMenu && this.direction === 'ltr') { diff --git a/src/lib/menu/menu-trigger.ts b/src/lib/menu/menu-trigger.ts index 88b5112d919b..19e6863e22da 100644 --- a/src/lib/menu/menu-trigger.ts +++ b/src/lib/menu/menu-trigger.ts @@ -347,6 +347,11 @@ export class MatMenuTrigger implements AfterContentInit, OnDestroy { const config = this._getOverlayConfig(); this._subscribeToPositions(config.positionStrategy as FlexibleConnectedPositionStrategy); this._overlayRef = this._overlay.create(config); + + // Consume the `keydownEvents` in order to prevent them from going to another overlay. + // Ideally we'd also have our keyboard event logic in here, however doing so will + // break anybody that may have implemented the `MatMenuPanel` themselves. + this._overlayRef.keydownEvents().subscribe(); } return this._overlayRef; diff --git a/src/lib/menu/menu.spec.ts b/src/lib/menu/menu.spec.ts index 70eb2e4131aa..384c142d0f2f 100644 --- a/src/lib/menu/menu.spec.ts +++ b/src/lib/menu/menu.spec.ts @@ -254,14 +254,12 @@ describe('MatMenu', () => { const panel = overlayContainerElement.querySelector('.mat-menu-panel')!; const event = createKeyboardEvent('keydown', ESCAPE); - const stopPropagationSpy = spyOn(event, 'stopPropagation').and.callThrough(); dispatchEvent(panel, event); fixture.detectChanges(); tick(500); expect(overlayContainerElement.textContent).toBe(''); - expect(stopPropagationSpy).toHaveBeenCalled(); })); it('should open a custom menu', () => {