1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-06 00:13:28 +00:00

[PM-18040] Inject ipc content script dynamically (#13674)

* feat: add content script manager

* feat: inject into all pages

* feat: only inject if flag is enabled

* fix: wrong constructor parameters
This commit is contained in:
Andreas Coroiu
2025-04-14 14:41:08 +02:00
committed by GitHub
parent b90ede079d
commit 8b64087b32
3 changed files with 51 additions and 0 deletions

View File

@@ -261,6 +261,7 @@ import VaultTimeoutService from "../key-management/vault-timeout/vault-timeout.s
import { BrowserApi } from "../platform/browser/browser-api";
import { flagEnabled } from "../platform/flags";
import { IpcBackgroundService } from "../platform/ipc/ipc-background.service";
import { IpcContentScriptManagerService } from "../platform/ipc/ipc-content-script-manager.service";
import { UpdateBadge } from "../platform/listeners/update-badge";
/* eslint-disable no-restricted-imports */
import { ChromeMessageSender } from "../platform/messaging/chrome-message.sender";
@@ -405,6 +406,7 @@ export default class MainBackground {
inlineMenuFieldQualificationService: InlineMenuFieldQualificationService;
taskService: TaskService;
ipcContentScriptManagerService: IpcContentScriptManagerService;
ipcService: IpcService;
onUpdatedRan: boolean;
@@ -1314,6 +1316,7 @@ export default class MainBackground {
this.inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService();
this.ipcContentScriptManagerService = new IpcContentScriptManagerService(this.configService);
this.ipcService = new IpcBackgroundService(this.logService);
}

View File

@@ -0,0 +1,42 @@
import { mergeMap } from "rxjs";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { BrowserApi } from "../browser/browser-api";
const IPC_CONTENT_SCRIPT_ID = "ipc-content-script";
export class IpcContentScriptManagerService {
constructor(configService: ConfigService) {
if (!BrowserApi.isManifestVersion(3)) {
// IPC not supported on MV2
return;
}
configService
.getFeatureFlag$(FeatureFlag.IpcChannelFramework)
.pipe(
mergeMap(async (enabled) => {
if (!enabled) {
return;
}
try {
await BrowserApi.unregisterContentScriptsMv3({ ids: [IPC_CONTENT_SCRIPT_ID] });
} catch {
// Ignore errors
}
await BrowserApi.registerContentScriptsMv3([
{
id: IPC_CONTENT_SCRIPT_ID,
matches: ["https://*/*"],
js: ["content/ipc-content-script.js"],
},
]);
}),
)
.subscribe();
}
}

View File

@@ -55,6 +55,9 @@ export enum FeatureFlag {
VaultBulkManagementAction = "vault-bulk-management-action",
SecurityTasks = "security-tasks",
CipherKeyEncryption = "cipher-key-encryption",
/* Platform */
IpcChannelFramework = "ipc-channel-framework",
}
export type AllowedFeatureFlagTypes = boolean | number | string;
@@ -118,6 +121,9 @@ export const DefaultFeatureFlagValue = {
[FeatureFlag.PrivateKeyRegeneration]: FALSE,
[FeatureFlag.UserKeyRotationV2]: FALSE,
[FeatureFlag.PM4154_BulkEncryptionService]: FALSE,
/* Platform */
[FeatureFlag.IpcChannelFramework]: FALSE,
} satisfies Record<FeatureFlag, AllowedFeatureFlagTypes>;
export type DefaultFeatureFlagValueType = typeof DefaultFeatureFlagValue;