From 360bb777aea9a849d4b2b043a8687f9522957f22 Mon Sep 17 00:00:00 2001 From: crisbeto Date: Wed, 29 Apr 2020 19:13:10 +0200 Subject: [PATCH] fix(tabs): don't prevent default space/enter action if action tab doesn't change Switches to only preventing the default enter/space action if we did something with the event, otherwise we risk interfering with other user events. Fixes #19190. --- .../mdc-tabs/tab-header.spec.ts | 13 +++++++++++++ src/material/tabs/paginated-tab-header.ts | 6 ++++-- src/material/tabs/tab-header.spec.ts | 13 +++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/material-experimental/mdc-tabs/tab-header.spec.ts b/src/material-experimental/mdc-tabs/tab-header.spec.ts index a80fbee2cf64..89474f230282 100644 --- a/src/material-experimental/mdc-tabs/tab-header.spec.ts +++ b/src/material-experimental/mdc-tabs/tab-header.spec.ts @@ -148,6 +148,19 @@ describe('MDC-based MatTabHeader', () => { expect(spaceEvent.defaultPrevented).toBe(true); }); + it('should not prevent the default space/enter action if the current is selected', () => { + appComponent.tabHeader.focusIndex = appComponent.tabHeader.selectedIndex = 0; + fixture.detectChanges(); + + const spaceEvent = dispatchKeyboardEvent(tabListContainer, 'keydown', SPACE); + fixture.detectChanges(); + expect(spaceEvent.defaultPrevented).toBe(false); + + const enterEvent = dispatchKeyboardEvent(tabListContainer, 'keydown', ENTER); + fixture.detectChanges(); + expect(enterEvent.defaultPrevented).toBe(false); + }); + it('should move focus to the first tab when pressing HOME', () => { appComponent.tabHeader.focusIndex = 3; fixture.detectChanges(); diff --git a/src/material/tabs/paginated-tab-header.ts b/src/material/tabs/paginated-tab-header.ts index 49059e97d35c..dbea6ee28a98 100644 --- a/src/material/tabs/paginated-tab-header.ts +++ b/src/material/tabs/paginated-tab-header.ts @@ -269,8 +269,10 @@ export abstract class MatPaginatedTabHeader implements AfterContentChecked, Afte break; case ENTER: case SPACE: - this.selectFocusedIndex.emit(this.focusIndex); - this._itemSelected(event); + if (this.focusIndex !== this.selectedIndex) { + this.selectFocusedIndex.emit(this.focusIndex); + this._itemSelected(event); + } break; default: this._keyManager.onKeydown(event); diff --git a/src/material/tabs/tab-header.spec.ts b/src/material/tabs/tab-header.spec.ts index cf47ce07fd26..447e256b6fbc 100644 --- a/src/material/tabs/tab-header.spec.ts +++ b/src/material/tabs/tab-header.spec.ts @@ -150,6 +150,19 @@ describe('MatTabHeader', () => { expect(spaceEvent.defaultPrevented).toBe(true); }); + it('should not prevent the default space/enter action if the current is selected', () => { + appComponent.tabHeader.focusIndex = appComponent.tabHeader.selectedIndex = 0; + fixture.detectChanges(); + + const spaceEvent = dispatchKeyboardEvent(tabListContainer, 'keydown', SPACE); + fixture.detectChanges(); + expect(spaceEvent.defaultPrevented).toBe(false); + + const enterEvent = dispatchKeyboardEvent(tabListContainer, 'keydown', ENTER); + fixture.detectChanges(); + expect(enterEvent.defaultPrevented).toBe(false); + }); + it('should move focus to the first tab when pressing HOME', () => { appComponent.tabHeader.focusIndex = 3; fixture.detectChanges();