mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 17:23:37 +00:00
[PM-5189] Refactoring implementation
This commit is contained in:
@@ -21,7 +21,7 @@ export type AutofillExtensionMessage = {
|
|||||||
isOverlayCiphersPopulated?: boolean;
|
isOverlayCiphersPopulated?: boolean;
|
||||||
direction?: "previous" | "next" | "current";
|
direction?: "previous" | "next" | "current";
|
||||||
forceCloseOverlay?: boolean;
|
forceCloseOverlay?: boolean;
|
||||||
autofillOverlayVisibility?: number;
|
inlineMenuVisibility?: number;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
describe("identifies the overlay visibility setting", () => {
|
describe("identifies the overlay visibility setting", () => {
|
||||||
it("defaults the overlay visibility setting to `OnFieldFocus` if a value is not set", async () => {
|
it("defaults the overlay visibility setting to `OnFieldFocus` if a value is not set", async () => {
|
||||||
sendExtensionMessageSpy.mockResolvedValueOnce(undefined);
|
sendExtensionMessageSpy.mockResolvedValueOnce(undefined);
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] = undefined;
|
autofillOverlayContentService["inlineMenuVisibility"] = undefined;
|
||||||
|
|
||||||
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
||||||
autofillFieldElement,
|
autofillFieldElement,
|
||||||
@@ -231,21 +231,21 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
expect(sendExtensionMessageSpy).toHaveBeenCalledWith("getInlineMenuVisibilitySetting");
|
expect(sendExtensionMessageSpy).toHaveBeenCalledWith("getInlineMenuVisibilitySetting");
|
||||||
expect(autofillOverlayContentService["autofillOverlayVisibility"]).toEqual(
|
expect(autofillOverlayContentService["inlineMenuVisibility"]).toEqual(
|
||||||
AutofillOverlayVisibility.OnFieldFocus,
|
AutofillOverlayVisibility.OnFieldFocus,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("sets the overlay visibility setting to the value returned from the background script", async () => {
|
it("sets the overlay visibility setting to the value returned from the background script", async () => {
|
||||||
sendExtensionMessageSpy.mockResolvedValueOnce(AutofillOverlayVisibility.OnFieldFocus);
|
sendExtensionMessageSpy.mockResolvedValueOnce(AutofillOverlayVisibility.OnFieldFocus);
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] = undefined;
|
autofillOverlayContentService["inlineMenuVisibility"] = undefined;
|
||||||
|
|
||||||
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
||||||
autofillFieldElement,
|
autofillFieldElement,
|
||||||
autofillFieldData,
|
autofillFieldData,
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(autofillOverlayContentService["autofillOverlayVisibility"]).toEqual(
|
expect(autofillOverlayContentService["inlineMenuVisibility"]).toEqual(
|
||||||
AutofillOverlayVisibility.OnFieldFocus,
|
AutofillOverlayVisibility.OnFieldFocus,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -594,7 +594,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
it("skips triggering the handler logic if autofill is currently filling", async () => {
|
it("skips triggering the handler logic if autofill is currently filling", async () => {
|
||||||
isFieldCurrentlyFillingSpy.mockResolvedValue(true);
|
isFieldCurrentlyFillingSpy.mockResolvedValue(true);
|
||||||
autofillOverlayContentService["mostRecentlyFocusedField"] = autofillFieldElement;
|
autofillOverlayContentService["mostRecentlyFocusedField"] = autofillFieldElement;
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnFieldFocus;
|
AutofillOverlayVisibility.OnFieldFocus;
|
||||||
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
||||||
autofillFieldElement,
|
autofillFieldElement,
|
||||||
@@ -623,7 +623,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("removes the overlay list if the autofill visibility is set to onClick", async () => {
|
it("removes the overlay list if the autofill visibility is set to onClick", async () => {
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnButtonClick;
|
AutofillOverlayVisibility.OnButtonClick;
|
||||||
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
||||||
autofillFieldElement,
|
autofillFieldElement,
|
||||||
@@ -660,7 +660,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
|
|
||||||
it("opens the autofill overlay if the form element has no value", async () => {
|
it("opens the autofill overlay if the form element has no value", async () => {
|
||||||
(autofillFieldElement as HTMLInputElement).value = "";
|
(autofillFieldElement as HTMLInputElement).value = "";
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnFieldFocus;
|
AutofillOverlayVisibility.OnFieldFocus;
|
||||||
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
||||||
autofillFieldElement,
|
autofillFieldElement,
|
||||||
@@ -675,7 +675,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
|
|
||||||
it("opens the autofill overlay if the overlay ciphers are not populated and the user is authed", async () => {
|
it("opens the autofill overlay if the overlay ciphers are not populated and the user is authed", async () => {
|
||||||
(autofillFieldElement as HTMLInputElement).value = "";
|
(autofillFieldElement as HTMLInputElement).value = "";
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnFieldFocus;
|
AutofillOverlayVisibility.OnFieldFocus;
|
||||||
jest.spyOn(autofillOverlayContentService as any, "isUserAuthed").mockReturnValue(true);
|
jest.spyOn(autofillOverlayContentService as any, "isUserAuthed").mockReturnValue(true);
|
||||||
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
await autofillOverlayContentService.setupAutofillOverlayListenerOnField(
|
||||||
@@ -690,7 +690,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("updates the overlay button position if the focus event is not opening the overlay", async () => {
|
it("updates the overlay button position if the focus event is not opening the overlay", async () => {
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnFieldFocus;
|
AutofillOverlayVisibility.OnFieldFocus;
|
||||||
(autofillFieldElement as HTMLInputElement).value = "test";
|
(autofillFieldElement as HTMLInputElement).value = "test";
|
||||||
jest
|
jest
|
||||||
@@ -828,7 +828,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("opens the autofill overlay button only if overlay visibility is set for onButtonClick", () => {
|
it("opens the autofill overlay button only if overlay visibility is set for onButtonClick", () => {
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnButtonClick;
|
AutofillOverlayVisibility.OnButtonClick;
|
||||||
|
|
||||||
autofillOverlayContentService["openAutofillOverlayMenu"]({ isOpeningFullOverlay: false });
|
autofillOverlayContentService["openAutofillOverlayMenu"]({ isOpeningFullOverlay: false });
|
||||||
@@ -845,7 +845,7 @@ describe("AutofillOverlayContentService", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("overrides the onButtonClick visibility setting to open both overlay elements", () => {
|
it("overrides the onButtonClick visibility setting to open both overlay elements", () => {
|
||||||
autofillOverlayContentService["autofillOverlayVisibility"] =
|
autofillOverlayContentService["inlineMenuVisibility"] =
|
||||||
AutofillOverlayVisibility.OnButtonClick;
|
AutofillOverlayVisibility.OnButtonClick;
|
||||||
|
|
||||||
autofillOverlayContentService["openAutofillOverlayMenu"]({ isOpeningFullOverlay: true });
|
autofillOverlayContentService["openAutofillOverlayMenu"]({ isOpeningFullOverlay: true });
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import { AutoFillConstants } from "./autofill-constants";
|
|||||||
|
|
||||||
class AutofillOverlayContentService implements AutofillOverlayContentServiceInterface {
|
class AutofillOverlayContentService implements AutofillOverlayContentServiceInterface {
|
||||||
pageDetailsUpdateRequired = false;
|
pageDetailsUpdateRequired = false;
|
||||||
autofillOverlayVisibility: number;
|
inlineMenuVisibility: number;
|
||||||
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([]);
|
||||||
@@ -92,7 +92,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
await this.updateMostRecentlyFocusedField(formFieldElement);
|
await this.updateMostRecentlyFocusedField(formFieldElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.autofillOverlayVisibility) {
|
if (!this.inlineMenuVisibility) {
|
||||||
await this.getInlineMenuVisibilitySetting();
|
await this.getInlineMenuVisibilitySetting();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
this.autofillOverlayVisibility === AutofillOverlayVisibility.OnButtonClick &&
|
this.inlineMenuVisibility === AutofillOverlayVisibility.OnButtonClick &&
|
||||||
!isOpeningFullOverlay
|
!isOpeningFullOverlay
|
||||||
) {
|
) {
|
||||||
this.updateOverlayButtonPosition();
|
this.updateOverlayButtonPosition();
|
||||||
@@ -456,7 +456,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
const formElementHasValue = Boolean((formFieldElement as HTMLInputElement).value);
|
const formElementHasValue = Boolean((formFieldElement as HTMLInputElement).value);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
this.autofillOverlayVisibility === AutofillOverlayVisibility.OnButtonClick ||
|
this.inlineMenuVisibility === AutofillOverlayVisibility.OnButtonClick ||
|
||||||
(formElementHasValue && initiallyFocusedField !== this.mostRecentlyFocusedField)
|
(formElementHasValue && initiallyFocusedField !== this.mostRecentlyFocusedField)
|
||||||
) {
|
) {
|
||||||
await this.sendExtensionMessage("closeAutofillOverlayMenu", {
|
await this.sendExtensionMessage("closeAutofillOverlayMenu", {
|
||||||
@@ -724,7 +724,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
*/
|
*/
|
||||||
private async getInlineMenuVisibilitySetting() {
|
private async getInlineMenuVisibilitySetting() {
|
||||||
const overlayVisibility = await this.sendExtensionMessage("getInlineMenuVisibilitySetting");
|
const overlayVisibility = await this.sendExtensionMessage("getInlineMenuVisibilitySetting");
|
||||||
this.autofillOverlayVisibility = overlayVisibility || AutofillOverlayVisibility.OnFieldFocus;
|
this.inlineMenuVisibility = overlayVisibility || AutofillOverlayVisibility.OnFieldFocus;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -982,11 +982,11 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte
|
|||||||
};
|
};
|
||||||
|
|
||||||
private updateInlineMenuVisibility({ data }: AutofillExtensionMessage) {
|
private updateInlineMenuVisibility({ data }: AutofillExtensionMessage) {
|
||||||
if (isNaN(data?.autofillOverlayVisibility)) {
|
if (isNaN(data?.inlineMenuVisibility)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.autofillOverlayVisibility = data.autofillOverlayVisibility;
|
this.inlineMenuVisibility = data.inlineMenuVisibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async isFieldCurrentlyFilling() {
|
private async isFieldCurrentlyFilling() {
|
||||||
|
|||||||
@@ -2088,7 +2088,7 @@ export default class AutofillService implements AutofillServiceInterface {
|
|||||||
const tabs = await BrowserApi.tabsQuery({});
|
const tabs = await BrowserApi.tabsQuery({});
|
||||||
tabs.forEach((tab) =>
|
tabs.forEach((tab) =>
|
||||||
BrowserApi.tabSendMessageData(tab, "updateInlineMenuVisibility", {
|
BrowserApi.tabSendMessageData(tab, "updateInlineMenuVisibility", {
|
||||||
autofillOverlayVisibility: currentSetting,
|
inlineMenuVisibility: currentSetting,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user