diff --git a/src/lib/select/select.spec.ts b/src/lib/select/select.spec.ts index d0ccd49d82ac..b609b414894f 100644 --- a/src/lib/select/select.spec.ts +++ b/src/lib/select/select.spec.ts @@ -253,6 +253,36 @@ describe('MatSelect', () => { 'Expected value from second option to have been set on the model.'); })); + it('should open a single-selection select using ALT + DOWN_ARROW', fakeAsync(() => { + const {control: formControl, select: selectInstance} = fixture.componentInstance; + + expect(selectInstance.panelOpen).toBe(false, 'Expected select to be closed.'); + expect(formControl.value).toBeFalsy('Expected no initial value.'); + + const event = createKeyboardEvent('keydown', DOWN_ARROW); + Object.defineProperty(event, 'altKey', {get: () => true}); + + dispatchEvent(select, event); + + expect(selectInstance.panelOpen).toBe(true, 'Expected select to be open.'); + expect(formControl.value).toBeFalsy('Expected value not to have changed.'); + })); + + it('should open a single-selection select using ALT + UP_ARROW', fakeAsync(() => { + const {control: formControl, select: selectInstance} = fixture.componentInstance; + + expect(selectInstance.panelOpen).toBe(false, 'Expected select to be closed.'); + expect(formControl.value).toBeFalsy('Expected no initial value.'); + + const event = createKeyboardEvent('keydown', UP_ARROW); + Object.defineProperty(event, 'altKey', {get: () => true}); + + dispatchEvent(select, event); + + expect(selectInstance.panelOpen).toBe(true, 'Expected select to be open.'); + expect(formControl.value).toBeFalsy('Expected value not to have changed.'); + })); + it('should be able to select options by typing on a closed select', fakeAsync(() => { const formControl = fixture.componentInstance.control; const options = fixture.componentInstance.options.toArray(); diff --git a/src/lib/select/select.ts b/src/lib/select/select.ts index 09eea167a9f6..a0e9df39e8fd 100644 --- a/src/lib/select/select.ts +++ b/src/lib/select/select.ts @@ -644,7 +644,7 @@ export class MatSelect extends _MatSelectMixinBase implements AfterContentInit, const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW; const isOpenKey = keyCode === ENTER || keyCode === SPACE; - if (isOpenKey || (this.multiple && isArrowKey)) { + if (isOpenKey || ((this.multiple || event.altKey) && isArrowKey)) { event.preventDefault(); // prevents the page from scrolling down when pressing space this.open(); } else if (!this.multiple) {