import { APP_INITIALIZER, LOCALE_ID, NgModule } from "@angular/core"; import { DebounceNavigationService } from "./debounceNavigationService"; import { LaunchGuardService } from "./launch-guard.service"; import { LockGuardService } from "./lock-guard.service"; import { PasswordRepromptService } from "./password-reprompt.service"; import { UnauthGuardService } from "./unauth-guard.service"; import { JslibServicesModule } from "jslib-angular/services/jslib-services.module"; import { LockGuardService as BaseLockGuardService } from "jslib-angular/services/lock-guard.service"; import { UnauthGuardService as BaseUnauthGuardService } from "jslib-angular/services/unauth-guard.service"; import { BrowserApi } from "../../browser/browserApi"; import { ApiService } from "jslib-common/abstractions/api.service"; import { AppIdService } from "jslib-common/abstractions/appId.service"; import { AuditService } from "jslib-common/abstractions/audit.service"; import { AuthService as AuthServiceAbstraction } from "jslib-common/abstractions/auth.service"; import { CipherService } from "jslib-common/abstractions/cipher.service"; import { CollectionService } from "jslib-common/abstractions/collection.service"; import { CryptoService } from "jslib-common/abstractions/crypto.service"; import { CryptoFunctionService } from "jslib-common/abstractions/cryptoFunction.service"; import { EnvironmentService } from "jslib-common/abstractions/environment.service"; import { EventService } from "jslib-common/abstractions/event.service"; import { ExportService } from "jslib-common/abstractions/export.service"; import { FileUploadService } from "jslib-common/abstractions/fileUpload.service"; import { FolderService } from "jslib-common/abstractions/folder.service"; import { I18nService } from "jslib-common/abstractions/i18n.service"; import { KeyConnectorService } from "jslib-common/abstractions/keyConnector.service"; import { LogService as LogServiceAbstraction } from "jslib-common/abstractions/log.service"; import { MessagingService } from "jslib-common/abstractions/messaging.service"; import { NotificationsService } from "jslib-common/abstractions/notifications.service"; import { OrganizationService } from "jslib-common/abstractions/organization.service"; import { PasswordGenerationService } from "jslib-common/abstractions/passwordGeneration.service"; import { PasswordRepromptService as PasswordRepromptServiceAbstraction } from "jslib-common/abstractions/passwordReprompt.service"; import { PlatformUtilsService } from "jslib-common/abstractions/platformUtils.service"; import { PolicyService } from "jslib-common/abstractions/policy.service"; import { ProviderService } from "jslib-common/abstractions/provider.service"; import { SearchService as SearchServiceAbstraction } from "jslib-common/abstractions/search.service"; import { SendService } from "jslib-common/abstractions/send.service"; import { SettingsService } from "jslib-common/abstractions/settings.service"; import { StorageService } from "jslib-common/abstractions/storage.service"; import { SyncService } from "jslib-common/abstractions/sync.service"; import { TokenService } from "jslib-common/abstractions/token.service"; import { TotpService } from "jslib-common/abstractions/totp.service"; import { UserVerificationService } from "jslib-common/abstractions/userVerification.service"; import { VaultTimeoutService } from "jslib-common/abstractions/vaultTimeout.service"; import { AutofillService } from "../../services/abstractions/autofill.service"; import BrowserMessagingService from "../../services/browserMessaging.service"; import { AuthService } from "jslib-common/services/auth.service"; import { ConsoleLogService } from "jslib-common/services/consoleLog.service"; import { SearchService } from "jslib-common/services/search.service"; import { PopupSearchService } from "./popup-search.service"; import { PopupUtilsService } from "./popup-utils.service"; import { ThemeType } from "jslib-common/enums/themeType"; import { StateService } from "../../services/state.service"; import { StateService as StateServiceAbstraction } from "../../services/abstractions/state.service"; function getBgService(service: string) { return (): T => { const page = BrowserApi.getBackgroundPage(); return page ? (page.bitwardenMain[service] as T) : null; }; } const isPrivateMode = BrowserApi.getBackgroundPage() == null; export function initFactory( platformUtilsService: PlatformUtilsService, i18nService: I18nService, storageService: StorageService, popupUtilsService: PopupUtilsService, stateService: StateServiceAbstraction, logService: LogServiceAbstraction ): Function { return async () => { if (!popupUtilsService.inPopup(window)) { window.document.body.classList.add("body-full"); } else if (window.screen.availHeight < 600) { window.document.body.classList.add("body-xs"); } else if (window.screen.availHeight <= 800) { window.document.body.classList.add("body-sm"); } if (!isPrivateMode) { const htmlEl = window.document.documentElement; const theme = await platformUtilsService.getEffectiveTheme(); htmlEl.classList.add("theme_" + theme); platformUtilsService.onDefaultSystemThemeChange(async (sysTheme) => { const bwTheme = await stateService.getTheme(); if (bwTheme == null || bwTheme === ThemeType.System) { htmlEl.classList.remove("theme_" + ThemeType.Light, "theme_" + ThemeType.Dark); htmlEl.classList.add("theme_" + sysTheme); } }); htmlEl.classList.add("locale_" + i18nService.translationLocale); // Workaround for slow performance on external monitors on Chrome + MacOS // See: https://bugs.chromium.org/p/chromium/issues/detail?id=971701#c64 if ( platformUtilsService.isChrome() && navigator.platform.indexOf("Mac") > -1 && popupUtilsService.inPopup(window) && (window.screenLeft < 0 || window.screenTop < 0 || window.screenLeft > window.screen.width || window.screenTop > window.screen.height) ) { htmlEl.classList.add("force_redraw"); logService.info("Force redraw is on"); } } }; } @NgModule({ imports: [JslibServicesModule], declarations: [], providers: [ { provide: LOCALE_ID, useFactory: () => isPrivateMode ? null : getBgService("i18nService")().translationLocale, deps: [], }, { provide: APP_INITIALIZER, useFactory: initFactory, deps: [ PlatformUtilsService, I18nService, StorageService, PopupUtilsService, StateServiceAbstraction, LogServiceAbstraction, ], multi: true, }, LaunchGuardService, { provide: BaseLockGuardService, useClass: LockGuardService }, { provide: BaseUnauthGuardService, useClass: UnauthGuardService }, DebounceNavigationService, PopupUtilsService, { provide: MessagingService, useClass: BrowserMessagingService }, { provide: AuthServiceAbstraction, useFactory: getBgService("authService"), deps: [], }, { provide: StateServiceAbstraction, useFactory: getBgService("stateService") }, { provide: SearchServiceAbstraction, useFactory: ( cipherService: CipherService, logService: ConsoleLogService, i18nService: I18nService ) => { return isPrivateMode ? null : new PopupSearchService( getBgService("searchService")(), cipherService, logService, i18nService ); }, deps: [CipherService, LogServiceAbstraction, I18nService], }, { provide: AuditService, useFactory: getBgService("auditService"), deps: [] }, { provide: FileUploadService, useFactory: getBgService("fileUploadService"), deps: [], }, { provide: CipherService, useFactory: getBgService("cipherService"), deps: [] }, { provide: CryptoFunctionService, useFactory: getBgService("cryptoFunctionService"), deps: [], }, { provide: FolderService, useFactory: getBgService("folderService"), deps: [] }, { provide: CollectionService, useFactory: getBgService("collectionService"), deps: [], }, { provide: LogServiceAbstraction, useFactory: getBgService("logService"), deps: [], }, { provide: EnvironmentService, useFactory: getBgService("environmentService"), deps: [], }, { provide: TotpService, useFactory: getBgService("totpService"), deps: [] }, { provide: TokenService, useFactory: getBgService("tokenService"), deps: [] }, { provide: I18nService, useFactory: getBgService("i18nService"), deps: [] }, { provide: CryptoService, useFactory: getBgService("cryptoService"), deps: [] }, { provide: EventService, useFactory: getBgService("eventService"), deps: [] }, { provide: PolicyService, useFactory: getBgService("policyService"), deps: [] }, { provide: PlatformUtilsService, useFactory: getBgService("platformUtilsService"), deps: [], }, { provide: PasswordGenerationService, useFactory: getBgService("passwordGenerationService"), deps: [], }, { provide: ApiService, useFactory: getBgService("apiService"), deps: [] }, { provide: SyncService, useFactory: getBgService("syncService"), deps: [] }, { provide: SettingsService, useFactory: getBgService("settingsService"), deps: [], }, { provide: StorageService, useFactory: getBgService("storageService"), deps: [], }, { provide: AppIdService, useFactory: getBgService("appIdService"), deps: [] }, { provide: AutofillService, useFactory: getBgService("autofillService"), deps: [], }, { provide: ExportService, useFactory: getBgService("exportService"), deps: [] }, { provide: SendService, useFactory: getBgService("sendService"), deps: [] }, { provide: KeyConnectorService, useFactory: getBgService("keyConnectorService"), deps: [], }, { provide: UserVerificationService, useFactory: getBgService("userVerificationService"), deps: [], }, { provide: VaultTimeoutService, useFactory: getBgService("vaultTimeoutService"), deps: [], }, { provide: NotificationsService, useFactory: getBgService("notificationsService"), deps: [], }, { provide: LogServiceAbstraction, useFactory: getBgService("logService"), deps: [], }, { provide: PasswordRepromptServiceAbstraction, useClass: PasswordRepromptService }, { provide: PasswordRepromptServiceAbstraction, useClass: PasswordRepromptService }, { provide: OrganizationService, useFactory: getBgService("organizationService"), deps: [], }, { provide: ProviderService, useFactory: getBgService("providerService"), deps: [], }, { provide: "SECURE_STORAGE", useFactory: getBgService("secureStorageService"), deps: [], }, ], }) export class ServicesModule {}