From a187821e4f576c0569e7ca9a71ebb525734dda00 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Fri, 23 Dec 2022 16:36:49 +0100 Subject: Add OS checks for Android and ChromeOS --- core/util/browser.js | 9 +++++++++ tests/test.browser.js | 44 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/core/util/browser.js b/core/util/browser.js index 7d2bfd8..8195438 100644 --- a/core/util/browser.js +++ b/core/util/browser.js @@ -93,6 +93,15 @@ export function isIOS() { !!(/ipod/i).exec(navigator.platform)); } +export function isAndroid() { + return !!(/android/i).exec(navigator.platform); +} + +export function isChromeOS() { + /* ChromeOS sets navigator.platform to Linux :/ */ + return !!navigator.userAgent.match(' CrOS '); +} + /* Browser */ export function isSafari() { diff --git a/tests/test.browser.js b/tests/test.browser.js index 4fdc084..4b6c127 100644 --- a/tests/test.browser.js +++ b/tests/test.browser.js @@ -1,7 +1,7 @@ /* eslint-disable no-console */ const expect = chai.expect; -import { isMac, isWindows, isIOS, +import { isMac, isWindows, isIOS, isAndroid, isChromeOS, isSafari, isFirefox, isChrome, isChromium, isOpera, isEdge, isGecko, isWebKit, isBlink } from '../core/util/browser.js'; @@ -26,11 +26,14 @@ describe('OS detection', function () { "MacPPC", ]; + navigator.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6 Safari/605.1.15"; platforms.forEach((platform) => { navigator.platform = platform; expect(isMac()).to.be.true; expect(isWindows()).to.be.false; expect(isIOS()).to.be.false; + expect(isAndroid()).to.be.false; + expect(isChromeOS()).to.be.false; }); }); @@ -40,11 +43,14 @@ describe('OS detection', function () { "Win64", ]; + navigator.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"; platforms.forEach((platform) => { navigator.platform = platform; expect(isMac()).to.be.false; expect(isWindows()).to.be.true; expect(isIOS()).to.be.false; + expect(isAndroid()).to.be.false; + expect(isChromeOS()).to.be.false; }); }); @@ -55,11 +61,47 @@ describe('OS detection', function () { "iPad", ]; + navigator.userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1"; platforms.forEach((platform) => { navigator.platform = platform; expect(isMac()).to.be.false; expect(isWindows()).to.be.false; expect(isIOS()).to.be.true; + expect(isAndroid()).to.be.false; + expect(isChromeOS()).to.be.false; + }); + }); + + it('should handle Android', function () { + const platforms = [ + "Android", + ]; + + navigator.userAgent = "Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0"; + platforms.forEach((platform) => { + navigator.platform = platform; + expect(isMac()).to.be.false; + expect(isWindows()).to.be.false; + expect(isIOS()).to.be.false; + expect(isAndroid()).to.be.true; + expect(isChromeOS()).to.be.false; + }); + }); + + it('should handle ChromeOS', function () { + let userAgents = [ + "Mozilla/5.0 (X11; CrOS x86_64 15183.59.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.75 Safari/537.36", + "Mozilla/5.0 (X11; CrOS aarch64 15183.59.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.75 Safari/537.36", + ]; + + navigator.platform = "Linux x86_64"; + userAgents.forEach((ua) => { + navigator.userAgent = ua; + expect(isMac()).to.be.false; + expect(isWindows()).to.be.false; + expect(isIOS()).to.be.false; + expect(isAndroid()).to.be.false; + expect(isChromeOS()).to.be.true; }); }); }); -- cgit v1.2.1