diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index 67cc25f2276..1c6583331f4 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -105,11 +105,7 @@ export class AutofillComponent implements OnInit { } async updateAutoFillOverlayVisibility() { - const previousAutoFillOverlayVisibility = await firstValueFrom( - this.autofillSettingsService.inlineMenuVisibility$, - ); await this.autofillSettingsService.setInlineMenuVisibility(this.autoFillOverlayVisibility); - await this.handleUpdatingAutofillOverlayContentScripts(previousAutoFillOverlayVisibility); await this.requestPrivacyPermission(); } @@ -181,27 +177,6 @@ export class AutofillComponent implements OnInit { BrowserApi.createNewTab(this.disablePasswordManagerLink); } - private async handleUpdatingAutofillOverlayContentScripts( - previousAutoFillOverlayVisibility: number, - ) { - const autofillOverlayPreviouslyDisabled = - previousAutoFillOverlayVisibility === AutofillOverlayVisibility.Off; - const autofillOverlayCurrentlyDisabled = - this.autoFillOverlayVisibility === AutofillOverlayVisibility.Off; - - if (!autofillOverlayPreviouslyDisabled && !autofillOverlayCurrentlyDisabled) { - const tabs = await BrowserApi.tabsQuery({}); - tabs.forEach((tab) => - BrowserApi.tabSendMessageData(tab, "updateAutofillOverlayVisibility", { - autofillOverlayVisibility: this.autoFillOverlayVisibility, - }), - ); - return; - } - - await this.autofillService.reloadAutofillScripts(); - } - async requestPrivacyPermission() { if ( this.autoFillOverlayVisibility === AutofillOverlayVisibility.Off || diff --git a/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts b/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts index ceaf850b5dc..30ecbf47d62 100644 --- a/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts +++ b/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts @@ -19,7 +19,7 @@ export type AutofillOverlayContentExtensionMessageHandlers = { bgUnlockPopoutOpened: () => void; bgVaultItemRepromptPopoutOpened: () => void; redirectOverlayFocusOut: ({ message }: AutofillExtensionMessageParam) => void; - updateAutofillOverlayVisibility: ({ message }: AutofillExtensionMessageParam) => void; + updateInlineMenuVisibility: ({ message }: AutofillExtensionMessageParam) => void; getSubFrameOffsets: ({ message }: AutofillExtensionMessageParam) => Promise; getSubFrameOffsetsFromWindowMessage: ({ message }: AutofillExtensionMessageParam) => void; }; diff --git a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts index 8f27959b2bf..176f18d9d37 100644 --- a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts +++ b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts @@ -48,7 +48,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte bgVaultItemRepromptPopoutOpened: () => this.blurMostRecentOverlayField(true), redirectOverlayFocusOut: ({ message }) => this.redirectOverlayFocusOut(message?.data?.direction), - updateAutofillOverlayVisibility: ({ message }) => this.updateAutofillOverlayVisibility(message), + updateInlineMenuVisibility: ({ message }) => this.updateInlineMenuVisibility(message), getSubFrameOffsets: ({ message }) => this.getSubFrameOffsets(message), getSubFrameOffsetsFromWindowMessage: ({ message }) => this.getSubFrameOffsetsFromWindowMessage(message), @@ -981,7 +981,7 @@ class AutofillOverlayContentService implements AutofillOverlayContentServiceInte }); }; - private updateAutofillOverlayVisibility({ data }: AutofillExtensionMessage) { + private updateInlineMenuVisibility({ data }: AutofillExtensionMessage) { if (isNaN(data?.autofillOverlayVisibility)) { return; } diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index b06d4c85742..9b646642a7c 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -1,7 +1,9 @@ -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, startWith } from "rxjs"; +import { pairwise } from "rxjs/operators"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types"; @@ -66,6 +68,11 @@ export default class AutofillService implements AutofillServiceInterface { async loadAutofillScriptsOnInstall() { BrowserApi.addListener(chrome.runtime.onConnect, this.handleInjectedScriptPortConnection); void this.injectAutofillScriptsInAllTabs(); + this.autofillSettingsService.inlineMenuVisibility$ + .pipe(startWith(undefined), pairwise()) + .subscribe(([previousSetting, currentSetting]) => + this.handleInlineMenuVisibilityChange(previousSetting, currentSetting), + ); } /** @@ -2066,4 +2073,27 @@ export default class AutofillService implements AutofillServiceInterface { } } } + + private async handleInlineMenuVisibilityChange( + previousSetting: InlineMenuVisibilitySetting, + currentSetting: InlineMenuVisibilitySetting, + ) { + if (previousSetting === undefined || previousSetting === currentSetting) { + return; + } + + const inlineMenuPreviouslyDisabled = previousSetting === AutofillOverlayVisibility.Off; + const inlineMenuCurrentlyDisabled = currentSetting === AutofillOverlayVisibility.Off; + if (!inlineMenuPreviouslyDisabled && !inlineMenuCurrentlyDisabled) { + const tabs = await BrowserApi.tabsQuery({}); + tabs.forEach((tab) => + BrowserApi.tabSendMessageData(tab, "updateInlineMenuVisibility", { + autofillOverlayVisibility: currentSetting, + }), + ); + return; + } + + await this.reloadAutofillScripts(); + } }