diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts index 55e4bf1a78..c0f765e739 100644 --- a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts @@ -446,6 +446,63 @@ describe("InlineMenuFieldQualificationService", () => { inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), ).toBe(false); }); + + it("is structured on a page with multiple viewable password field", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + }); + const secondPasswordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + form: "validFormId", + }); + pageDetails.fields = [field, passwordField, secondPasswordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + + it("is structured on a page with a with no visible password fields and but contains a disabled autocomplete type", () => { + const field = mock({ + type: "text", + autoCompleteType: "off", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + viewable: false, + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); }); }); @@ -549,6 +606,31 @@ describe("InlineMenuFieldQualificationService", () => { inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), ).toBe(true); }); + + it("is structured on a page with a with no visible password fields and a non-disabled autocomplete type", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + viewable: false, + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); }); }); }); diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts index e7284d9613..dd8e52e915 100644 --- a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts @@ -192,12 +192,22 @@ export class InlineMenuFieldQualificationService // If a single password field exists within the page details, and that password field is part of // the same form as the provided field, we should assume that the field is part of a login form. - // If multiple visible password fields exist within the page details, we need to assume that the - // provided field is part of an account creation form. const visiblePasswordFieldsInPageDetails = passwordFieldsInPageDetails.filter( (passwordField) => passwordField.form === field.form && passwordField.viewable, ); - return visiblePasswordFieldsInPageDetails.length === 1; + if (visiblePasswordFieldsInPageDetails.length === 1) { + return true; + } + + // If multiple visible password fields exist within the page details, we need to assume that the + // provided field is part of an account creation form. + if (visiblePasswordFieldsInPageDetails.length > 1) { + return false; + } + + // If no visible password fields are found, this field might be part of a multipart form. + // Check for an invalid autocompleteType to determine if the field is part of a login form. + return !this.autocompleteDisabledValues.has(field.autoCompleteType); } /**