From 6e98b2e975dfb119d2bff3e183fbc689fd438c7a Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Mon, 13 Mar 2023 22:03:57 +0700 Subject: [PATCH] Update to latest version 0.7.34 + display the getResult() data in user-agent playground --- index.html | 7 ++- js/script.js | 10 ++-- js/ua-parser.js | 147 ++++++++++++++++++++++++------------------------ 3 files changed, 84 insertions(+), 80 deletions(-) diff --git a/index.html b/index.html index 168306c..aa3496b 100644 --- a/index.html +++ b/index.html @@ -81,9 +81,12 @@ {UAParser.js} abstracts away the hassle of User-Agent detection by turning them into a set of simple & meaningful data. As an example, this is what we get from your browser's User-Agent information:

+
+

+ {UAParser.js} will transforms it into a well-structured data:

+
+
-

- {UAParser.js} reads this as:

diff --git a/js/script.js b/js/script.js index 52939eb..1b6e3bd 100644 --- a/js/script.js +++ b/js/script.js @@ -16,10 +16,12 @@ $(document) var updateDemo = function (ua) { var result = UAParser(ua); + if(!result) return; $('#ua-txt').transition('flip vertical', function () { $(this).text(result.ua); $(this).transition('flip vertical'); }); + $('#ua-result').text(JSON.stringify(result, null, " ")); $('#demo-result').transition('fly up', function () { if (result.browser.name) { var version = result.browser.version!==undefined?result.browser.version:'-'; @@ -84,7 +86,7 @@ $(document) $('#device-txt').text('-'); $('#device-img').attr('src', 'images/companies/default.png'); } - if (result.gpu.vendor) { +/* if (result.gpu.vendor) { var vendor = result.gpu.vendor!=undefined?result.gpu.vendor:'-'; var model = result.gpu.model!==undefined?result.gpu.model:'-'; $('#gpu-txt').html('' + vendor + '' + model + ''); @@ -93,7 +95,7 @@ $(document) }); } else { $('#gpu-txt').text('-'); - } + }*/ $(this).transition('fly up', function () { $(this).transition('pulse'); }); @@ -124,9 +126,9 @@ $(document) return false; } }); - if (!uaparser.getGPU().vendor) { +// if (!uaparser.getGPU().vendor) { $('#gpu-divider,#gpu-segment').hide(); - } +// } $('.ui.rating').rating(); $('#showcase img').popup({ diff --git a/js/ua-parser.js b/js/ua-parser.js index 95725a0..7c007d0 100755 --- a/js/ua-parser.js +++ b/js/ua-parser.js @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////////// -/* UAParser.js v0.7.33-gpu-experimental +/* UAParser.js v0.7.34 Copyright © 2012-2021 Faisal Salman MIT License *//* Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. @@ -17,7 +17,7 @@ ///////////// - var LIBVERSION = '0.7.33-gpu-experimental', + var LIBVERSION = '0.7.34', EMPTY = '', UNKNOWN = '?', FUNC_TYPE = 'function', @@ -56,9 +56,12 @@ SAMSUNG = 'Samsung', SHARP = 'Sharp', SONY = 'Sony', + VIERA = 'Viera', XIAOMI = 'Xiaomi', ZEBRA = 'Zebra', - FACEBOOK = 'Facebook'; + FACEBOOK = 'Facebook', + CHROMIUM_OS = 'Chromium OS', + MAC_OS = 'Mac OS'; /////////// // Helper @@ -116,6 +119,7 @@ // try matching uastring with regexes while (j < regex.length && !matches) { + if (!regex[j]) { break; } matches = regex[j++].exec(ua); if (!!matches) { @@ -175,14 +179,8 @@ // String map ////////////// - var gpuVendorMap = { - 'AMD' : 'Radeon', - 'ARM' : 'Mali', - 'NVIDIA' : 'GeForce', - 'Qualcomm' : 'Adreno' - }, - // Safari < 3.0 - oldSafariMap = { + // Safari < 3.0 + var oldSafariMap = { '1.0' : '/8', '1.2' : '/1', '1.3' : '/3', @@ -238,7 +236,7 @@ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon - /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i, + /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ /(weibo)__([\d\.]+)/i // Weibo ], [NAME, VERSION], [ @@ -289,6 +287,8 @@ // WebView /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android ], [[NAME, FACEBOOK], VERSION], [ + /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App + /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp /safari (line)\/([\w\.]+)/i, // Line App for iOS /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram @@ -335,7 +335,8 @@ // Other /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i, // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser - /(links) \(([\w\.]+)/i // Links + /(links) \(([\w\.]+)/i, // Links + /panasonic;(viera)/i // Panasonic Viera ], [NAME, VERSION], [ /(cobalt)\/([\w\.]+)/i // Cobalt @@ -378,13 +379,12 @@ ////////////////////////// // MOBILES & TABLETS - // Ordered by popularity ///////////////////////// // Samsung /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [ - /\b((?:s[cgp]h|gt|sm)-\w+|galaxy nexus)/i, + /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i, /samsung[- ]([-\w]+)/i, /sec-(sgh\w+)/i ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [ @@ -399,6 +399,10 @@ /(macintosh);/i ], [MODEL, [VENDOR, APPLE]], [ + // Sharp + /\b(sh-?[altvz]?\d\d[a-ekm]?)/i + ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [ + // Huawei /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [ @@ -502,7 +506,7 @@ // ZTE /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i, - /(alcatel|geeksphone|nexian|panasonic|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony + /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [ // Acer @@ -514,10 +518,6 @@ /\bmz-([-\w]{2,})/i ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [ - // Sharp - /\b(sh-?[altvz]?\d\d[a-ekm]?)/i - ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [ - // MIXED /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i, // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron @@ -529,6 +529,7 @@ /(oppo) ?([\w ]+) bui/i // OPPO ], [VENDOR, MODEL, [TYPE, MOBILE]], [ + /(kobo)\s(ereader|touch)/i, // Kobo /(archos) (gamepad2?)/i, // Archos /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad /(kindle)\/([\w\.]+)/i, // Kindle @@ -598,20 +599,6 @@ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [ - /////////////////// - // CONSOLES - /////////////////// - - /(ouya)/i, // Ouya - /(nintendo) ([wids3utch]+)/i // Nintendo - ], [VENDOR, MODEL, [TYPE, CONSOLE]], [ - /droid.+; (shield) bui/i // Nvidia - ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [ - /(playstation [345portablevi]+)/i // Playstation - ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [ - /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox - ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [ - /////////////////// // SMARTTVS /////////////////// @@ -635,23 +622,41 @@ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [ /(mitv-\w{5}) bui/i // Xiaomi ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [ + /Hbbtv.*(technisat) (.*);/i // TechniSAT + ], [VENDOR, MODEL, [TYPE, SMARTTV]], [ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku - /hbbtv\/\d+\.\d+\.\d+ +\([\w ]*; *(\w[^;]*);([^;]*)/i // HbbTV devices + /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors ], [[TYPE, SMARTTV]], [ + /////////////////// + // CONSOLES + /////////////////// + + /(ouya)/i, // Ouya + /(nintendo) ([wids3utch]+)/i // Nintendo + ], [VENDOR, MODEL, [TYPE, CONSOLE]], [ + /droid.+; (shield) bui/i // Nvidia + ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [ + /(playstation [345portablevi]+)/i // Playstation + ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [ + /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox + ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [ + /////////////////// // WEARABLES /////////////////// /((pebble))app/i // Pebble ], [VENDOR, MODEL, [TYPE, WEARABLE]], [ + /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch + ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [ /droid.+; (glass) \d/i // Google Glass ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [ /droid.+; (wt63?0{2,3})\)/i ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [ - /(quest( 2)?)/i // Oculus Quest + /(quest( 2| pro)?)/i // Oculus Quest ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [ /////////////////// @@ -696,13 +701,6 @@ ], [VERSION, NAME] ], - gpu : [[ - - /(intel|nvidia|sis|amd|apple|powervr)\W? (.+)/i, // Intel/NVIDIA/SiS/AMD/Apple/PowerVR - /(((?:radeon|adreno|geforce|mali).+))/i, // AMD Radeon/NVIDIA GeForce/Qualcomm Adreno/ARM Mali - ], [[VENDOR, strMapper, gpuVendorMap], [MODEL, / ?(\(.+?\)| direct3d.+| opengl.+|\/.+$| gpu$)/gi, EMPTY]] - ], - os : [[ // Windows @@ -721,7 +719,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 @@ -740,12 +738,19 @@ /web0s;.+rt(tv)/i, /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS ], [VERSION, [NAME, 'webOS']], [ + /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS + ], [VERSION, [NAME, 'watchOS']], [ // Google Chromecast /crkey\/([\d\.]+)/i // Google Chromecast ], [VERSION, [NAME, CHROME+'cast']], [ - /(cros) [\w]+ ([\w\.]+\w)/i // Chromium OS - ], [[NAME, 'Chromium OS'], VERSION],[ + /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS + ], [[NAME, CHROMIUM_OS], VERSION],[ + + // Smart TVs + /panasonic;(viera)/i, // Panasonic Viera + /(netrange)mmh/i, // Netrange + /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV // Console /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation @@ -787,16 +792,21 @@ return new UAParser(ua, extensions).getResult(); } - var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY); + var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined; + var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY); + var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined; var _rgxmap = extensions ? extend(regexes, extensions) : regexes; - var _renderer; this.getBrowser = function () { var _browser = {}; _browser[NAME] = undefined; _browser[VERSION] = undefined; rgxMapper.call(_browser, _ua, _rgxmap.browser); - _browser.major = majorize(_browser.version); + _browser[MAJOR] = majorize(_browser[VERSION]); + // Brave-specific detection + if (_navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) { + _browser[NAME] = 'Brave'; + } return _browser; }; this.getCPU = function () { @@ -811,6 +821,14 @@ _device[MODEL] = undefined; _device[TYPE] = undefined; rgxMapper.call(_device, _ua, _rgxmap.device); + 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 () { @@ -820,20 +838,16 @@ rgxMapper.call(_engine, _ua, _rgxmap.engine); return _engine; }; - this.getGPU = function () { - var _gpu = {}; - _gpu[VENDOR] = undefined; - _gpu[MODEL] = undefined; - if (_renderer) { - rgxMapper.call(_gpu, _renderer, _rgxmap.gpu); - } - return _gpu; - }; this.getOS = function () { var _os = {}; _os[NAME] = undefined; _os[VERSION] = undefined; 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 + } return _os; }; this.getResult = function () { @@ -843,17 +857,9 @@ engine : this.getEngine(), os : this.getOS(), device : this.getDevice(), - cpu : this.getCPU(), - gpu : this.getGPU() + cpu : this.getCPU() }; }; - this.getRenderer = function () { - return _renderer; - }; - this.setRenderer = function (renderer) { - _renderer = renderer; - return this; - }; this.getUA = function () { return _ua; }; @@ -862,12 +868,6 @@ return this; }; this.setUA(_ua); - // browser only - if (typeof window !== UNDEF_TYPE && window.document) { - var canvas = document.createElement('canvas'); - var gl = canvas.getContext ? canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl') : undefined; - this.setRenderer(gl && gl.getParameter && gl.getExtension && gl.getExtension('WEBGL_debug_renderer_info') ? gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) : undefined); - } return this; }; @@ -876,7 +876,6 @@ UAParser.CPU = enumerize([ARCHITECTURE]); UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]); UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]); - UAParser.GPU = enumerize([VENDOR, MODEL]); /////////// // Export