From 5349bb52ed30f3048800ca92d5be6f264cf9f348 Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Tue, 7 Oct 2025 14:51:46 +0700 Subject: [PATCH] Improve device detection: BlackBerry, Huawei, Xiaomi --- src/main/ua-parser.js | 12 +++++----- test/data/ua/device/blackberry.json | 22 ++++++++++++++++-- test/data/ua/device/huawei.json | 36 +++++++++++++++++++++++++++++ test/data/ua/device/xiaomi.json | 36 +++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 8 deletions(-) diff --git a/src/main/ua-parser.js b/src/main/ua-parser.js index afff9b8..27e79ce 100755 --- a/src/main/ua-parser.js +++ b/src/main/ua-parser.js @@ -588,13 +588,13 @@ // Huawei /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [ - /(?:huawei)([-\w ]+)[;\)]/i, - /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i + /(?:huawei) ?([-\w ]+)[;\)]/i, + /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [ // Xiaomi /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i, - /\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets + /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO @@ -602,7 +602,7 @@ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models - /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i, // Xiaomi Mi + /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i, // Xiaomi Mi / ([\w ]+) miui\/v?\d/i ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [ @@ -689,7 +689,7 @@ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook ], [MODEL, VENDOR, [TYPE, TABLET]], [ /\b((?:bb[a-f]|st[hv])100-\d)/i, - /\(bb10; (\w+)/i // BlackBerry 10 + /(?:blackberry|\(bb10;) (\w+)/i ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [ // Asus @@ -913,7 +913,7 @@ ], [MODEL, [TYPE, SMARTTV]], [ /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i ], [[TYPE, SMARTTV]], [ - /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i + /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet ], [[TYPE, TABLET]], [ diff --git a/test/data/ua/device/blackberry.json b/test/data/ua/device/blackberry.json index f809d55..396a139 100644 --- a/test/data/ua/device/blackberry.json +++ b/test/data/ua/device/blackberry.json @@ -1,7 +1,25 @@ [ + { + "desc": "BlackBerry 9650", + "ua": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9650; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.524 Mobile Safari/534.8+", + "expect": { + "vendor": "BlackBerry", + "model": "9650", + "type": "mobile" + } + }, + { + "desc": "BlackBerry 9780", + "ua": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9780; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+", + "expect": { + "vendor": "BlackBerry", + "model": "9780", + "type": "mobile" + } + }, { "desc": "BlackBerry Priv", - "ua": "User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; STV100-1 Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36", + "ua": "Mozilla/5.0 (Linux; Android 5.1.1; STV100-1 Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36", "expect": { "vendor": "BlackBerry", "model": "STV100-1", @@ -28,7 +46,7 @@ }, { "desc": "BlackBerry Key2 LE", - "ua": "User-Agent: Mozilla/5.0 (Linux; Android 8.1.0; BBE100-1 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497 Mobile Safari/537.36", + "ua": "Mozilla/5.0 (Linux; Android 8.1.0; BBE100-1 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497 Mobile Safari/537.36", "expect": { "vendor": "BlackBerry", "model": "BBE100-1", diff --git a/test/data/ua/device/huawei.json b/test/data/ua/device/huawei.json index 670879e..14af421 100644 --- a/test/data/ua/device/huawei.json +++ b/test/data/ua/device/huawei.json @@ -701,6 +701,15 @@ "type": "mobile" } }, + { + "desc": "Huawei P10 Lite", + "ua": "Mozilla/5.0 (Linux; Android 8.0.0; WAS-L03T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5199.205 Mobile Safari/537.36", + "expect": { + "vendor": "Huawei", + "model": "WAS-L03T", + "type": "mobile" + } + }, { "desc": "Huawei P20 Lite", "ua": "Mozilla/5.0 (Linux; Android 8.0.0; ANE-LX1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36", @@ -728,6 +737,15 @@ "type": "mobile" } }, + { + "desc": "Huawei P30", + "ua": "Mozilla/5.0 (Linux; Android 10; ELE-L04) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.109 Mobile Safari/537.36", + "expect": { + "vendor": "Huawei", + "model": "ELE-L04", + "type": "mobile" + } + }, { "desc": "Huawei P30", "ua": "Mozilla/5.0 (Linux; Android 9; ELE-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36", @@ -782,6 +800,15 @@ "type": "mobile" } }, + { + "desc": "Huawei Nova", + "ua": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI CAN-L13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5113.212 Mobile Safari/537.36", + "expect": { + "vendor": "Huawei", + "model": "CAN-L13", + "type": "mobile" + } + }, { "desc": "Huawei Nova 5T", "ua": "Mozilla/5.0 (Linux; Android 10; YAL-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36", @@ -899,6 +926,15 @@ "type": "mobile" } }, + { + "desc": "Huawei Y7p", + "ua": "Mozilla/5.0 (Linux; Android 10; ART-L28; HMSCore 6.8.0.311) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4476.0 HuaweiBrowser/12.1.2.312 Mobile Safari/537.36", + "expect": { + "vendor": "Huawei", + "model": "ART-L28", + "type": "mobile" + } + }, { "desc": "Huawei Y7p", "ua": "Mozilla/5.0 (Linux; Android 9; ART-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.92 Mobile Safari/537.36", diff --git a/test/data/ua/device/xiaomi.json b/test/data/ua/device/xiaomi.json index 86593ef..053ef69 100644 --- a/test/data/ua/device/xiaomi.json +++ b/test/data/ua/device/xiaomi.json @@ -116,6 +116,15 @@ "type": "mobile" } }, + { + "desc": "Xiaomi Mi 11 Lite 5G", + "ua": "Mozilla/5.0 (Linux; U; Android 12; zh-CN; Mi 11 Lite 5G Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.136 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.17.0-gn", + "expect": { + "vendor": "Xiaomi", + "model": "Mi 11 Lite 5G", + "type": "mobile" + } + }, { "desc": "Xiaomi Mi 5s Plus", "ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; MI 5s Plus Build/MXB48T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/8.7.1", @@ -188,6 +197,15 @@ "type": "mobile" } }, + { + "desc": "Xiaomi Mi 10T", + "ua": "Mozilla/5.0 (Linux; U; Android 12; fr-CA; Mi 10T Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.79 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.16.1-gn", + "expect": { + "vendor": "Xiaomi", + "model": "Mi 10T", + "type": "mobile" + } + }, { "desc": "Xiaomi Mi A2", "ua": "Mozilla/5.0 (Linux; Android 9; Mi A2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36", @@ -314,6 +332,15 @@ "type": "tablet" } }, + { + "desc": "Xiaomi Pad 5", + "ua": "Mozilla/5.0 (Linux; U; Android 12; ca-ES; Xiaomi Pad 5 Build/SKQ1.220303.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.86 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.6.0-gn", + "expect": { + "vendor": "Xiaomi", + "model": "mi Pad 5", + "type": "tablet" + } + }, { "desc": "Xiaomi Pad 6S Pro 12.4", "ua": "Mozilla/5.0 (Linux; Android 14; 24018RPACC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", @@ -458,6 +485,15 @@ "type": "mobile" } }, + { + "desc": "XiaoMi Redmi Note 10 Lite", + "ua": "Mozilla/5.0 (Linux; U; Android 12; es-VE; Mi Note 10 Lite Build/SKQ1.210908.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.88 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.16.1-gn", + "expect": { + "vendor": "Xiaomi", + "model": "Mi Note 10 Lite", + "type": "mobile" + } + }, { "desc": "XiaoMi Redmi Note 10 Pro", "ua": "Mozilla/5.0 (Linux; Android 13; M2101K6P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",