mirror of
https://github.com/bitwarden/browser
synced 2025-12-17 16:53:34 +00:00
feat(DuckDuckGo): [PM-9388] Add new device type for DuckDuckGo browser
* Add new device type for DuckDuckGo browser * Added feature support property for sync domains * Added new features * Added isDuckDuckGo() to CLI * Addressed PR feedback. * Renamed new property * Fixed rename that missed CLI.
This commit is contained in:
@@ -12,7 +12,7 @@ export class WebFileDownloadService implements FileDownloadService {
|
||||
download(request: FileDownloadRequest): void {
|
||||
const builder = new FileDownloadBuilder(request);
|
||||
const a = window.document.createElement("a");
|
||||
if (!this.platformUtilsService.isSafari()) {
|
||||
if (!this.platformUtilsService.supportsFileDownloads()) {
|
||||
a.rel = "noreferrer";
|
||||
a.target = "_blank";
|
||||
}
|
||||
|
||||
@@ -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,91 @@ 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,
|
||||
});
|
||||
};
|
||||
|
||||
const setWindowProperties = (props?: Record<string, any>) => {
|
||||
if (!props) {
|
||||
return;
|
||||
}
|
||||
Object.keys(props).forEach((key) => {
|
||||
Object.defineProperty(window, key, {
|
||||
value: props[key],
|
||||
configurable: true,
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
afterEach(() => {
|
||||
// Reset to original after each test
|
||||
setUserAgent(originalUserAgent);
|
||||
});
|
||||
|
||||
const testData: {
|
||||
userAgent: string;
|
||||
expectedDevice: DeviceType;
|
||||
windowProps?: Record<string, any>;
|
||||
}[] = [
|
||||
{
|
||||
// DuckDuckGo macoOS browser v1.13
|
||||
userAgent:
|
||||
"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",
|
||||
expectedDevice: DeviceType.DuckDuckGoBrowser,
|
||||
},
|
||||
// DuckDuckGo Windows browser v0.109.7, which does not present the Ddg suffix and is therefore detected as Edge
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0",
|
||||
expectedDevice: DeviceType.EdgeBrowser,
|
||||
},
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
|
||||
expectedDevice: DeviceType.ChromeBrowser,
|
||||
windowProps: { chrome: {} }, // set window.chrome = {} to simulate Chrome
|
||||
},
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0",
|
||||
expectedDevice: DeviceType.FirefoxBrowser,
|
||||
},
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15",
|
||||
expectedDevice: DeviceType.SafariBrowser,
|
||||
},
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edg/120.0.0.0 Chrome/120.0.0.0 Safari/537.36",
|
||||
expectedDevice: DeviceType.EdgeBrowser,
|
||||
},
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.65 Safari/537.36 OPR/95.0.4635.46",
|
||||
expectedDevice: DeviceType.OperaBrowser,
|
||||
},
|
||||
{
|
||||
userAgent:
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.57 Safari/537.36 Vivaldi/6.5.3206.48",
|
||||
expectedDevice: DeviceType.VivaldiBrowser,
|
||||
},
|
||||
];
|
||||
|
||||
test.each(testData)(
|
||||
"returns $expectedDevice for User-Agent: $userAgent",
|
||||
({ userAgent, expectedDevice, windowProps }) => {
|
||||
setUserAgent(userAgent);
|
||||
setWindowProperties(windowProps);
|
||||
const result = webPlatformUtilsService.getDevice();
|
||||
expect(result).toBe(expectedDevice);
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -34,6 +34,13 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
this.browserCache = DeviceType.EdgeBrowser;
|
||||
} else if (navigator.userAgent.indexOf(" Vivaldi/") !== -1) {
|
||||
this.browserCache = DeviceType.VivaldiBrowser;
|
||||
} else if (
|
||||
// We are only detecting DuckDuckGo browser on macOS currently, as
|
||||
// it is not presenting the Ddg suffix on Windows. DuckDuckGo users
|
||||
// on Windows will be detected as Edge.
|
||||
navigator.userAgent.indexOf("Ddg") !== -1
|
||||
) {
|
||||
this.browserCache = DeviceType.DuckDuckGoBrowser;
|
||||
} else if (
|
||||
navigator.userAgent.indexOf(" Safari/") !== -1 &&
|
||||
navigator.userAgent.indexOf("Chrome") === -1
|
||||
@@ -83,6 +90,10 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
return this.getDevice() === DeviceType.SafariBrowser;
|
||||
}
|
||||
|
||||
isWebKit(): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
isMacAppStore(): boolean {
|
||||
return false;
|
||||
}
|
||||
@@ -120,6 +131,15 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
return true;
|
||||
}
|
||||
|
||||
supportsAutofill(): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Safari support for blob downloads is inconsistent and requires workarounds
|
||||
supportsFileDownloads(): boolean {
|
||||
return !(this.getDevice() === DeviceType.SafariBrowser);
|
||||
}
|
||||
|
||||
showToast(
|
||||
type: "error" | "success" | "warning" | "info",
|
||||
title: string,
|
||||
|
||||
Reference in New Issue
Block a user