utils/os: add Linux and iOS

Also update to navigator.userAgentData to avoid warnings from chromium.
This commit is contained in:
David Lechner
2022-07-15 12:37:36 -05:00
parent e9f9aca3ef
commit b2b173e103
5 changed files with 85 additions and 15 deletions
+55 -8
View File
@@ -1,7 +1,28 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 The Pybricks Authors
// Copyright (c) 2021-2022 The Pybricks Authors
import { isAndroid, isMacOS, isWindows } from './os';
import { isAndroid, isIOS, isLinux, isMacOS, isWindows } from './os';
import { defined } from '.';
class TestUserAgentData implements NavigatorUAData {
getHighEntropyValues(_hints: string[]): Promise<UADataValues> {
throw new Error('Method not implemented.');
}
toJSON(): UALowEntropyJSON {
throw new Error('Method not implemented.');
}
get brands(): NavigatorUABrandVersion[] {
throw new Error('Method not implemented.');
}
get mobile(): boolean {
throw new Error('Method not implemented.');
}
get platform(): string {
return 'test-agent';
}
}
Object.defineProperty(navigator, 'userAgentData', { value: new TestUserAgentData() });
afterEach(() => {
jest.resetAllMocks();
@@ -9,33 +30,59 @@ afterEach(() => {
describe('isAndroid', () => {
test('is true', () => {
jest.spyOn(navigator, 'userAgent', 'get').mockReturnValue('Android');
defined(navigator.userAgentData);
jest.spyOn(navigator.userAgentData, 'platform', 'get').mockReturnValue(
'Android',
);
expect(isAndroid()).toBeTruthy();
});
test('is false', () => {
jest.spyOn(navigator, 'userAgent', 'get').mockReturnValue('Linux');
expect(isAndroid()).toBeFalsy();
});
});
describe('isMacOS', () => {
test('is true', () => {
jest.spyOn(navigator, 'platform', 'get').mockReturnValue('MacIntel');
defined(navigator.userAgentData);
jest.spyOn(navigator.userAgentData, 'platform', 'get').mockReturnValue('macOS');
expect(isMacOS()).toBeTruthy();
});
test('is false', () => {
jest.spyOn(navigator, 'platform', 'get').mockReturnValue('Win32');
expect(isMacOS()).toBeFalsy();
});
});
describe('isWindows', () => {
test('is true', () => {
jest.spyOn(navigator, 'platform', 'get').mockReturnValue('Win32');
defined(navigator.userAgentData);
jest.spyOn(navigator.userAgentData, 'platform', 'get').mockReturnValue(
'Windows',
);
expect(isWindows()).toBeTruthy();
});
test('is false', () => {
jest.spyOn(navigator, 'platform', 'get').mockReturnValue('MacIntel');
expect(isWindows()).toBeFalsy();
});
});
describe('isLinux', () => {
test('is true', () => {
defined(navigator.userAgentData);
jest.spyOn(navigator.userAgentData, 'platform', 'get').mockReturnValue('Linux');
expect(isLinux()).toBeTruthy();
});
test('is false', () => {
expect(isLinux()).toBeFalsy();
});
});
describe('isIOS', () => {
test('is true', () => {
defined(navigator.userAgentData);
jest.spyOn(navigator.userAgentData, 'platform', 'get').mockReturnValue('iOS');
expect(isIOS()).toBeTruthy();
});
test('is false', () => {
expect(isIOS()).toBeFalsy();
});
});
+20 -7
View File
@@ -1,17 +1,14 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 The Pybricks Authors
// Copyright (c) 2021-2022 The Pybricks Authors
// Utility functions for dealing with operating systems.
// TODO: replace with navigator.userAgentData when it is more widely available
// https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API
/**
* Tests if we are running on Android.
* @returns `true` if running on Android, otherwise `false`.
*/
export function isAndroid(): boolean {
return /android/i.test(navigator.userAgent);
return navigator.userAgentData?.platform === 'Android';
}
/**
@@ -19,7 +16,7 @@ export function isAndroid(): boolean {
* @returns `true` if running on macOS, otherwise `false`.
*/
export function isMacOS(): boolean {
return /mac/i.test(navigator.platform);
return navigator.userAgentData?.platform === 'macOS';
}
/**
@@ -27,5 +24,21 @@ export function isMacOS(): boolean {
* @returns `true` if running on Windows, otherwise `false`.
*/
export function isWindows(): boolean {
return /win/i.test(navigator.platform);
return navigator.userAgentData?.platform === 'Windows';
}
/**
* Tests if we are running on Linux.
* @returns `true` if running on Linux, otherwise `false`.
*/
export function isLinux(): boolean {
return navigator.userAgentData?.platform === 'Linux';
}
/**
* Tests if we are running on iOS.
* @returns `true` if running on iOS, otherwise `false`.
*/
export function isIOS(): boolean {
return navigator.userAgentData?.platform === 'iOS';
}