Skip to content

Commit 548d2b7

Browse files
crisbetojelbourn
authored andcommitted
fix(datepicker): able to open from readonly input using keyboard control (#12880)
Fixes users being able to open a datepicker through a `readonly` input by using the alt + down arrow key combination.
1 parent 5d0ec23 commit 548d2b7

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/lib/datepicker/datepicker-input.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,9 @@ export class MatDatepickerInput<D> implements ControlValueAccessor, OnDestroy, V
311311
}
312312

313313
_onKeydown(event: KeyboardEvent) {
314-
if (this._datepicker && event.altKey && event.keyCode === DOWN_ARROW) {
314+
const isAltDownArrow = event.altKey && event.keyCode === DOWN_ARROW;
315+
316+
if (this._datepicker && isAltDownArrow && !this._elementRef.nativeElement.readOnly) {
315317
this._datepicker.open();
316318
event.preventDefault();
317319
}

src/lib/datepicker/datepicker.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ describe('MatDatepicker', () => {
454454
expect(testComponent.datepicker.opened).toBe(false);
455455
}));
456456

457-
it('should open the datpeicker using ALT + DOWN_ARROW', fakeAsync(() => {
457+
it('should open the datepicker using ALT + DOWN_ARROW', fakeAsync(() => {
458458
expect(testComponent.datepicker.opened).toBe(false);
459459

460460
const event = createKeyboardEvent('keydown', DOWN_ARROW);
@@ -468,6 +468,24 @@ describe('MatDatepicker', () => {
468468
expect(event.defaultPrevented).toBe(true);
469469
}));
470470

471+
it('should not open for ALT + DOWN_ARROW on readonly input', fakeAsync(() => {
472+
const input = fixture.nativeElement.querySelector('input');
473+
474+
expect(testComponent.datepicker.opened).toBe(false);
475+
476+
input.setAttribute('readonly', 'true');
477+
478+
const event = createKeyboardEvent('keydown', DOWN_ARROW);
479+
Object.defineProperty(event, 'altKey', {get: () => true});
480+
481+
dispatchEvent(input, event);
482+
fixture.detectChanges();
483+
flush();
484+
485+
expect(testComponent.datepicker.opened).toBe(false);
486+
expect(event.defaultPrevented).toBe(false);
487+
}));
488+
471489
});
472490

473491
describe('datepicker with too many inputs', () => {

0 commit comments

Comments
 (0)