From ec4fc20ce42343135da8feaab14d1cb9ee2b87ab Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:18:46 +0900 Subject: [PATCH] =?UTF-8?q?enhance:=20getHighEntropyValues=E3=81=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=8B=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AE=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=83=90=E3=83=83=E3=82=AF=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/utility/get-user-environment.ts | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/packages/frontend/src/utility/get-user-environment.ts b/packages/frontend/src/utility/get-user-environment.ts index 2b302b40b4..a8d9084f5c 100644 --- a/packages/frontend/src/utility/get-user-environment.ts +++ b/packages/frontend/src/utility/get-user-environment.ts @@ -2,6 +2,11 @@ * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ +import type * as Bowser_TR from 'bowser'; + +type Bowser_TypeReferenceOnly = typeof Bowser_TR; + +let Bowser: Bowser_TypeReferenceOnly | null = null; export type UserEnvironment = { os: string; @@ -13,42 +18,52 @@ export type UserEnvironment = { export async function getUserEnvironment(): Promise { if ('userAgentData' in navigator && navigator.userAgentData != null) { - const uaData: any = await navigator.userAgentData.getHighEntropyValues([ - 'fullVersionList', - 'platformVersion', - ]); + try { + const uaData: any = await navigator.userAgentData.getHighEntropyValues([ + 'fullVersionList', + 'platformVersion', + ]); - let osVersion = 'v' + uaData.platformVersion; + let osVersion = 'v' + uaData.platformVersion; - if (uaData.platform === 'Windows' && uaData.platformVersion != null) { - // https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11 - const majorPlatformVersion = parseInt(uaData.platformVersion.split('.')[0]); - if (majorPlatformVersion >= 13) { - osVersion = '11 or later'; - } else if (majorPlatformVersion > 0) { - osVersion = '10'; - } else { - osVersion = '8.1 or earlier'; + if (uaData.platform === 'Windows' && uaData.platformVersion != null) { + // https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11 + const majorPlatformVersion = parseInt(uaData.platformVersion.split('.')[0]); + if (majorPlatformVersion >= 13) { + osVersion = '11 or later'; + } else if (majorPlatformVersion > 0) { + osVersion = '10'; + } else { + osVersion = '8.1 or earlier'; + } } - } - const browserData = uaData.fullVersionList.find((item) => !/^\s*not.+a.+brand\s*$/i.test(item.brand)); - return { - os: `${uaData.platform} ${osVersion}`, - browser: browserData ? `${browserData.brand} v${browserData.version}` : 'Unknown', - screenWidth: window.innerWidth, - screenHeight: window.innerHeight, - viaGetHighEntropyValues: true, - }; + const browserData = uaData.fullVersionList.find((item) => !/^\s*not.+a.+brand\s*$/i.test(item.brand)); + return { + os: `${uaData.platform} ${osVersion}`, + browser: browserData ? `${browserData.brand} v${browserData.version}` : 'Unknown', + screenWidth: window.innerWidth, + screenHeight: window.innerHeight, + viaGetHighEntropyValues: true, + }; + } catch { + return getViaUa(); + } } else { - const Bowser = (await import('bowser')).default; - const parsed = Bowser.parse(navigator.userAgent); - return { - os: `${parsed.os.name ?? 'Unknown'} ${parsed.os.version ?? ''} ${parsed.os.versionName ? `(${parsed.os.versionName})` : ''}`.trim(), - browser: `${parsed.browser.name ?? 'Unknown'} ${parsed.browser.version ?? ''}`.trim(), - screenWidth: window.innerWidth, - screenHeight: window.innerHeight, - viaGetHighEntropyValues: false, - }; + return getViaUa(); } } + +async function getViaUa(): Promise { + if (Bowser == null) { + Bowser = (await import('bowser')).default; + } + const parsed = Bowser.parse(navigator.userAgent); + return { + os: `${parsed.os.name ?? 'Unknown'} ${parsed.os.version ?? ''} ${parsed.os.versionName ? `(${parsed.os.versionName})` : ''}`.trim(), + browser: `${parsed.browser.name ?? 'Unknown'} ${parsed.browser.version ?? ''}`.trim(), + screenWidth: window.innerWidth, + screenHeight: window.innerHeight, + viaGetHighEntropyValues: false, + }; +}