From a7df1d0a3bca5bb0905f9ec5ed466e91ea770cbf Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 19 Oct 2018 17:04:45 +0200 Subject: [PATCH] fix(menu): closing parent overlay when pressing escape (#13442) --- 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 f7147cdc7d2..2798b138d93 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 190d8ff0cf8..0a88bf5e1d7 100644 --- a/src/lib/menu/menu-trigger.ts +++ b/src/lib/menu/menu-trigger.ts @@ -350,6 +350,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 834e7b56fea..38a59dbcef3 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', () => {