mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-16 23:21:52 +03:00
Compare commits
5 Commits
0.7.21
...
gpu-detect
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9c651dbd6 | ||
|
|
b0cf91aa4f | ||
|
|
860189d048 | ||
|
|
437d05a653 | ||
|
|
b29e74d61c |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.21",
|
"version": "0.7.20",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Faisal Salman <f@faisalman.com>"
|
"Faisal Salman <f@faisalman.com>"
|
||||||
],
|
],
|
||||||
|
|||||||
4
dist/ua-parser.min.js
vendored
4
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
4
dist/ua-parser.pack.js
vendored
4
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
Package.describe({
|
Package.describe({
|
||||||
name: 'faisalman:ua-parser-js',
|
name: 'faisalman:ua-parser-js',
|
||||||
version: '0.7.21',
|
version: '0.7.20',
|
||||||
summary: 'Lightweight JavaScript-based user-agent string parser',
|
summary: 'Lightweight JavaScript-based user-agent string parser',
|
||||||
git: 'https://github.com/faisalman/ua-parser-js.git',
|
git: 'https://github.com/faisalman/ua-parser-js.git',
|
||||||
documentation: 'readme.md'
|
documentation: 'readme.md'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.21",
|
"version": "0.7.20",
|
||||||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
||||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
|||||||
64
readme.md
64
readme.md
@@ -18,7 +18,7 @@
|
|||||||
* returns new instance
|
* returns new instance
|
||||||
|
|
||||||
* `UAParser([uastring][,extensions])`
|
* `UAParser([uastring][,extensions])`
|
||||||
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, gpu: {}, os: {} }`
|
||||||
|
|
||||||
# Methods
|
# Methods
|
||||||
|
|
||||||
@@ -27,20 +27,19 @@
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Possible 'browser.name':
|
# Possible 'browser.name':
|
||||||
2345Explorer, 360 Browser, Amaya, Android Browser, Arora, Avant, Avast, AVG,
|
2345Explorer, Amaya, Android Browser, Arora, Avant, BIDUBrowser, Baidu,
|
||||||
BIDUBrowser, Baidu, Basilisk, Blazer, Bolt, Brave, Bowser, Camino, Chimera,
|
Basilisk, Blazer, Bolt, Bowser, Camino, Chimera, Chrome Headless,
|
||||||
Chrome Headless, Chrome WebView, Chrome, Chromium, Comodo Dragon, Dillo,
|
Chrome WebView, Chrome, Chromium, Comodo Dragon, Dillo, Dolphin, Doris, Edge,
|
||||||
Dolphin, Doris, Edge, Epiphany, Facebook, Falkon, Fennec, Firebird, Firefox,
|
Epiphany, Facebook, Falkon, Fennec, Firebird, Firefox, Flock, GSA, GoBrowser,
|
||||||
Flock, GSA, GoBrowser, ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon,
|
ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceape, Iceweasel,
|
||||||
Iceape, Iceweasel, Iridium, Iron, Jasmine, K-Meleon, Kindle, Konqueror,
|
Iridium, Iron, Jasmine, K-Meleon, Kindle, Konqueror, LBBROWSER Line, Links,
|
||||||
LBBROWSER Line, Links, Lunascape, Lynx, MIUI Browser, Maemo Browser, Maemo,
|
Lunascape, Lynx, MIUI Browser, Maemo Browser, Maemo, Maxthon, MetaSr Midori,
|
||||||
Maxthon, MetaSr Midori, Minimo, Mobile Safari, Mosaic, Mozilla, NetFront,
|
Minimo, Mobile Safari, Mosaic, Mozilla, NetFront, NetSurf, Netfront, Netscape,
|
||||||
NetSurf, Netfront, Netscape, NokiaBrowser, Oculus Browser, OmniWeb,
|
NokiaBrowser, Oculus Browser, OmniWeb, Opera Coast, Opera Mini, Opera Mobi,
|
||||||
Opera Coast, Opera Mini, Opera Mobi, Opera Tablet, Opera, PaleMoon, PhantomJS,
|
Opera Tablet, Opera, PaleMoon, PhantomJS, Phoenix, Polaris, Puffin, QQ,
|
||||||
Phoenix, Polaris, Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla,
|
QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, Safari, Samsung Browser,
|
||||||
RockMelt, Safari, Sailfish Browser, Samsung Browser, SeaMonkey, Silk, Skyfire,
|
SeaMonkey, Silk, Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tizen Browser,
|
||||||
Sleipnir, Slim, SlimBrowser, Swiftfox, Tizen Browser, UCBrowser, Vivaldi,
|
UCBrowser, Vivaldi, Waterfox, WeChat, Yandex, baidu, iCab, w3m, ...
|
||||||
Waterfox, WeChat, Yandex, baidu, iCab, w3m, ...
|
|
||||||
|
|
||||||
# 'browser.version' determined dynamically
|
# 'browser.version' determined dynamically
|
||||||
```
|
```
|
||||||
@@ -66,8 +65,8 @@ RIM, Samsung, Sharp, Siemens, Sony[Ericsson], Sprint, Xbox, Xiaomi, ZTE, ...
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Possible 'engine.name'
|
# Possible 'engine.name'
|
||||||
Amaya, Blink, EdgeHTML, Gecko, Goanna, iCab, KHTML, Links, Lynx, NetFront,
|
Amaya, Blink, EdgeHTML, Gecko, Goanna, iCab, KHTML, Links, Lynx, NetFront, NetSurf,
|
||||||
NetSurf, Presto, Tasman, Trident, w3m, WebKit
|
Presto, Tasman, Trident, w3m, WebKit
|
||||||
|
|
||||||
# 'engine.version' determined dynamically
|
# 'engine.version' determined dynamically
|
||||||
```
|
```
|
||||||
@@ -77,13 +76,12 @@ NetSurf, Presto, Tasman, Trident, w3m, WebKit
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Possible 'os.name'
|
# Possible 'os.name'
|
||||||
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
|
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, Contiki,
|
||||||
Contiki, Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Fuchsia, Gentoo, GNU,
|
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Fuchsia, Gentoo, GNU, Haiku, Hurd, iOS,
|
||||||
Haiku, Hurd, iOS, Joli, KaiOS, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo,
|
Joli, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD,
|
||||||
Minix, Mint, Morph OS, NetBSD, Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PC-BSD,
|
Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PC-BSD, PCLinuxOS, Plan9, Playstation, QNX, RedHat,
|
||||||
PCLinuxOS, Plan9, Playstation, QNX, RedHat, RIM Tablet OS, RISC OS, Sailfish,
|
RIM Tablet OS, RISC OS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,
|
||||||
Series40, Slackware, Solaris, SUSE, Symbian, Tizen, Ubuntu, Unix, VectorLinux,
|
Ubuntu, Unix, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk, ...
|
||||||
WebOS, Windows [Phone/Mobile], Zenwalk, ...
|
|
||||||
|
|
||||||
# 'os.version' determined dynamically
|
# 'os.version' determined dynamically
|
||||||
```
|
```
|
||||||
@@ -96,12 +94,26 @@ WebOS, Windows [Phone/Mobile], Zenwalk, ...
|
|||||||
68k, amd64, arm[64], avr, ia[32/64], irix[64], mips[64], pa-risc, ppc, sparc[64]
|
68k, amd64, arm[64], avr, ia[32/64], irix[64], mips[64], pa-risc, ppc, sparc[64]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* `getGPU()`
|
||||||
|
* returns `{ vendor: '', model: '' }`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Possible 'gpu.vendor'
|
||||||
|
ATI, Intel, NVIDIA, Qualcomm, SiS
|
||||||
|
|
||||||
|
# 'gpu.model' determined dynamically
|
||||||
|
```
|
||||||
|
|
||||||
* `getResult()`
|
* `getResult()`
|
||||||
* returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
* returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
||||||
|
|
||||||
* `getUA()`
|
* `getUA()`
|
||||||
* returns UA string of current instance
|
* returns UA string of current instance
|
||||||
|
|
||||||
|
* `setRenderer(rendererstr)`
|
||||||
|
* set Renderer string to parse
|
||||||
|
* returns current instance
|
||||||
|
|
||||||
* `setUA(uastring)`
|
* `setUA(uastring)`
|
||||||
* set UA string to parse
|
* set UA string to parse
|
||||||
* returns current instance
|
* returns current instance
|
||||||
@@ -143,6 +155,10 @@ WebOS, Windows [Phone/Mobile], Zenwalk, ...
|
|||||||
},
|
},
|
||||||
cpu: {
|
cpu: {
|
||||||
architecture: ""
|
architecture: ""
|
||||||
|
},
|
||||||
|
gpu: {
|
||||||
|
vendor: "",
|
||||||
|
model: ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*!
|
/*!
|
||||||
* UAParser.js v0.7.21
|
* UAParser.js v0.7.20
|
||||||
* Lightweight JavaScript-based User-Agent string parser
|
* Lightweight JavaScript-based User-Agent string parser
|
||||||
* https://github.com/faisalman/ua-parser-js
|
* https://github.com/faisalman/ua-parser-js
|
||||||
*
|
*
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
/////////////
|
/////////////
|
||||||
|
|
||||||
|
|
||||||
var LIBVERSION = '0.7.21',
|
var LIBVERSION = '0.7.20',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@@ -237,10 +237,10 @@
|
|||||||
/(kindle)\/([\w\.]+)/i, // Kindle
|
/(kindle)\/([\w\.]+)/i, // Kindle
|
||||||
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
|
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
|
||||||
// Lunascape/Maxthon/Netfront/Jasmine/Blazer
|
// Lunascape/Maxthon/Netfront/Jasmine/Blazer
|
||||||
|
|
||||||
// Trident based
|
// Trident based
|
||||||
/(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,
|
/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
|
||||||
// Avant/IEMobile/SlimBrowser
|
// Avant/IEMobile/SlimBrowser/Baidu
|
||||||
/(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
|
|
||||||
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
|
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
|
||||||
|
|
||||||
// Webkit/KHTML based
|
// Webkit/KHTML based
|
||||||
@@ -261,12 +261,6 @@
|
|||||||
/(yabrowser)\/([\w\.]+)/i // Yandex
|
/(yabrowser)\/([\w\.]+)/i // Yandex
|
||||||
], [[NAME, 'Yandex'], VERSION], [
|
], [[NAME, 'Yandex'], VERSION], [
|
||||||
|
|
||||||
/(Avast)\/([\w\.]+)/i // Avast Secure Browser
|
|
||||||
], [[NAME, 'Avast Secure Browser'], VERSION], [
|
|
||||||
|
|
||||||
/(AVG)\/([\w\.]+)/i // AVG Secure Browser
|
|
||||||
], [[NAME, 'AVG Secure Browser'], VERSION], [
|
|
||||||
|
|
||||||
/(puffin)\/([\w\.]+)/i // Puffin
|
/(puffin)\/([\w\.]+)/i // Puffin
|
||||||
], [[NAME, 'Puffin'], VERSION], [
|
], [[NAME, 'Puffin'], VERSION], [
|
||||||
|
|
||||||
@@ -288,7 +282,7 @@
|
|||||||
/(micromessenger)\/([\w\.]+)/i // WeChat
|
/(micromessenger)\/([\w\.]+)/i // WeChat
|
||||||
], [[NAME, 'WeChat'], VERSION], [
|
], [[NAME, 'WeChat'], VERSION], [
|
||||||
|
|
||||||
/(brave)\/([\w\.]+)/i // Brave browser
|
/(brave)\/([\w\.]+)/i // Brave browser
|
||||||
], [[NAME, 'Brave'], VERSION], [
|
], [[NAME, 'Brave'], VERSION], [
|
||||||
|
|
||||||
/(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
|
/(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
|
||||||
@@ -300,7 +294,7 @@
|
|||||||
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/(baiduboxapp)[\/\s]?([\w\.]+)/i // Baidu App
|
/(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
|
/(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
|
||||||
@@ -309,7 +303,7 @@
|
|||||||
/(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
|
/(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
|
||||||
], [NAME], [
|
], [NAME], [
|
||||||
|
|
||||||
/(LBBROWSER)/i // LieBao Browser
|
/(LBBROWSER)/i // LieBao Browser
|
||||||
], [NAME], [
|
], [NAME], [
|
||||||
|
|
||||||
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
||||||
@@ -344,9 +338,6 @@
|
|||||||
/(dolfin)\/([\w\.]+)/i // Dolphin
|
/(dolfin)\/([\w\.]+)/i // Dolphin
|
||||||
], [[NAME, 'Dolphin'], VERSION], [
|
], [[NAME, 'Dolphin'], VERSION], [
|
||||||
|
|
||||||
/(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
|
|
||||||
], [[NAME, '360 Browser']], [
|
|
||||||
|
|
||||||
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
||||||
], [[NAME, 'Chrome'], VERSION], [
|
], [[NAME, 'Chrome'], VERSION], [
|
||||||
|
|
||||||
@@ -427,7 +418,7 @@
|
|||||||
], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/(apple\s{0,1}tv)/i // Apple TV
|
/(apple\s{0,1}tv)/i // Apple TV
|
||||||
], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [
|
], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
|
||||||
|
|
||||||
/(archos)\s(gamepad2?)/i, // Archos
|
/(archos)\s(gamepad2?)/i, // Archos
|
||||||
/(hp).+(touchpad)/i, // HP TouchPad
|
/(hp).+(touchpad)/i, // HP TouchPad
|
||||||
@@ -490,12 +481,9 @@
|
|||||||
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/d\/huawei([\w\s-]+)[;\)]/i,
|
/d\/huawei([\w\s-]+)[;\)]/i,
|
||||||
/(nexus\s6p|vog-l29|ane-lx1|eml-l29)/i // Huawei
|
/(nexus\s6p)/i // Huawei
|
||||||
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/android.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
|
|
||||||
], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
|
|
||||||
|
|
||||||
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
|
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
|
||||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
@@ -570,7 +558,7 @@
|
|||||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/crkey/i // Google Chromecast
|
/crkey/i // Google Chromecast
|
||||||
], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
|
], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
|
||||||
|
|
||||||
/android.+;\s(glass)\s\d/i // Google Glass
|
/android.+;\s(glass)\s\d/i // Google Glass
|
||||||
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
|
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
|
||||||
@@ -595,7 +583,7 @@
|
|||||||
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
|
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/android.+a000(1)\s+build/i, // OnePlus
|
/android.+a000(1)\s+build/i, // OnePlus
|
||||||
/android.+oneplus\s(a\d{4})[\s)]/i
|
/android.+oneplus\s(a\d{4})\s+build/i
|
||||||
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
|
/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
|
||||||
@@ -681,8 +669,8 @@
|
|||||||
/windows.+\sedge\/([\w\.]+)/i // EdgeHTML
|
/windows.+\sedge\/([\w\.]+)/i // EdgeHTML
|
||||||
], [VERSION, [NAME, 'EdgeHTML']], [
|
], [VERSION, [NAME, 'EdgeHTML']], [
|
||||||
|
|
||||||
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
/webkit\/537\.36.+chrome\/(?!27)/i // Blink
|
||||||
], [VERSION, [NAME, 'Blink']], [
|
], [[NAME, 'Blink']], [
|
||||||
|
|
||||||
/(presto)\/([\w\.]+)/i, // Presto
|
/(presto)\/([\w\.]+)/i, // Presto
|
||||||
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
|
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
|
||||||
@@ -695,6 +683,20 @@
|
|||||||
], [VERSION, NAME]
|
], [VERSION, NAME]
|
||||||
],
|
],
|
||||||
|
|
||||||
|
gpu : [[
|
||||||
|
|
||||||
|
/(intel).*\b(hd\sgraphics\s\d{4}|iris(?:\spro)|gma\s\w+)/i, // Intel
|
||||||
|
/(nvidia)\s(geforce\s(?:gtx?\s)\d\w+|quadro)/i, // NVIDIA
|
||||||
|
/(sis)\s(\w+)/i // SiS
|
||||||
|
], [VENDOR, MODEL], [
|
||||||
|
|
||||||
|
/\b(radeon\shd\s\w{4,5})/i // ATI
|
||||||
|
], [MODEL, [VENDOR, 'ATI']], [
|
||||||
|
|
||||||
|
/(adreno\s(?:\(TM\)\s)\w+)/i // Qualcomm
|
||||||
|
], [[MODEL, /\(TM\)\s/, ''], [VENDOR, 'Qualcomm']]
|
||||||
|
],
|
||||||
|
|
||||||
os : [[
|
os : [[
|
||||||
|
|
||||||
// Windows based
|
// Windows based
|
||||||
@@ -711,7 +713,7 @@
|
|||||||
/\((bb)(10);/i // BlackBerry 10
|
/\((bb)(10);/i // BlackBerry 10
|
||||||
], [[NAME, 'BlackBerry'], VERSION], [
|
], [[NAME, 'BlackBerry'], VERSION], [
|
||||||
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
|
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
|
||||||
/(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
|
/(tizen)[\/\s]([\w\.]+)/i, // Tizen
|
||||||
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
|
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
|
||||||
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
|
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
@@ -785,6 +787,14 @@
|
|||||||
var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
|
var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
|
||||||
var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
|
var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
|
||||||
|
|
||||||
|
var renderer;
|
||||||
|
// browser only
|
||||||
|
if (window && window.document) {
|
||||||
|
var canvas = document.createElement('canvas');
|
||||||
|
var gl = canvas.getContext ? canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl') : undefined;
|
||||||
|
renderer = gl && gl.getParameter && gl.getExtension && gl.getExtension('WEBGL_debug_renderer_info') ? gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
this.getBrowser = function () {
|
this.getBrowser = function () {
|
||||||
var browser = { name: undefined, version: undefined };
|
var browser = { name: undefined, version: undefined };
|
||||||
mapper.rgx.call(browser, ua, rgxmap.browser);
|
mapper.rgx.call(browser, ua, rgxmap.browser);
|
||||||
@@ -806,6 +816,13 @@
|
|||||||
mapper.rgx.call(engine, ua, rgxmap.engine);
|
mapper.rgx.call(engine, ua, rgxmap.engine);
|
||||||
return engine;
|
return engine;
|
||||||
};
|
};
|
||||||
|
this.getGPU = function () {
|
||||||
|
var gpu = { vendor: undefined, model: undefined };
|
||||||
|
if (renderer) {
|
||||||
|
mapper.rgx.call(gpu, renderer, rgxmap.gpu);
|
||||||
|
}
|
||||||
|
return gpu;
|
||||||
|
};
|
||||||
this.getOS = function () {
|
this.getOS = function () {
|
||||||
var os = { name: undefined, version: undefined };
|
var os = { name: undefined, version: undefined };
|
||||||
mapper.rgx.call(os, ua, rgxmap.os);
|
mapper.rgx.call(os, ua, rgxmap.os);
|
||||||
@@ -818,12 +835,17 @@
|
|||||||
engine : this.getEngine(),
|
engine : this.getEngine(),
|
||||||
os : this.getOS(),
|
os : this.getOS(),
|
||||||
device : this.getDevice(),
|
device : this.getDevice(),
|
||||||
cpu : this.getCPU()
|
cpu : this.getCPU(),
|
||||||
|
gpu : this.getGPU()
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
this.getUA = function () {
|
this.getUA = function () {
|
||||||
return ua;
|
return ua;
|
||||||
};
|
};
|
||||||
|
this.setRenderer = function (rendererstr) {
|
||||||
|
renderer = rendererstr;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
this.setUA = function (uastring) {
|
this.setUA = function (uastring) {
|
||||||
ua = uastring;
|
ua = uastring;
|
||||||
return this;
|
return this;
|
||||||
@@ -840,6 +862,10 @@
|
|||||||
UAParser.CPU = {
|
UAParser.CPU = {
|
||||||
ARCHITECTURE : ARCHITECTURE
|
ARCHITECTURE : ARCHITECTURE
|
||||||
};
|
};
|
||||||
|
UAParser.GPU = {
|
||||||
|
MODEL : MODEL,
|
||||||
|
VENDOR : VENDOR
|
||||||
|
};
|
||||||
UAParser.DEVICE = {
|
UAParser.DEVICE = {
|
||||||
MODEL : MODEL,
|
MODEL : MODEL,
|
||||||
VENDOR : VENDOR,
|
VENDOR : VENDOR,
|
||||||
@@ -890,7 +916,7 @@
|
|||||||
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
|
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
|
||||||
// and we should catch that.
|
// and we should catch that.
|
||||||
var $ = window && (window.jQuery || window.Zepto);
|
var $ = window && (window.jQuery || window.Zepto);
|
||||||
if ($ && !$.ua) {
|
if (typeof $ !== UNDEF_TYPE && !$.ua) {
|
||||||
var parser = new UAParser();
|
var parser = new UAParser();
|
||||||
$.ua = parser.getResult();
|
$.ua = parser.getResult();
|
||||||
$.ua.get = function () {
|
$.ua.get = function () {
|
||||||
|
|||||||
@@ -1,14 +1,4 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"desc" : "360 Browser on iOS",
|
|
||||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/607.3.9 (KHTML, like Gecko) Mobile/16G102 QHBrowser/317 QihooBrowser/4.0.10",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "360 Browser",
|
|
||||||
"version" : "undefined",
|
|
||||||
"major" : "undefined"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc" : "Android Browser on Galaxy Nexus",
|
"desc" : "Android Browser on Galaxy Nexus",
|
||||||
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||||
@@ -99,32 +89,12 @@
|
|||||||
"major" : "undefined"
|
"major" : "undefined"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"desc" : "Avast Secure Browser",
|
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 Avast/72.0.1174.122",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "Avast Secure Browser",
|
|
||||||
"version" : "72.0.1174.122",
|
|
||||||
"major" : "72"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc" : "AVG Secure Browser",
|
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 AVG/72.0.719.123",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "AVG Secure Browser",
|
|
||||||
"version" : "72.0.719.123",
|
|
||||||
"major" : "72"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc" : "Baidu",
|
"desc" : "Baidu",
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; baidubrowser 1.x)",
|
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; baidubrowser 1.x)",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "baidubrowser",
|
"name" : "baidu",
|
||||||
"version" : "1.x",
|
"version" : "1.x",
|
||||||
"major" : "1"
|
"major" : "1"
|
||||||
}
|
}
|
||||||
@@ -1138,26 +1108,6 @@
|
|||||||
"major" : "6"
|
"major" : "6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"desc" : "baidu app on iOS",
|
|
||||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C101 main%2F1.0 baiduboxapp/11.12.0.18 (Baidu; P2 12.1.2)",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "baiduboxapp",
|
|
||||||
"version" : "11.12.0.18",
|
|
||||||
"major" : "11"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc" : "baidu app on Android",
|
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 8.1.0; BKK-AL10 Build/HONORBKK-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.83 Mobile Safari/537.36 T7/11.11 baiduboxapp/11.11.0.0 (Baidu; P1 8.1.0)",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "baiduboxapp",
|
|
||||||
"version" : "11.11.0.0",
|
|
||||||
"major" : "11"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc" : "WeChat Desktop for Windows Built-in Browser",
|
"desc" : "WeChat Desktop for Windows Built-in Browser",
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400",
|
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400",
|
||||||
|
|||||||
@@ -279,24 +279,6 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"desc": "OnePlus 6",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; ONEPLUS A6003) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.89 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "OnePlus",
|
|
||||||
"model": "A6003",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "OnePlus 6T",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; ONEPLUS A6010) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.96 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "OnePlus",
|
|
||||||
"model": "A6010",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc": "OPPO R7s",
|
"desc": "OPPO R7s",
|
||||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; OPPO R7s Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.1 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; OPPO R7s Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.1 Mobile Safari/537.36",
|
||||||
@@ -653,8 +635,7 @@
|
|||||||
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.84 Safari/537.36 CrKey/1.22.79313",
|
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.84 Safari/537.36 CrKey/1.22.79313",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "Google",
|
"vendor": "Google",
|
||||||
"model": "Chromecast",
|
"model": "Chromecast"
|
||||||
"type": "smarttv"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1060,41 +1041,5 @@
|
|||||||
"model": "MI PAD 2",
|
"model": "MI PAD 2",
|
||||||
"type": "tablet"
|
"type": "tablet"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
{
|
|
||||||
"desc": "HUAWEI MediaPad M3 Lite 10",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; BAH-L09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Huawei",
|
|
||||||
"model": "BAH-L09",
|
|
||||||
"type": "tablet"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Huawei P30 Pro",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; VOG-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Huawei",
|
|
||||||
"model": "VOG-L29",
|
|
||||||
"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",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Huawei",
|
|
||||||
"model": "ANE-LX1",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Huawei P20",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; EML-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Huawei",
|
|
||||||
"model": "EML-L29",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Blink",
|
"name" : "Blink",
|
||||||
"version" : "57.0.2987.146"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
56
test/gpu-test.json
Normal file
56
test/gpu-test.json
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Intel",
|
||||||
|
"renderer": "Intel HD Graphics 4000 OpenGL Engine",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Intel",
|
||||||
|
"model" : "HD Graphics 4000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Intel",
|
||||||
|
"renderer": "Intel Iris Pro OpenGL Engine",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Intel",
|
||||||
|
"model" : "Iris Pro"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Intel",
|
||||||
|
"renderer": "Intel GMA X3100 OpenGL Engine",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Intel",
|
||||||
|
"model" : "GMA X3100"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ATI",
|
||||||
|
"renderer": "ATI Radeon HD 6750M OpenGL Engine",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "ATI",
|
||||||
|
"model" : "Radeon HD 6750M"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NVIDIA",
|
||||||
|
"renderer": "NVIDIA GeForce GT 650M OpenGL Engine",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "NVIDIA",
|
||||||
|
"model" : "GeForce GT 650M"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qualcomm",
|
||||||
|
"renderer": "Adreno (TM) 320",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Qualcomm",
|
||||||
|
"model" : "Adreno 320"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -548,15 +548,6 @@
|
|||||||
"version" : "R1"
|
"version" : "R1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"desc" : "KaiOS",
|
|
||||||
"ua" : "Mozilla/5.0 (Mobile; Nokia_8110_4G; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "KAIOS",
|
|
||||||
"version" : "2.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc" : "AIX",
|
"desc" : "AIX",
|
||||||
"ua" : "",
|
"ua" : "",
|
||||||
|
|||||||
27
test/test.js
27
test/test.js
@@ -5,6 +5,7 @@ var browsers = require('./browser-test.json');
|
|||||||
var cpus = require('./cpu-test.json');
|
var cpus = require('./cpu-test.json');
|
||||||
var devices = require('./device-test.json');
|
var devices = require('./device-test.json');
|
||||||
var engines = require('./engine-test.json');
|
var engines = require('./engine-test.json');
|
||||||
|
var gpus = require('./gpu-test.json');
|
||||||
var os = require('./os-test.json');
|
var os = require('./os-test.json');
|
||||||
var parser = new UAParser();
|
var parser = new UAParser();
|
||||||
var methods = [
|
var methods = [
|
||||||
@@ -32,6 +33,12 @@ var methods = [
|
|||||||
list : engines,
|
list : engines,
|
||||||
properties : ['name', 'version']
|
properties : ['name', 'version']
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title : 'getGPU',
|
||||||
|
label : 'gpu',
|
||||||
|
list : gpus,
|
||||||
|
properties : ['model', 'vendor']
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title : 'getOS',
|
title : 'getOS',
|
||||||
label : 'os',
|
label : 'os',
|
||||||
@@ -43,7 +50,7 @@ describe('UAParser()', function () {
|
|||||||
var ua = 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6';
|
var ua = 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6';
|
||||||
assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
|
assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
|
||||||
});
|
});
|
||||||
|
/*
|
||||||
for (var i in methods) {
|
for (var i in methods) {
|
||||||
describe(methods[i]['title'], function () {
|
describe(methods[i]['title'], function () {
|
||||||
for (var j in methods[i]['list']) {
|
for (var j in methods[i]['list']) {
|
||||||
@@ -63,7 +70,22 @@ for (var i in methods) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
describe('getGPU', function () {
|
||||||
|
for (var i in gpus) {
|
||||||
|
describe(`[${gpus[i].desc}] "${gpus[i].renderer}"`, function () {
|
||||||
|
var gpu = parser.setRenderer(gpus[i].renderer).getGPU();
|
||||||
|
var expect = gpus[i].expect;
|
||||||
|
it(`should return vendor: ${expect.vendor}`, function(){
|
||||||
|
assert.equal(gpu.vendor, expect.vendor != 'undefined' ? expect.vendor : undefined);
|
||||||
|
})
|
||||||
|
it(`should return model: ${expect.model}`, function(){
|
||||||
|
assert.equal(gpu.model, expect.model != 'undefined' ? expect.model : undefined);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
describe('Returns', function () {
|
describe('Returns', function () {
|
||||||
it('getResult() should returns JSON', function(done) {
|
it('getResult() should returns JSON', function(done) {
|
||||||
@@ -74,6 +96,7 @@ describe('Returns', function () {
|
|||||||
cpu: { architecture: undefined },
|
cpu: { architecture: undefined },
|
||||||
device: { vendor: undefined, model: undefined, type: undefined },
|
device: { vendor: undefined, model: undefined, type: undefined },
|
||||||
engine: { name: undefined, version: undefined},
|
engine: { name: undefined, version: undefined},
|
||||||
|
gpu: { vendor: undefined, model: undefined},
|
||||||
os: { name: undefined, version: undefined }
|
os: { name: undefined, version: undefined }
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
|
|||||||
Reference in New Issue
Block a user