From 5ea9f0ec16fcbe53f59e5d3a95d237e179a0539c Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Fri, 24 Feb 2023 14:25:30 +0700 Subject: [PATCH] Fix #387 #554 - Detect iPadOS 13 https://stackoverflow.com/questions/9038625/detect-if-device-is-ios --- src/ua-parser.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/ua-parser.js b/src/ua-parser.js index 71a5c920..a3a3ad41 100755 --- a/src/ua-parser.js +++ b/src/ua-parser.js @@ -58,7 +58,9 @@ SONY = 'Sony', XIAOMI = 'Xiaomi', ZEBRA = 'Zebra', - FACEBOOK = 'Facebook'; + FACEBOOK = 'Facebook', + CHROMIUM_OS = 'Chromium OS', + MAC_OS = 'Mac OS'; /////////// // Helper @@ -721,7 +723,7 @@ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ /(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS - ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [ + ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [ // Mobile OSes /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS @@ -745,7 +747,7 @@ /crkey\/([\d\.]+)/i // Google Chromecast ], [VERSION, [NAME, CHROME+'cast']], [ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS - ], [[NAME, 'Chromium OS'], VERSION],[ + ], [[NAME, CHROMIUM_OS], VERSION],[ // Smart TVs /panasonic;(viera)/i, // Panasonic Viera @@ -887,6 +889,11 @@ if (!_device[TYPE] && _uach && _uach.mobile) { _device[TYPE] = MOBILE; } + // iPadOS-specific detection: identified as Mac, but has some iOS-only properties + if (_device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) { + _device[MODEL] = 'iPad'; + _device[TYPE] = TABLET; + } return _device; }; this.getEngine = function () { @@ -899,8 +906,8 @@ rgxMapper.call(_os, _ua, _rgxmap.os); if (!_os[NAME] && _uach && _uach.platform != 'Unknown') { _os[NAME] = _uach.platform - .replace(/chrome os/i, 'Chromium OS') - .replace(/macos/i, 'Mac OS'); // backward compatibility + .replace(/chrome os/i, CHROMIUM_OS) + .replace(/macos/i, MAC_OS); // backward compatibility } return _os; };