1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-07 20:24:01 +00:00

Ensure imperative accessor continuity.

This commit is contained in:
Miles Blackwood
2026-01-23 11:34:06 -05:00
parent 52b2d0fe25
commit 7c6bf03f57
2 changed files with 26 additions and 16 deletions

View File

@@ -9,6 +9,7 @@ import {
ReplaySubject,
Subject,
switchMap,
tap,
throttleTime,
} from "rxjs";
import { parse } from "tldts";
@@ -48,7 +49,7 @@ import { Fido2CredentialView } from "@bitwarden/common/vault/models/view/fido2-c
import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view";
import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view";
import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
import { GenerateRequest } from "@bitwarden/generator-core";
import { GenerateRequest, Type } from "@bitwarden/generator-core";
import { GeneratedCredential } from "@bitwarden/generator-history";
// FIXME (PM-22628): Popup imports are forbidden in background
@@ -124,6 +125,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
private readonly repositionInlineMenu$ = new Subject<chrome.runtime.MessageSender>();
private readonly rebuildSubFrameOffsets$ = new Subject<chrome.runtime.MessageSender>();
private readonly addNewVaultItem$ = new Subject<CurrentAddNewItemData>();
private readonly requestGeneratedPassword$ = new Subject<GenerateRequest>();
private pageDetailsForTab: PageDetailsForTab = {};
private subFrameOffsetsForTab: SubFrameOffsetsForTab = {};
private portKeyForTab: Record<number, string> = {};
@@ -148,6 +150,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
private showPasskeysLabelsWithinInlineMenu: boolean = false;
private iconsServerUrl: string;
private generatedPassword: string;
private yieldedPassword$: Observable<GeneratedCredential>;
private readonly validPortConnections: Set<string> = new Set([
AutofillOverlayPort.Button,
AutofillOverlayPort.ButtonMessageConnector,
@@ -236,7 +239,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
private themeStateService: ThemeStateService,
private totpService: TotpService,
private accountService: AccountService,
private generatePasswordCallback: (
private yieldGeneratedPassword: (
$on: Observable<GenerateRequest>,
) => Observable<GeneratedCredential>,
private addPasswordCallback: (password: string) => Promise<void>,
@@ -252,6 +255,15 @@ export class OverlayBackground implements OverlayBackgroundInterface {
this.setupExtensionListeners();
const env = await firstValueFrom(this.environmentService.environment$);
this.iconsServerUrl = env.getIconsUrl();
this.yieldedPassword$ = this.yieldGeneratedPassword(merge(this.requestGeneratedPassword$));
this.yieldedPassword$
.pipe(
tap(async ({ credential }) => {
this.generatedPassword = credential;
await this.addPasswordCallback(this.generatedPassword);
}),
)
.subscribe();
}
/**
@@ -1801,9 +1813,8 @@ export class OverlayBackground implements OverlayBackgroundInterface {
/**
* Generates a password based on the user defined password generation options.
*/
private async generatePassword(): Promise<void> {
this.generatedPassword = await this.generatePasswordCallback();
await this.addPasswordCallback(this.generatedPassword);
private async requestGeneratedPassword(source: GenerateRequest["source"]) {
this.requestGeneratedPassword$.next({ source, type: Type.password });
}
/**
@@ -1813,7 +1824,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
*/
private async updateGeneratedPassword(refreshPassword: boolean = false) {
if (!this.generatedPassword || refreshPassword) {
await this.generatePassword();
await this.requestGeneratedPassword("inline-menu");
}
this.postMessageToPort(this.inlineMenuListPort, {
@@ -2949,6 +2960,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
isInlineMenuListPort,
showInlineMenuAccountCreation,
);
const showSaveLoginMenu =
(await this.checkFocusedFieldHasValue(port.sender.tab)) &&
(await this.shouldShowSaveLoginInlineMenuList(port.sender.tab));
@@ -3077,7 +3089,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
}
if (!this.generatedPassword) {
await this.generatePassword();
await this.requestGeneratedPassword();
}
return true;

View File

@@ -10,6 +10,7 @@ import {
map,
merge,
Observable,
of,
Subject,
switchMap,
timeout,
@@ -222,14 +223,14 @@ import { SearchService } from "@bitwarden/common/vault/services/search.service";
import { TotpService } from "@bitwarden/common/vault/services/totp.service";
import { VaultSettingsService } from "@bitwarden/common/vault/services/vault-settings/vault-settings.service";
import { DefaultTaskService, TaskService } from "@bitwarden/common/vault/tasks";
import { GenerateRequest, Type } from "@bitwarden/generator-core";
import { GeneratedCredential } from "@bitwarden/generator-history";
import {
legacyPasswordGenerationServiceFactory,
legacyUsernameGenerationServiceFactory,
PasswordGenerationServiceAbstraction,
UsernameGenerationServiceAbstraction,
} from "@bitwarden/generator-legacy";
import { GenerateRequest } from "@bitwarden/generator-core";
import { GeneratedCredential } from "@bitwarden/generator-history";
import {
DefaultImportMetadataService,
ImportApiService,
@@ -2017,7 +2018,7 @@ export default class MainBackground {
this.totpService,
this.accountService,
this.yieldGeneratedPassword,
(password) => this.addPasswordToHistory(password),
this.addPasswordToHistory,
);
this.autofillBadgeUpdaterService = new AutofillBadgeUpdaterService(
@@ -2059,13 +2060,10 @@ export default class MainBackground {
);
};
generatePassword = async (): Promise<string> => {
const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {};
return await this.passwordGenerationService.generatePassword(options);
};
generatePasswordToClipboard = async () => {
const password = await this.generatePassword();
const { credential: password } = await firstValueFrom(
this.yieldGeneratedPassword(of({ source: "clipboard", type: Type.password })),
);
this.platformUtilsService.copyToClipboard(password);
await this.addPasswordToHistory(password);
};