Skip to content

Commit 76cb9d0

Browse files
crisbetovivian-hu-zz
authored andcommittedJan 16, 2019
fix(tabs): don't handle keyboard events with modifier keys (#14234)
Doesn't `preventDefault` or react to any of the keyboard shortcuts, if the user is holding a modifier key, in order to avoid interfering with other OS-level shortcuts.
1 parent c92d8c9 commit 76cb9d0

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed
 

‎src/lib/tabs/tab-header.spec.ts

+30-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import {Direction, Directionality} from '@angular/cdk/bidi';
22
import {END, ENTER, HOME, LEFT_ARROW, RIGHT_ARROW, SPACE} from '@angular/cdk/keycodes';
33
import {PortalModule} from '@angular/cdk/portal';
44
import {ScrollingModule, ViewportRuler} from '@angular/cdk/scrolling';
5-
import {dispatchFakeEvent, dispatchKeyboardEvent} from '@angular/cdk/testing';
5+
import {
6+
dispatchFakeEvent,
7+
dispatchKeyboardEvent,
8+
createKeyboardEvent,
9+
dispatchEvent,
10+
} from '@angular/cdk/testing';
611
import {CommonModule} from '@angular/common';
712
import {Component, ViewChild} from '@angular/core';
813
import {
@@ -193,6 +198,30 @@ describe('MatTabHeader', () => {
193198
expect(appComponent.tabHeader.focusIndex).toBe(2);
194199
});
195200

201+
it('should not do anything if a modifier key is pressed', () => {
202+
const rightArrowEvent = createKeyboardEvent('keydown', RIGHT_ARROW);
203+
const enterEvent = createKeyboardEvent('keydown', ENTER);
204+
205+
[rightArrowEvent, enterEvent].forEach(event => {
206+
Object.defineProperty(event, 'shiftKey', {get: () => true});
207+
});
208+
209+
appComponent.tabHeader.focusIndex = 0;
210+
fixture.detectChanges();
211+
expect(appComponent.tabHeader.focusIndex).toBe(0);
212+
213+
dispatchEvent(tabListContainer, rightArrowEvent);
214+
fixture.detectChanges();
215+
expect(appComponent.tabHeader.focusIndex).toBe(0);
216+
expect(rightArrowEvent.defaultPrevented).toBe(false);
217+
218+
expect(appComponent.selectedIndex).toBe(0);
219+
dispatchEvent(tabListContainer, enterEvent);
220+
fixture.detectChanges();
221+
expect(appComponent.selectedIndex).toBe(0);
222+
expect(enterEvent.defaultPrevented).toBe(false);
223+
});
224+
196225
});
197226

198227
describe('pagination', () => {

‎src/lib/tabs/tab-header.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import {Direction, Directionality} from '@angular/cdk/bidi';
1010
import {coerceNumberProperty} from '@angular/cdk/coercion';
11-
import {END, ENTER, HOME, SPACE} from '@angular/cdk/keycodes';
11+
import {END, ENTER, HOME, SPACE, hasModifierKey} from '@angular/cdk/keycodes';
1212
import {ViewportRuler} from '@angular/cdk/scrolling';
1313
import {
1414
AfterContentChecked,
@@ -176,6 +176,11 @@ export class MatTabHeader extends _MatTabHeaderMixinBase
176176
}
177177

178178
_handleKeydown(event: KeyboardEvent) {
179+
// We don't handle any key bindings with a modifier key.
180+
if (hasModifierKey(event)) {
181+
return;
182+
}
183+
179184
switch (event.keyCode) {
180185
case HOME:
181186
this._keyManager.setFirstItemActive();

0 commit comments

Comments
 (0)
Please sign in to comment.