mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-16 07:02:16 +03:00
Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40aa1a693b | ||
|
|
25e143ee7c | ||
|
|
7bd9ffea24 | ||
|
|
c566f45cbd | ||
|
|
3b89dff771 | ||
|
|
5ba5e7abc9 | ||
|
|
b8978f5933 | ||
|
|
eeb1b9ef81 | ||
|
|
aeae29be66 | ||
|
|
3ce12c0cf9 | ||
|
|
4d95ac10ef | ||
|
|
61b4a089c5 | ||
|
|
74ec93ffb6 | ||
|
|
459f3d34f5 | ||
|
|
6f621f1ae2 | ||
|
|
7ae3098778 | ||
|
|
806c2b8030 | ||
|
|
cb1a64b509 | ||
|
|
b49cfae4e2 | ||
|
|
91b046462c | ||
|
|
69509af6dd | ||
|
|
225f703b67 | ||
|
|
7f217753f5 | ||
|
|
10f9fb35ca | ||
|
|
5ae468a3d3 | ||
|
|
fd46c4d2be | ||
|
|
297c6538bc | ||
|
|
f9f9fa79e1 | ||
|
|
07fe58b793 | ||
|
|
3a4626b5e8 | ||
|
|
3fd01f07ea | ||
|
|
d103dd5450 | ||
|
|
6984de7927 | ||
|
|
2610f37a8b | ||
|
|
a25bb8b1a6 | ||
|
|
ee2db31f8c | ||
|
|
89775a8ae7 | ||
|
|
7d826ed62e | ||
|
|
a6316f02b0 | ||
|
|
72a11e24b2 | ||
|
|
f7ca724f3b | ||
|
|
8d826fcc24 | ||
|
|
951106c425 | ||
|
|
83ca52bb28 | ||
|
|
6fb4941458 | ||
|
|
48ab3b372c | ||
|
|
38c409e8d9 | ||
|
|
4e2cbdfd16 | ||
|
|
fbe8a0e3a6 | ||
|
|
8e9c400ec5 | ||
|
|
b89fa098aa | ||
|
|
f3882f1882 | ||
|
|
a25426840c | ||
|
|
985a7b18e0 | ||
|
|
8e09cd49e3 | ||
|
|
4768992762 | ||
|
|
f89e08f2c0 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.13",
|
"version": "0.7.16",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Faisal Salman <fyzlman@gmail.com>"
|
"Faisal Salman <fyzlman@gmail.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.13',
|
version: '0.7.16',
|
||||||
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'
|
||||||
|
|||||||
14
package.json
14
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.13",
|
"version": "0.7.16",
|
||||||
"author": "Faisal Salman <fyzlman@gmail.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": [
|
||||||
"user-agent",
|
"user-agent",
|
||||||
@@ -11,7 +11,9 @@
|
|||||||
"engine",
|
"engine",
|
||||||
"os",
|
"os",
|
||||||
"device",
|
"device",
|
||||||
"cpu"
|
"cpu",
|
||||||
|
"jquery-plugin",
|
||||||
|
"ecosystem:jquery"
|
||||||
],
|
],
|
||||||
"homepage": "http://github.com/faisalman/ua-parser-js",
|
"homepage": "http://github.com/faisalman/ua-parser-js",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
@@ -84,7 +86,6 @@
|
|||||||
},
|
},
|
||||||
"verup": {
|
"verup": {
|
||||||
"files": [
|
"files": [
|
||||||
"ua-parser-js.jquery.json",
|
|
||||||
"bower.json",
|
"bower.json",
|
||||||
"package.js",
|
"package.js",
|
||||||
"src/ua-parser.js"
|
"src/ua-parser.js"
|
||||||
@@ -113,5 +114,8 @@
|
|||||||
"dist": "dist",
|
"dist": "dist",
|
||||||
"src": "src",
|
"src": "src",
|
||||||
"test": "test"
|
"test": "test"
|
||||||
}
|
},
|
||||||
|
"bugs": "https://github.com/faisalman/ua-parser-js/issues",
|
||||||
|
"demo": "https://faisalman.github.io/ua-parser-js",
|
||||||
|
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js"
|
||||||
}
|
}
|
||||||
|
|||||||
33
readme.md
33
readme.md
@@ -212,6 +212,12 @@ requirejs(['ua-parser-js'], function(UAParser) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Using CDN
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/ua-parser-js@0/dist/ua-parser.min.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
## Using bower
|
## Using bower
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -224,6 +230,18 @@ $ bower install ua-parser-js
|
|||||||
$ meteor add faisalman:ua-parser-js
|
$ meteor add faisalman:ua-parser-js
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Using CLI
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ node ua-parser.min.js "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)"
|
||||||
|
# multiple args
|
||||||
|
$ node ua-parser.min.js "Opera/1.2" "Opera/3.4"
|
||||||
|
# piped args
|
||||||
|
$ echo "Opera/1.2" | node ua-parser.min.js
|
||||||
|
# log file
|
||||||
|
$ cat ua.log | node ua-parser.min.js
|
||||||
|
```
|
||||||
|
|
||||||
## Using jQuery/Zepto ($.ua)
|
## Using jQuery/Zepto ($.ua)
|
||||||
|
|
||||||
Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery/Zepto is present and create `$.ua` object based on browser's user-agent (although in case you need, `window.UAParser` constructor is still present). To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
|
Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery/Zepto is present and create `$.ua` object based on browser's user-agent (although in case you need, `window.UAParser` constructor is still present). To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
|
||||||
@@ -253,16 +271,16 @@ $('body').addClass('ua-browser-' + $.ua.browser.name + ' ua-devicetype-' + $.ua.
|
|||||||
|
|
||||||
## Extending regex patterns
|
## Extending regex patterns
|
||||||
|
|
||||||
* `UAParser(uastring[, extensions])`
|
* `UAParser([uastring,] extensions)`
|
||||||
|
|
||||||
Pass your own regexes to extend the limited matching rules.
|
Pass your own regexes to extend the limited matching rules.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// Example:
|
// Example:
|
||||||
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
|
||||||
var myOwnRegex = [[/(myownbrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]];
|
var myOwnRegex = [[/(myownbrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]];
|
||||||
var parser = new UAParser(uaString, { browser: myOwnRegex });
|
var myParser = new UAParser({ browser: myOwnRegex });
|
||||||
console.log(parser.getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
|
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||||||
|
console.log(myParser.setUA(uaString).getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -287,6 +305,13 @@ $ npm run build
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Donate
|
||||||
|
|
||||||
|
Do you use & like UAParser.js but you don’t find a way to show some love? If yes, please consider donating to support this project. Otherwise, no worries, regardless of whether there is support or not, I will keep maintaining this project. Still, if you buy me a cup of coffee I would be more than happy though :)
|
||||||
|
|
||||||
|
[](https://pledgie.com/campaigns/34252)
|
||||||
|
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
Dual licensed under GPLv2 & MIT
|
Dual licensed under GPLv2 & MIT
|
||||||
|
|||||||
196
src/ua-parser.js
Normal file → Executable file
196
src/ua-parser.js
Normal file → Executable file
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* UAParser.js v0.7.13
|
* UAParser.js v0.7.16
|
||||||
* 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.13',
|
var LIBVERSION = '0.7.16',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
}
|
}
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
//console.log(this);
|
// console.log(this);
|
||||||
//return this;
|
//return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -270,10 +270,7 @@
|
|||||||
/(puffin)\/([\w\.]+)/i // Puffin
|
/(puffin)\/([\w\.]+)/i // Puffin
|
||||||
], [[NAME, 'Puffin'], VERSION], [
|
], [[NAME, 'Puffin'], VERSION], [
|
||||||
|
|
||||||
/(uc\s?browser)[\/\s]?([\w\.]+)/i,
|
/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
|
||||||
/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
|
|
||||||
/juc.+(ucweb)[\/\s]?([\w\.]+)/i,
|
|
||||||
/(ucbrowser)\/([\w\.]+)/i
|
|
||||||
// UCBrowser
|
// UCBrowser
|
||||||
], [[NAME, 'UCBrowser'], VERSION], [
|
], [[NAME, 'UCBrowser'], VERSION], [
|
||||||
|
|
||||||
@@ -283,6 +280,9 @@
|
|||||||
/(micromessenger)\/([\w\.]+)/i // WeChat
|
/(micromessenger)\/([\w\.]+)/i // WeChat
|
||||||
], [[NAME, 'WeChat'], VERSION], [
|
], [[NAME, 'WeChat'], VERSION], [
|
||||||
|
|
||||||
|
/(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
|
||||||
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
@@ -292,13 +292,15 @@
|
|||||||
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
|
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
|
||||||
], [VERSION, [NAME, 'Facebook']], [
|
], [VERSION, [NAME, 'Facebook']], [
|
||||||
|
|
||||||
/(headlesschrome) ([\w\.]+)/i // Chrome Headless
|
/headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
|
||||||
], [VERSION, [NAME, 'Chrome Headless']], [
|
], [VERSION, [NAME, 'Chrome Headless']], [
|
||||||
|
|
||||||
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
|
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
|
||||||
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
|
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
|
||||||
|
|
||||||
/android.+samsungbrowser\/([\w\.]+)/i,
|
/((?:oculus|samsung)browser)\/([\w\.]+)/i
|
||||||
|
], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
|
||||||
|
|
||||||
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
||||||
], [VERSION, [NAME, 'Android Browser']], [
|
], [VERSION, [NAME, 'Android Browser']], [
|
||||||
|
|
||||||
@@ -324,6 +326,9 @@
|
|||||||
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
|
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
|
||||||
], [VERSION, NAME], [
|
], [VERSION, NAME], [
|
||||||
|
|
||||||
|
/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
|
||||||
|
], [[NAME, 'GSA'], VERSION], [
|
||||||
|
|
||||||
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
||||||
], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
|
], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
|
||||||
|
|
||||||
@@ -518,8 +523,8 @@
|
|||||||
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
|
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
|
||||||
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
|
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
|
||||||
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
|
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
||||||
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
|
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
|
||||||
/(asus)-?(\w+)/i // Asus
|
/(asus)-?(\w+)/i // Asus
|
||||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
@@ -532,8 +537,8 @@
|
|||||||
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
|
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
|
||||||
/(sony)?(?:sgp.+)\sbuild\//i
|
/(sony)?(?:sgp.+)\sbuild\//i
|
||||||
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
|
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
|
||||||
/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
|
/android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
|
||||||
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/\s(ouya)\s/i, // Ouya
|
/\s(ouya)\s/i, // Ouya
|
||||||
/(nintendo)\s([wids3u]+)/i // Nintendo
|
/(nintendo)\s([wids3u]+)/i // Nintendo
|
||||||
@@ -553,14 +558,15 @@
|
|||||||
|
|
||||||
/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
|
/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
|
||||||
/(zte)-(\w+)*/i, // ZTE
|
/(zte)-(\w+)*/i, // ZTE
|
||||||
/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
|
/(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
|
||||||
// Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
|
// Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
|
||||||
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/(nexus\s9)/i // HTC Nexus 9
|
/(nexus\s9)/i // HTC Nexus 9
|
||||||
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/(nexus\s6p)/i // Huawei Nexus 6P
|
/d\/huawei([\w\s-]+)[;\)]/i,
|
||||||
|
/(nexus\s6p)/i // Huawei
|
||||||
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
|
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
|
||||||
@@ -609,12 +615,15 @@
|
|||||||
/android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
|
/android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
|
||||||
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
|
||||||
|
], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
|
||||||
/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
|
/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
|
||||||
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
|
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
|
||||||
/(lg) netcast\.tv/i // LG SmartTV
|
/(lg) netcast\.tv/i // LG SmartTV
|
||||||
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
|
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
|
||||||
/(nexus\s[45])/i, // LG
|
/(nexus\s[45])/i, // LG
|
||||||
/lg[e;\s\/-]+(\w+)*/i
|
/lg[e;\s\/-]+(\w+)*/i,
|
||||||
|
/android.+lg(\-?[\d\w]+)\s+build/i
|
||||||
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
|
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
|
||||||
@@ -643,17 +652,90 @@
|
|||||||
|
|
||||||
/android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
/android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
||||||
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
||||||
/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
|
/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Mi
|
||||||
|
/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i // Redmi Phones
|
||||||
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
||||||
|
/android.+(mi[\s\-_]*(?:pad)?(?:[\s_]*[\w\s]+)?)\s+build/i // Mi Pad tablets
|
||||||
|
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
|
||||||
|
/android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
|
||||||
|
], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/android.+a000(1)\s+build/i // OnePlus
|
/android.+a000(1)\s+build/i // OnePlus
|
||||||
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/\s(tablet)[;\/]/i, // Unidentifiable Tablet
|
/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
|
||||||
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
||||||
], [[TYPE, util.lowerize], VENDOR, MODEL]
|
|
||||||
|
|
||||||
/*//////////////////////////
|
/android.+[;\/]\s*(Venue[\d\s]*)\s+build/i // Dell Venue Tablets
|
||||||
|
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
|
||||||
|
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i // Barnes & Noble Tablet
|
||||||
|
], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
|
||||||
|
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i // ZTE K Series Tablet
|
||||||
|
], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
|
||||||
|
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
|
||||||
|
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
|
||||||
|
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i,
|
||||||
|
/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i // Dragon Touch Tablet
|
||||||
|
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(NS-?.+)\s+build/i // Insignia Tablets
|
||||||
|
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*((NX|Next)-?.+)\s+build/i // NextBook Tablets
|
||||||
|
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
|
||||||
|
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i // LvTel Phones
|
||||||
|
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
|
||||||
|
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i // Le Pan Tablets
|
||||||
|
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
|
||||||
|
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
|
||||||
|
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
|
||||||
|
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
|
||||||
|
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+(Gigaset)[\s\-]+(Q.+)\s+build/i // Gigaset Tablets
|
||||||
|
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
|
||||||
|
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
||||||
|
], [[TYPE, util.lowerize], VENDOR, MODEL], [
|
||||||
|
|
||||||
|
/(android.+)[;\/].+build/i // Generic Android Device
|
||||||
|
], [MODEL, [VENDOR, 'Generic']]
|
||||||
|
|
||||||
|
|
||||||
|
/*//////////////////////////
|
||||||
// TODO: move to string map
|
// TODO: move to string map
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
|
|
||||||
@@ -775,8 +857,9 @@
|
|||||||
/(haiku)\s(\w+)/i // Haiku
|
/(haiku)\s(\w+)/i // Haiku
|
||||||
], [NAME, VERSION],[
|
], [NAME, VERSION],[
|
||||||
|
|
||||||
/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
|
/cfnetwork\/.+darwin/i,
|
||||||
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
|
/ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
|
||||||
|
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
||||||
|
|
||||||
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
|
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
|
||||||
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS
|
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS
|
||||||
@@ -796,7 +879,7 @@
|
|||||||
/////////////////
|
/////////////////
|
||||||
// Constructor
|
// Constructor
|
||||||
////////////////
|
////////////////
|
||||||
|
/*
|
||||||
var Browser = function (name, version) {
|
var Browser = function (name, version) {
|
||||||
this[NAME] = name;
|
this[NAME] = name;
|
||||||
this[VERSION] = version;
|
this[VERSION] = version;
|
||||||
@@ -811,39 +894,49 @@
|
|||||||
};
|
};
|
||||||
var Engine = Browser;
|
var Engine = Browser;
|
||||||
var OS = Browser;
|
var OS = Browser;
|
||||||
|
*/
|
||||||
var UAParser = function (uastring, extensions) {
|
var UAParser = function (uastring, extensions) {
|
||||||
|
|
||||||
|
if (typeof uastring === 'object') {
|
||||||
|
extensions = uastring;
|
||||||
|
uastring = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(this instanceof UAParser)) {
|
if (!(this instanceof UAParser)) {
|
||||||
return new UAParser(uastring, extensions).getResult();
|
return new UAParser(uastring, extensions).getResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
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 browser = new Browser();
|
//var browser = new Browser();
|
||||||
var cpu = new CPU();
|
//var cpu = new CPU();
|
||||||
var device = new Device();
|
//var device = new Device();
|
||||||
var engine = new Engine();
|
//var engine = new Engine();
|
||||||
var os = new OS();
|
//var os = new OS();
|
||||||
|
|
||||||
this.getBrowser = function () {
|
this.getBrowser = function () {
|
||||||
|
var browser = { name: undefined, version: undefined };
|
||||||
mapper.rgx.call(browser, ua, rgxmap.browser);
|
mapper.rgx.call(browser, ua, rgxmap.browser);
|
||||||
browser.major = util.major(browser.version); // deprecated
|
browser.major = util.major(browser.version); // deprecated
|
||||||
return browser;
|
return browser;
|
||||||
};
|
};
|
||||||
this.getCPU = function () {
|
this.getCPU = function () {
|
||||||
|
var cpu = { architecture: undefined };
|
||||||
mapper.rgx.call(cpu, ua, rgxmap.cpu);
|
mapper.rgx.call(cpu, ua, rgxmap.cpu);
|
||||||
return cpu;
|
return cpu;
|
||||||
};
|
};
|
||||||
this.getDevice = function () {
|
this.getDevice = function () {
|
||||||
|
var device = { vendor: undefined, model: undefined, type: undefined };
|
||||||
mapper.rgx.call(device, ua, rgxmap.device);
|
mapper.rgx.call(device, ua, rgxmap.device);
|
||||||
return device;
|
return device;
|
||||||
};
|
};
|
||||||
this.getEngine = function () {
|
this.getEngine = function () {
|
||||||
|
var engine = { name: undefined, version: undefined };
|
||||||
mapper.rgx.call(engine, ua, rgxmap.engine);
|
mapper.rgx.call(engine, ua, rgxmap.engine);
|
||||||
return engine;
|
return engine;
|
||||||
};
|
};
|
||||||
this.getOS = function () {
|
this.getOS = function () {
|
||||||
|
var os = { name: undefined, version: undefined };
|
||||||
mapper.rgx.call(os, ua, rgxmap.os);
|
mapper.rgx.call(os, ua, rgxmap.os);
|
||||||
return os;
|
return os;
|
||||||
};
|
};
|
||||||
@@ -862,11 +955,11 @@
|
|||||||
};
|
};
|
||||||
this.setUA = function (uastring) {
|
this.setUA = function (uastring) {
|
||||||
ua = uastring;
|
ua = uastring;
|
||||||
browser = new Browser();
|
//browser = new Browser();
|
||||||
cpu = new CPU();
|
//cpu = new CPU();
|
||||||
device = new Device();
|
//device = new Device();
|
||||||
engine = new Engine();
|
//engine = new Engine();
|
||||||
os = new OS();
|
//os = new OS();
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
return this;
|
return this;
|
||||||
@@ -913,6 +1006,33 @@
|
|||||||
if (typeof module !== UNDEF_TYPE && module.exports) {
|
if (typeof module !== UNDEF_TYPE && module.exports) {
|
||||||
exports = module.exports = UAParser;
|
exports = module.exports = UAParser;
|
||||||
}
|
}
|
||||||
|
// TODO: test!!!
|
||||||
|
if (require && require.main === module && process) {
|
||||||
|
// cli
|
||||||
|
var jsonize = function (arr) {
|
||||||
|
var res = [];
|
||||||
|
for (var i in arr) {
|
||||||
|
res.push(new UAParser(arr[i]).getResult());
|
||||||
|
}
|
||||||
|
process.stdout.write(JSON.stringify(res, null, 2) + '\n');
|
||||||
|
};
|
||||||
|
if (process.stdin.isTTY) {
|
||||||
|
// via args
|
||||||
|
jsonize(process.argv.slice(2));
|
||||||
|
} else {
|
||||||
|
// via pipe
|
||||||
|
var str = '';
|
||||||
|
process.stdin.on('readable', function() {
|
||||||
|
var read = process.stdin.read();
|
||||||
|
if (read !== null) {
|
||||||
|
str += read;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
process.stdin.on('end', function () {
|
||||||
|
jsonize(str.replace(/\n$/, '').split('\n'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
exports.UAParser = UAParser;
|
exports.UAParser = UAParser;
|
||||||
} else {
|
} else {
|
||||||
// requirejs env (optional)
|
// requirejs env (optional)
|
||||||
@@ -920,7 +1040,7 @@
|
|||||||
define(function () {
|
define(function () {
|
||||||
return UAParser;
|
return UAParser;
|
||||||
});
|
});
|
||||||
} else {
|
} else if (window) {
|
||||||
// browser env
|
// browser env
|
||||||
window.UAParser = UAParser;
|
window.UAParser = UAParser;
|
||||||
}
|
}
|
||||||
@@ -931,7 +1051,7 @@
|
|||||||
// In AMD env the global scope should be kept clean, but jQuery is an exception.
|
// In AMD env the global scope should be kept clean, but jQuery is an exception.
|
||||||
// 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.jQuery || window.Zepto;
|
var $ = window && (window.jQuery || window.Zepto);
|
||||||
if (typeof $ !== UNDEF_TYPE) {
|
if (typeof $ !== UNDEF_TYPE) {
|
||||||
var parser = new UAParser();
|
var parser = new UAParser();
|
||||||
$.ua = parser.getResult();
|
$.ua = parser.getResult();
|
||||||
|
|||||||
@@ -1,14 +1,4 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"desc" : "Chrome Headless",
|
|
||||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "Chrome Headless",
|
|
||||||
"version" : "HeadlessChrome",
|
|
||||||
"major" : ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"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",
|
||||||
@@ -64,7 +54,7 @@
|
|||||||
"ua" : "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.0 Chrome/38.0.2125.102 Mobile Safari/537.36",
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.0 Chrome/38.0.2125.102 Mobile Safari/537.36",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Android Browser",
|
"name" : "Samsung Browser",
|
||||||
"version" : "3.0",
|
"version" : "3.0",
|
||||||
"major" : "3"
|
"major" : "3"
|
||||||
}
|
}
|
||||||
@@ -149,6 +139,26 @@
|
|||||||
"major" : "20"
|
"major" : "20"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Chrome Headless",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Chrome Headless",
|
||||||
|
"version" : "undefined",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Chrome Headless",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/60.0.3112.113 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Chrome Headless",
|
||||||
|
"version" : "60.0.3112.113",
|
||||||
|
"major" : "60"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Chrome WebView",
|
"desc" : "Chrome WebView",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36",
|
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36",
|
||||||
@@ -549,6 +559,16 @@
|
|||||||
"major" : "7"
|
"major" : "7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Oculus Browser",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 7.0; SM-G920I Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/3.4.9 SamsungBrowser/4.0 Chrome/57.0.2987.146 Mobile VR Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Oculus Browser",
|
||||||
|
"version" : "3.4.9",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "OmniWeb",
|
"desc" : "OmniWeb",
|
||||||
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.48",
|
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.48",
|
||||||
@@ -719,6 +739,16 @@
|
|||||||
"major" : "2"
|
"major" : "2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Samsung Browser",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG-SM-G925A Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Samsung Browser",
|
||||||
|
"version" : "4.0",
|
||||||
|
"major" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "SeaMonkey",
|
"desc" : "SeaMonkey",
|
||||||
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 SeaMonkey/2.0b1pre",
|
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 SeaMonkey/2.0b1pre",
|
||||||
@@ -779,6 +809,16 @@
|
|||||||
"major" : "1"
|
"major" : "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "UC Browser",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 UBrowser/5.6.12860.7 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "UCBrowser",
|
||||||
|
"version" : "5.6.12860.7",
|
||||||
|
"major" : "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "UC Browser",
|
"desc" : "UC Browser",
|
||||||
"ua" : "Mozilla/5.0 (Linux; U; Android 6.0.1; en-US; Lenovo P2a42 Build/MMB29M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.2.0.915 U3/0.8.0 Mobile Safari/534.30",
|
"ua" : "Mozilla/5.0 (Linux; U; Android 6.0.1; en-US; Lenovo P2a42 Build/MMB29M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.2.0.915 U3/0.8.0 Mobile Safari/534.30",
|
||||||
@@ -908,5 +948,35 @@
|
|||||||
"version" : "1.1",
|
"version" : "1.1",
|
||||||
"major" : "1"
|
"major" : "1"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "QQ on iOS",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A456 QQ/6.5.3.410 V1_IPH_SQ_6.5.3_1_APP_A Pixel/1080 Core/UIWebView NetType/WIFI Mem/26",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "QQ",
|
||||||
|
"version" : "6.5.3.410",
|
||||||
|
"major" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "QQ on Android",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0; PRO 6 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036824 Safari/537.36 V1_AND_SQ_6.5.8_422_YYB_D PA QQ/6.5.8.2910 NetType/WIFI WebP/0.3.0 Pixel/1080",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "QQ",
|
||||||
|
"version" : "6.5.8.2910",
|
||||||
|
"major" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "GSA on iOS",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) GSA/30.1.161623614 Mobile/14F89 Safari/602.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "GSA",
|
||||||
|
"version" : "30.1.161623614",
|
||||||
|
"major" : "30"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -485,6 +485,15 @@
|
|||||||
"version" : ""
|
"version" : ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iOS in App",
|
||||||
|
"ua" : "AppName/version CFNetwork/version Darwin/version",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "iOS with Chrome",
|
"desc" : "iOS with Chrome",
|
||||||
"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",
|
"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",
|
||||||
|
|||||||
30
test/test.js
30
test/test.js
@@ -65,13 +65,35 @@ for (var i in methods) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe('Returns', function () {
|
||||||
|
it('getResult() should returns JSON', function(done) {
|
||||||
|
assert.deepEqual(new UAParser('').getResult(),
|
||||||
|
{
|
||||||
|
ua : '',
|
||||||
|
browser: { name: undefined, version: undefined, major: undefined },
|
||||||
|
cpu: { architecture: undefined },
|
||||||
|
device: { vendor: undefined, model: undefined, type: undefined },
|
||||||
|
engine: { name: undefined, version: undefined},
|
||||||
|
os: { name: undefined, version: undefined }
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('Extending Regex', function () {
|
describe('Extending Regex', function () {
|
||||||
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||||||
var myOwnBrowser = [[/(myownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
|
var myOwnBrowser = [[/(myownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
|
||||||
var parser = new UAParser(uaString, {browser: myOwnBrowser});
|
|
||||||
assert.equal(parser.getBrowser().name, 'MyOwnBrowser');
|
var parser1 = new UAParser(uaString, {browser: myOwnBrowser});
|
||||||
assert.equal(parser.getBrowser().version, '1.3');
|
assert.equal(parser1.getBrowser().name, 'MyOwnBrowser');
|
||||||
assert.equal(parser.getBrowser().major, '1');
|
assert.equal(parser1.getBrowser().version, '1.3');
|
||||||
|
assert.equal(parser1.getBrowser().major, '1');
|
||||||
|
|
||||||
|
var parser2 = new UAParser({browser: myOwnBrowser});
|
||||||
|
assert.equal(parser2.getBrowser().name, undefined);
|
||||||
|
parser2.setUA(uaString);
|
||||||
|
assert.equal(parser2.getBrowser().name, 'MyOwnBrowser');
|
||||||
|
assert.equal(parser1.getBrowser().version, '1.3');
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Using Require.js', function () {
|
describe('Using Require.js', function () {
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "UAParser.js",
|
|
||||||
"name": "ua-parser-js",
|
|
||||||
"version": "0.7.13",
|
|
||||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
|
||||||
"keywords": [
|
|
||||||
"user-agent",
|
|
||||||
"parser",
|
|
||||||
"browser",
|
|
||||||
"engine",
|
|
||||||
"os",
|
|
||||||
"device",
|
|
||||||
"cpu"
|
|
||||||
],
|
|
||||||
"homepage": "https://faisalman.github.com/ua-parser-js",
|
|
||||||
"author": {
|
|
||||||
"name": "Faisal Salman",
|
|
||||||
"email": "fyzlman@gmail.com"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"jquery": ">=1.5"
|
|
||||||
},
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "MIT",
|
|
||||||
"url": "http://www.opensource.org/licenses/mit-license.php"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"bugs": "https://github.com/faisalman/ua-parser-js/issues",
|
|
||||||
"docs": "https://github.com/faisalman/ua-parser-js",
|
|
||||||
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js"
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user