From cfb2b3d1793f2d92d01666514f31dc60ff74c7e9 Mon Sep 17 00:00:00 2001 From: crisbeto Date: Mon, 25 Jun 2018 20:19:02 +0200 Subject: [PATCH] fix(autocomplete): don't override native autocomplete attribute Setting the native `autocomplete` attribute to random can sometimes be used to work around the browser not disabling the native autocompletion, however we always override it to `off`. These changes allow the consumer to opt-in to a different value. Fixes #11818. --- src/lib/autocomplete/autocomplete-trigger.ts | 8 +++++++- src/lib/autocomplete/autocomplete.spec.ts | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/lib/autocomplete/autocomplete-trigger.ts b/src/lib/autocomplete/autocomplete-trigger.ts index 7be99c44f356..5217d48597de 100644 --- a/src/lib/autocomplete/autocomplete-trigger.ts +++ b/src/lib/autocomplete/autocomplete-trigger.ts @@ -98,7 +98,7 @@ export function getMatAutocompleteMissingPanelError(): Error { @Directive({ selector: `input[matAutocomplete], textarea[matAutocomplete]`, host: { - 'autocomplete': 'off', + '[attr.autocomplete]': 'autocompleteAttribute', '[attr.role]': 'autocompleteDisabled ? null : "combobox"', '[attr.aria-autocomplete]': 'autocompleteDisabled ? null : "list"', '[attr.aria-activedescendant]': 'activeOption?.id', @@ -153,6 +153,12 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { */ @Input('matAutocompleteConnectedTo') connectedTo: MatAutocompleteOrigin; + /** + * `autocomplete` attribute to be set on the input element. + * @docs-private + */ + @Input('autocomplete') autocompleteAttribute: string = 'off'; + /** * Whether the autocomplete is disabled. When disabled, the element will * act as a regular input and the user won't be able to open the panel. diff --git a/src/lib/autocomplete/autocomplete.spec.ts b/src/lib/autocomplete/autocomplete.spec.ts index 7d1240b602f4..eee9f95a03c8 100644 --- a/src/lib/autocomplete/autocomplete.spec.ts +++ b/src/lib/autocomplete/autocomplete.spec.ts @@ -522,6 +522,15 @@ describe('MatAutocomplete', () => { expect(boundingBox.getAttribute('dir')).toEqual('ltr'); }); + it('should be able to set a custom value for the `autocomplete` attribute', () => { + const fixture = createComponent(AutocompleteWithNativeAutocompleteAttribute); + const input = fixture.nativeElement.querySelector('input'); + + fixture.detectChanges(); + + expect(input.getAttribute('autocomplete')).toBe('changed'); + }); + describe('forms integration', () => { let fixture: ComponentFixture; let input: HTMLInputElement; @@ -2377,3 +2386,14 @@ class AutocompleteWithDifferentOrigin { selectedValue: string; values = ['one', 'two', 'three']; } + + +@Component({ + template: ` + + + ` +}) +class AutocompleteWithNativeAutocompleteAttribute { + value: string; +}