From fcb5a04e882e3920fb7771c5d3591a4984910f94 Mon Sep 17 00:00:00 2001 From: Ashut0sh-mishra Date: Tue, 12 May 2026 17:12:50 +0530 Subject: [PATCH 1/3] fix(core): detect Oculus Browser instead of falling back to Chrome Oculus Browser (Meta Quest) is Chromium-based, so its user agent includes OculusBrowser alongside Chrome (and on newer headsets SamsungBrowser). The current detection order returned Chrome (or Samsung Internet) for any Quest device. Add an OculusBrowser check before the SamsungBrowser/Chrome branches and a corresponding version regex, so events from Quest headsets are reported with Oculus Browser as the browser name. Added test cases covering both the older Quest 2 UA (with SamsungBrowser segment) and a Quest 3-style UA. Closes #3574 Co-authored-by: nik464 --- .../__tests__/utils/user-agent-utils.test.ts | 19 +++++++++++++++++++ packages/core/src/utils/user-agent-utils.ts | 10 ++++++++++ 2 files changed, 29 insertions(+) diff --git a/packages/browser/src/__tests__/utils/user-agent-utils.test.ts b/packages/browser/src/__tests__/utils/user-agent-utils.test.ts index 6b37f60497..2d4eb67850 100644 --- a/packages/browser/src/__tests__/utils/user-agent-utils.test.ts +++ b/packages/browser/src/__tests__/utils/user-agent-utils.test.ts @@ -205,6 +205,25 @@ describe('user-agent-utils', () => { expectedVersion: 28.0, expectedBrowser: 'Chrome', }, + { + // see https://github.com/PostHog/posthog-js/issues/3574 + // Oculus Browser is Chromium-based, so its UA includes both + // `OculusBrowser` and `Chrome` (and on newer headsets also `SamsungBrowser`). + name: 'Oculus Browser on Quest 2', + userAgent: + 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/27.0.0.4.7.391926553 SamsungBrowser/4.0 Chrome/100.0.4896.58 VR Safari/537.36', + vendor: '', + expectedVersion: 27.0, + expectedBrowser: 'Oculus Browser', + }, + { + name: 'Oculus Browser on Quest 3 (no SamsungBrowser segment)', + userAgent: + 'Mozilla/5.0 (Linux; Android 12; Quest 3) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/30.0.0.5.10 Chrome/119.0.6045.193 VR Safari/537.36', + vendor: '', + expectedVersion: 30.0, + expectedBrowser: 'Oculus Browser', + }, ] test.each(browserTestcases)('browser version %s', ({ userAgent, vendor, expectedVersion }) => { diff --git a/packages/core/src/utils/user-agent-utils.ts b/packages/core/src/utils/user-agent-utils.ts index 4c96530d4a..b9da2ee0a4 100644 --- a/packages/core/src/utils/user-agent-utils.ts +++ b/packages/core/src/utils/user-agent-utils.ts @@ -49,6 +49,8 @@ const GENERIC = 'Generic' const GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase() const GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase() const KONQUEROR = 'Konqueror' +const OCULUS = 'Oculus' +const OCULUS_BROWSER = OCULUS + ' Browser' const BROWSER_VERSION_REGEX_SUFFIX = '(\\d+(\\.\\d+)?)' const DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX) @@ -100,6 +102,13 @@ export const detectBrowser = function (user_agent: string, vendor: string | unde } else if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) { return INTERNET_EXPLORER_MOBILE } + // Oculus Browser (Meta Quest) is Chromium-based, so its UA includes + // `OculusBrowser` alongside `Chrome` (and sometimes `SamsungBrowser`). + // We must check for it before those, otherwise it would be misdetected. + // See https://github.com/PostHog/posthog-js/issues/3574 + else if (includes(user_agent, 'OculusBrowser')) { + return OCULUS_BROWSER + } // https://developer.samsung.com/internet/user-agent-string-format else if (includes(user_agent, SAMSUNG_BROWSER)) { return SAMSUNG_INTERNET @@ -150,6 +159,7 @@ const versionRegexes: Record = { [BLACKBERRY]: [new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX), DEFAULT_BROWSER_VERSION_REGEX], [ANDROID_MOBILE]: [new RegExp('android\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')], [SAMSUNG_INTERNET]: [new RegExp(SAMSUNG_BROWSER + '\\/' + BROWSER_VERSION_REGEX_SUFFIX)], + [OCULUS_BROWSER]: [new RegExp('OculusBrowser\\/' + BROWSER_VERSION_REGEX_SUFFIX)], [INTERNET_EXPLORER]: [new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)], Mozilla: [new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)], } From 5ce4149273b39d3e5a9dbb0fd40c9b17adf15e35 Mon Sep 17 00:00:00 2001 From: Ashut0sh-mishra Date: Tue, 12 May 2026 19:43:57 +0530 Subject: [PATCH 2/3] =?UTF-8?q?=EF=BB=BFrefactor(core):=20inline=20OCULUS?= =?UTF-8?q?=20constant=20into=20OCULUS=5FBROWSER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses greptile review on #3581: `OCULUS` is only used once in the file, so the intermediate constant adds no minification benefit and violates the file's own simplicity convention (rule #4). Inline it. Co-authored-by: nik464 --- packages/core/src/utils/user-agent-utils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/src/utils/user-agent-utils.ts b/packages/core/src/utils/user-agent-utils.ts index b9da2ee0a4..28ef3ba561 100644 --- a/packages/core/src/utils/user-agent-utils.ts +++ b/packages/core/src/utils/user-agent-utils.ts @@ -49,8 +49,7 @@ const GENERIC = 'Generic' const GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase() const GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase() const KONQUEROR = 'Konqueror' -const OCULUS = 'Oculus' -const OCULUS_BROWSER = OCULUS + ' Browser' +const OCULUS_BROWSER = 'Oculus Browser' const BROWSER_VERSION_REGEX_SUFFIX = '(\\d+(\\.\\d+)?)' const DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX) From 67bf636aaa03d346e50ceb29b9eba6f48593efb4 Mon Sep 17 00:00:00 2001 From: Ashut0sh-mishra Date: Wed, 20 May 2026 10:07:05 +0530 Subject: [PATCH 3/3] chore: add changeset for Oculus Browser detection fix Co-authored-by: Pranjal Raghav --- .changeset/oculus-browser-detection.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/oculus-browser-detection.md diff --git a/.changeset/oculus-browser-detection.md b/.changeset/oculus-browser-detection.md new file mode 100644 index 0000000000..1b67b9dcbd --- /dev/null +++ b/.changeset/oculus-browser-detection.md @@ -0,0 +1,5 @@ +--- +"@posthog/core": patch +--- + +Detect Oculus Browser (Meta Quest headsets) correctly instead of falling back to Chrome