mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 09:13:33 +00:00
[PM-5189] Implementing a fix for how hidden fields populate the inline menu
This commit is contained in:
@@ -28,6 +28,8 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
private readonly findTabs = tabbable;
|
private readonly findTabs = tabbable;
|
||||||
private readonly sendExtensionMessage = sendExtensionMessage;
|
private readonly sendExtensionMessage = sendExtensionMessage;
|
||||||
private formFieldElements: Set<ElementWithOpId<FormFieldElement>> = new Set([]);
|
private formFieldElements: Set<ElementWithOpId<FormFieldElement>> = new Set([]);
|
||||||
|
private hiddenFormFieldElements: WeakMap<ElementWithOpId<FormFieldElement>, AutofillField> =
|
||||||
|
new WeakMap();
|
||||||
private ignoredFieldTypes: Set<string> = new Set(AutoFillConstants.ExcludedOverlayTypes);
|
private ignoredFieldTypes: Set<string> = new Set(AutoFillConstants.ExcludedOverlayTypes);
|
||||||
private userFilledFields: Record<string, FillableFormFieldElement> = {};
|
private userFilledFields: Record<string, FillableFormFieldElement> = {};
|
||||||
private authStatus: AuthenticationStatus;
|
private authStatus: AuthenticationStatus;
|
||||||
@@ -80,6 +82,10 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.isHiddenField(formFieldElement, autofillFieldData)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.formFieldElements.add(formFieldElement);
|
this.formFieldElements.add(formFieldElement);
|
||||||
|
|
||||||
if (!this.mostRecentlyFocusedField) {
|
if (!this.mostRecentlyFocusedField) {
|
||||||
@@ -658,9 +664,6 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
*/
|
*/
|
||||||
private isIgnoredField(autofillFieldData: AutofillField): boolean {
|
private isIgnoredField(autofillFieldData: AutofillField): boolean {
|
||||||
if (
|
if (
|
||||||
autofillFieldData.readonly ||
|
|
||||||
autofillFieldData.disabled ||
|
|
||||||
!autofillFieldData.viewable ||
|
|
||||||
this.ignoredFieldTypes.has(autofillFieldData.type) ||
|
this.ignoredFieldTypes.has(autofillFieldData.type) ||
|
||||||
this.keywordsFoundInFieldData(autofillFieldData, ["search", "captcha"])
|
this.keywordsFoundInFieldData(autofillFieldData, ["search", "captcha"])
|
||||||
) {
|
) {
|
||||||
@@ -674,6 +677,44 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
return !isLoginCipherField;
|
return !isLoginCipherField;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isHiddenField(
|
||||||
|
formFieldElement: ElementWithOpId<FormFieldElement>,
|
||||||
|
autofillFieldData: AutofillField,
|
||||||
|
): boolean {
|
||||||
|
if (!autofillFieldData.readonly && !autofillFieldData.disabled && autofillFieldData.viewable) {
|
||||||
|
this.removeHiddenFieldFallbackListener(formFieldElement);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupHiddenFieldFallbackListener(formFieldElement, autofillFieldData);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private setupHiddenFieldFallbackListener(
|
||||||
|
formFieldElement: ElementWithOpId<FormFieldElement>,
|
||||||
|
autofillFieldData: AutofillField,
|
||||||
|
) {
|
||||||
|
this.hiddenFormFieldElements.set(formFieldElement, autofillFieldData);
|
||||||
|
formFieldElement.addEventListener(EVENTS.FOCUS, this.handleHiddenFieldFocusEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private removeHiddenFieldFallbackListener(formFieldElement: ElementWithOpId<FormFieldElement>) {
|
||||||
|
formFieldElement.removeEventListener(EVENTS.FOCUS, this.handleHiddenFieldFocusEvent);
|
||||||
|
this.hiddenFormFieldElements.delete(formFieldElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
private handleHiddenFieldFocusEvent = (event: FocusEvent) => {
|
||||||
|
const formFieldElement = event.target as ElementWithOpId<FormFieldElement>;
|
||||||
|
const autofillFieldData = this.hiddenFormFieldElements.get(formFieldElement);
|
||||||
|
if (autofillFieldData) {
|
||||||
|
autofillFieldData.viewable = true;
|
||||||
|
void this.setupAutofillOverlayListenerOnField(formFieldElement, autofillFieldData);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.removeHiddenFieldFallbackListener(formFieldElement);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queries the background script for the autofill overlay visibility setting.
|
* Queries the background script for the autofill overlay visibility setting.
|
||||||
* If the setting is not found, a default value of OnFieldFocus will be used
|
* If the setting is not found, a default value of OnFieldFocus will be used
|
||||||
@@ -820,7 +861,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
* autofill overlay if the document is not visible.
|
* autofill overlay if the document is not visible.
|
||||||
*/
|
*/
|
||||||
private handleVisibilityChangeEvent = () => {
|
private handleVisibilityChangeEvent = () => {
|
||||||
if (document.visibilityState === "visible") {
|
if (!this.mostRecentlyFocusedField || document.visibilityState === "visible") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user