From 172f57ffea929a663dc26b5facdf3bd035251004 Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Wed, 22 Mar 2023 11:51:28 +0700 Subject: [PATCH] Fix #636 - Add new browser: HeyTap | Fix #248 - Add 'Mobile' prefix for mobile version of Chrome, Firefox, Safari --- readme.md | 6 +++--- src/ua-parser.js | 35 ++++++++++++++++++----------------- test/browser-test.json | 30 ++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/readme.md b/readme.md index 90e7273..7ad1872 100644 --- a/readme.md +++ b/readme.md @@ -102,16 +102,16 @@ The methods are self explanatory, here's a small overview on all the available m # Possible 'browser.name': 2345Explorer, 360 Browser, Amaya, Android Browser, Arora, Avant, Avast, AVG, BIDUBrowser, Baidu, Basilisk, Blazer, Bolt, Brave, Bowser, Camino, Chimera, -Chrome [Mobile/Headless/WebView], Chromium, Cobalt, Comodo Dragon, Dillo, +[Mobile] Chrome [Headless/WebView], Chromium, Cobalt, Comodo Dragon, Dillo, Dolphin, Doris, DuckDuckGo, Edge, Electron, Epiphany, Facebook, Falkon, Fennec, -Firebird, Firefox [Mobile/Focus/Reality], Flock, Flow, GSA, GoBrowser, +Firebird, [Mobile] Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, HeyTap, Huawei Browser, ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceweasel, Instagram, Iridium, Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar, Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, Lynx, MIUI Browser, Maemo Browser, Maemo, Maxthon, MetaSr Midori, Minimo, Mosaic, Mozilla, NetFront, NetSurf, Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, OmniWeb, Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, PhantomJS, Phoenix, Polaris, -Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, Safari [Mobile], +Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari, Sailfish Browser, Samsung Browser, SeaMonkey, Silk, Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tesla, Tizen Browser, UCBrowser, UP.Browser, Viera, Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, Whale Browser, ... diff --git a/src/ua-parser.js b/src/ua-parser.js index 6035a1f..931ef32 100755 --- a/src/ua-parser.js +++ b/src/ua-parser.js @@ -75,8 +75,8 @@ XIAOMI = 'Xiaomi', ZEBRA = 'Zebra', ZTE = 'ZTE', - SUFFIX_BROWSER = 'Browser', - SUFFIX_MOBILE = 'Mobile', + PREFIX_MOBILE = 'Mobile ', + SUFFIX_BROWSER = ' Browser', CHROME = 'Chrome', EDGE = 'Edge', FIREFOX = 'Firefox', @@ -280,8 +280,9 @@ browser : [[ + // Most common regardless engine /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS - ], [VERSION, [NAME, 'Chrome']], [ + ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [ /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge ], [VERSION, [NAME, 'Edge']], [ @@ -305,11 +306,12 @@ // 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(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i, - // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ + // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo + /(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi /(weibo)__([\d\.]+)/i // Weibo ], [NAME, VERSION], [ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser - ], [VERSION, [NAME, 'UC'+SUFFIX_BROWSER]], [ + ], [VERSION, [NAME, 'UCBrowser']], [ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser /\bqbcore\/([\w\.]+).+microm/i ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [ @@ -322,7 +324,7 @@ /ya(?:search)?browser\/([\w\.]+)/i // Yandex ], [VERSION, [NAME, 'Yandex']], [ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser - ], [[NAME, /(.+)/, '$1 Secure '+SUFFIX_BROWSER], VERSION], [ + ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [ /\bfocus\/([\w\.]+)/i // Firefox Focus ], [VERSION, [NAME, FIREFOX+' Focus']], [ /\bopt\/([\w\.]+)/i // Opera Touch @@ -334,13 +336,13 @@ /coast\/([\w\.]+)/i // Opera Coast ], [VERSION, [NAME, OPERA+' Coast']], [ /miuibrowser\/([\w\.]+)/i // MIUI Browser - ], [VERSION, [NAME, 'MIUI '+SUFFIX_BROWSER]], [ + ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [ /fxios\/([\w\.-]+)/i // Firefox for iOS - ], [VERSION, [NAME, 'Firefox '+SUFFIX_MOBILE]], [ + ], [VERSION, [NAME, PREFIX_MOBILE + 'Firefox']], [ /\bqihu|(qi?ho?o?|360)browser/i // 360 - ], [[NAME, '360 '+SUFFIX_BROWSER]], [ + ], [[NAME, '360' + SUFFIX_BROWSER]], [ /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i - ], [[NAME, /(.+)/, '$1 '+SUFFIX_BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser + ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon ], [[NAME, /_/g, ' '], VERSION], [ /(electron)\/([\w\.]+) safari/i, // Electron-based App @@ -371,19 +373,18 @@ ], [[NAME, CHROME+' WebView'], VERSION], [ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser - ], [VERSION, [NAME, 'Android '+SUFFIX_BROWSER]], [ + ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [ - /chrome\/([\w\.]+) mobile/i, // Chrome Mobile - /(?:(?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS - ], [VERSION, [NAME, 'Chrome '+SUFFIX_MOBILE]], [ + /chrome\/([\w\.]+) mobile/i // Chrome Mobile + ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia ], [NAME, VERSION], [ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile - ], [VERSION, [NAME, 'Safari '+SUFFIX_MOBILE]], [ + ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [ /iphone .*mobile(?:\/\w+ | ?)safari/i - ], [[NAME, 'Safari '+SUFFIX_MOBILE]], [ + ], [[NAME, PREFIX_MOBILE + 'Safari']], [ /version\/([\w\.\,]+) .*(safari)/i // Safari ], [VERSION, NAME], [ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 @@ -394,7 +395,7 @@ // Gecko based /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile - ], [[NAME, 'Firefox '+SUFFIX_MOBILE], VERSION], [ + ], [[NAME, PREFIX_MOBILE + 'Firefox'], VERSION], [ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape ], [[NAME, 'Netscape'], VERSION], [ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality diff --git a/test/browser-test.json b/test/browser-test.json index 63a501a..0b0345f 100644 --- a/test/browser-test.json +++ b/test/browser-test.json @@ -234,7 +234,7 @@ "ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3", "expect" : { - "name" : "Chrome", + "name" : "Mobile Chrome", "version" : "19.0.1084.60", "major" : "19" } @@ -254,7 +254,7 @@ "ua" : "Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7", "expect" : { - "name" : "Chrome", + "name" : "Mobile Chrome", "version" : "16.0.912.75", "major" : "16" } @@ -508,6 +508,16 @@ "major" : "1" } }, + { + "desc" : "HeyTap", + "ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.61 Safari/537.36 HeyTapBrowser/40.8.10.1", + "expect" : + { + "name" : "HeyTap", + "version" : "40.8.10.1", + "major" : "40" + } + }, { "desc" : "HuaweiBrowser", "ua" : "Mozilla/5.0 (Linux; Android 6.0.1; LYA-AL00ï¼›HMSCore/4.0.0 GMS/10.4 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.102 Mobile Safari/537.36", @@ -753,7 +763,7 @@ "ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7", "expect" : { - "name" : "Safari Mobile", + "name" : "Mobile Safari", "version" : "4.0.5", "major" : "4" } @@ -763,7 +773,7 @@ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Safari/604.1", "expect" : { - "name" : "Safari Mobile", + "name" : "Mobile Safari", "version" : "undefined", "major" : "undefined" } @@ -1413,7 +1423,7 @@ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) FxiOS/1.1 Mobile/13B143 Safari/601.1.46", "expect" : { - "name" : "Firefox Mobile", + "name" : "Mobile Firefox", "version" : "1.1", "major" : "1" } @@ -1423,7 +1433,7 @@ "ua" : "Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4", "expect" : { - "name" : "Firefox Mobile", + "name" : "Mobile Firefox", "version" : "1.0", "major" : "1" } @@ -1617,7 +1627,7 @@ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 15_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6,2 Mobile/15E148 Safari/604.1", "expect" : { - "name" : "Safari Mobile", + "name" : "Mobile Safari", "version" : "15.6,2", "major" : "15" } @@ -1708,7 +1718,7 @@ "ua" : "Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36", "expect" : { - "name" : "Chrome Mobile", + "name" : "Mobile Chrome", "version" : "58.0.3029.83", "major" : "58" } @@ -1718,7 +1728,7 @@ "ua" : "Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W) AppleWebKit/537.36 (KHTML, like Gecko) FxiOS/7.5b3349 Mobile/14F89 Safari/603.2.4", "expect" : { - "name" : "Firefox Mobile", + "name" : "Mobile Firefox", "version" : "7.5b3349", "major" : "7" } @@ -1728,7 +1738,7 @@ "ua" : "Mozilla/5.0 (Android 5.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0", "expect" : { - "name" : "Firefox Mobile", + "name" : "Mobile Firefox", "version" : "41.0", "major" : "41" }