From 96ab8165f91f7686a51e5d667f982d83bea29b08 Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Fri, 9 May 2025 13:30:05 -0400 Subject: [PATCH] Add new device type for DuckDuckGo browser --- .../core/web-platform-utils.service.spec.ts | 25 +++++++++++++++++++ .../app/core/web-platform-utils.service.ts | 5 ++++ libs/common/src/enums/device-type.enum.ts | 2 ++ 3 files changed, 32 insertions(+) diff --git a/apps/web/src/app/core/web-platform-utils.service.spec.ts b/apps/web/src/app/core/web-platform-utils.service.spec.ts index 3b5cb96b718..706cf2d2dc9 100644 --- a/apps/web/src/app/core/web-platform-utils.service.spec.ts +++ b/apps/web/src/app/core/web-platform-utils.service.spec.ts @@ -1,5 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { DeviceType } from "@bitwarden/common/enums"; + import { WebPlatformUtilsService } from "./web-platform-utils.service"; describe("Web Platform Utils Service", () => { @@ -114,4 +116,27 @@ describe("Web Platform Utils Service", () => { expect(result).toBe("2022.10.2"); }); }); + describe("getDevice", () => { + const originalUserAgent = navigator.userAgent; + + const setUserAgent = (userAgent: string) => { + Object.defineProperty(navigator, "userAgent", { + value: userAgent, + configurable: true, + }); + }; + + afterEach(() => { + // Reset to original after each test + setUserAgent(originalUserAgent); + }); + + test("returns DuckDuckGo browser with example User-Agent", () => { + setUserAgent( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15 Ddg/18.3.1", + ); + const result = webPlatformUtilsService.getDevice(); + expect(result).toBe(DeviceType.DuckDuckGoBrowser); + }); + }); }); diff --git a/apps/web/src/app/core/web-platform-utils.service.ts b/apps/web/src/app/core/web-platform-utils.service.ts index 3df2a7d895b..f7d58e72ded 100644 --- a/apps/web/src/app/core/web-platform-utils.service.ts +++ b/apps/web/src/app/core/web-platform-utils.service.ts @@ -34,6 +34,11 @@ export class WebPlatformUtilsService implements PlatformUtilsService { this.browserCache = DeviceType.EdgeBrowser; } else if (navigator.userAgent.indexOf(" Vivaldi/") !== -1) { this.browserCache = DeviceType.VivaldiBrowser; + } else if ( + navigator.userAgent.indexOf(" Safari/") !== -1 && + navigator.userAgent.indexOf("Ddg") !== -1 + ) { + this.browserCache = DeviceType.DuckDuckGoBrowser; } else if ( navigator.userAgent.indexOf(" Safari/") !== -1 && navigator.userAgent.indexOf("Chrome") === -1 diff --git a/libs/common/src/enums/device-type.enum.ts b/libs/common/src/enums/device-type.enum.ts index ff6329b9ac4..87f121785b4 100644 --- a/libs/common/src/enums/device-type.enum.ts +++ b/libs/common/src/enums/device-type.enum.ts @@ -25,6 +25,7 @@ export enum DeviceType { WindowsCLI = 23, MacOsCLI = 24, LinuxCLI = 25, + DuckDuckGoBrowser = 26, } /** @@ -53,6 +54,7 @@ export const DeviceTypeMetadata: Record = { [DeviceType.IEBrowser]: { category: "webVault", platform: "IE" }, [DeviceType.SafariBrowser]: { category: "webVault", platform: "Safari" }, [DeviceType.VivaldiBrowser]: { category: "webVault", platform: "Vivaldi" }, + [DeviceType.DuckDuckGoBrowser]: { category: "webVault", platform: "DuckDuckGo" }, [DeviceType.UnknownBrowser]: { category: "webVault", platform: "Unknown" }, [DeviceType.WindowsDesktop]: { category: "desktop", platform: "Windows" }, [DeviceType.MacOsDesktop]: { category: "desktop", platform: "macOS" },