mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-21 01:26:40 +03:00
Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ae3098778 | ||
|
|
806c2b8030 | ||
|
|
cb1a64b509 | ||
|
|
b49cfae4e2 | ||
|
|
91b046462c | ||
|
|
69509af6dd | ||
|
|
225f703b67 | ||
|
|
7f217753f5 | ||
|
|
10f9fb35ca | ||
|
|
5ae468a3d3 | ||
|
|
fd46c4d2be | ||
|
|
297c6538bc | ||
|
|
f9f9fa79e1 | ||
|
|
07fe58b793 | ||
|
|
3a4626b5e8 | ||
|
|
3fd01f07ea | ||
|
|
d103dd5450 | ||
|
|
6cc6742f5e | ||
|
|
cf977c50ed | ||
|
|
4c15b10730 | ||
|
|
a3c7619d3a | ||
|
|
82aba654f9 | ||
|
|
2f1b14906f | ||
|
|
a3a09d33bc | ||
|
|
946ba02c54 | ||
|
|
d2d570fcd5 | ||
|
|
18e08428f4 | ||
|
|
552915907e | ||
|
|
6984de7927 | ||
|
|
7a68f35574 | ||
|
|
2bc75f10bc | ||
|
|
2610f37a8b | ||
|
|
a25bb8b1a6 | ||
|
|
ee2db31f8c | ||
|
|
89775a8ae7 | ||
|
|
7d826ed62e | ||
|
|
a6316f02b0 | ||
|
|
72a11e24b2 | ||
|
|
f7ca724f3b | ||
|
|
8d826fcc24 | ||
|
|
951106c425 | ||
|
|
83ca52bb28 | ||
|
|
6fb4941458 | ||
|
|
48ab3b372c | ||
|
|
38c409e8d9 | ||
|
|
4e2cbdfd16 | ||
|
|
fbe8a0e3a6 | ||
|
|
8e9c400ec5 | ||
|
|
b89fa098aa | ||
|
|
f3882f1882 | ||
|
|
a25426840c | ||
|
|
985a7b18e0 | ||
|
|
8e09cd49e3 | ||
|
|
4768992762 | ||
|
|
f89e08f2c0 | ||
|
|
fe568ffe96 | ||
|
|
252db2534e | ||
|
|
6555bf6e81 | ||
|
|
740fc93b4b | ||
|
|
eed646f9ce | ||
|
|
764de40fe0 | ||
|
|
49609c0990 | ||
|
|
ef69224d7c | ||
|
|
caa2f47c06 | ||
|
|
5177c460a5 | ||
|
|
3e2d5c1817 | ||
|
|
29a0372611 | ||
|
|
2aa2f77881 | ||
|
|
1e228b2fbe | ||
|
|
5379ec8513 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.12",
|
"version": "0.7.14",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Faisal Salman <fyzlman@gmail.com>"
|
"Faisal Salman <fyzlman@gmail.com>"
|
||||||
],
|
],
|
||||||
|
|||||||
5
dist/ua-parser.min.js
vendored
5
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
5
dist/ua-parser.pack.js
vendored
5
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.12',
|
version: '0.7.14',
|
||||||
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'
|
||||||
|
|||||||
64
package.json
64
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.12",
|
"version": "0.7.14",
|
||||||
"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,46 +11,81 @@
|
|||||||
"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": [
|
||||||
"Faisal Salman <fyzlman@gmail.com>",
|
"Aamir Poonawalla <aamir@urx.com>",
|
||||||
|
"Admas <mollases@users.noreply.github.com>",
|
||||||
|
"algenon <m@antonz.ru>",
|
||||||
|
"Andrea Vaghi <andrea.vaghi@jobrapido.com>",
|
||||||
|
"Anton Zhiyanov <m@antonz.ru>",
|
||||||
|
"Austin Pray <austin@austinpray.com>",
|
||||||
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
||||||
|
"boneyao <admin@boneyao.com>",
|
||||||
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
|
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
|
||||||
|
"CESAR RAMOS <c@imagenproactiva.com>",
|
||||||
"Christopher De Cairos <chris.decairos@gmail.com>",
|
"Christopher De Cairos <chris.decairos@gmail.com>",
|
||||||
"Davit Barbakadze <jayarjo@gmail.com>",
|
"Davit Barbakadze <jayarjo@gmail.com>",
|
||||||
|
"ddivernois <david-emmanuel.divernois@amadeus.com>",
|
||||||
|
"Demis Palma <demis.palma@gmail.com>",
|
||||||
"Dmitry Tyschenko <dtyschenko@gmail.com>",
|
"Dmitry Tyschenko <dtyschenko@gmail.com>",
|
||||||
"Douglas Li <doug@knotch.it>",
|
"Douglas Li <doug@knotch.it>",
|
||||||
"Dumitru Uzun <contact@duzun.me>",
|
"Dumitru Uzun <contact@duzun.me>",
|
||||||
"Erik Hesselink <hesselink@gmail.com>",
|
"Erik Hesselink <hesselink@gmail.com>",
|
||||||
"Fabian Becker <halfdan@xnorfz.de>",
|
"Fabian Becker <halfdan@xnorfz.de>",
|
||||||
|
"Faisal Salman <fyzlman@gmail.com>",
|
||||||
|
"Frédéric Camblor <fcamblor@gmail.com>",
|
||||||
|
"Grigory Dmitrenko <grigory@snsk.ru>",
|
||||||
"Hendrik Helwich <h.helwich@iplabs.de>",
|
"Hendrik Helwich <h.helwich@iplabs.de>",
|
||||||
"Jackpoll <jackpoll123456@gmail.com>",
|
"jackpoll <jackpoll123456@gmail.com>",
|
||||||
"Jake Mc <startswithaj@users.noreply.github.com>",
|
"Jake Mc <startswithaj@users.noreply.github.com>",
|
||||||
"John Tantalo <john.tantalo@gmail.com>",
|
"John Tantalo <john.tantalo@gmail.com>",
|
||||||
"John Yanarella <jmy@codecatalyst.com>",
|
"John Yanarella <jmy@codecatalyst.com>",
|
||||||
"Jon Buckley <jon@jbuckley.ca>",
|
"Jon Buckley <jon@jbuckley.ca>",
|
||||||
"Kendall Buchanan <kendall@kendagriff.com>",
|
"Kendall Buchanan <kendall@kendagriff.com>",
|
||||||
"Lee Treveil <leetreveil@gmail.com>",
|
"Lee Treveil <leetreveil@gmail.com>",
|
||||||
"Leonardo <leofiore@libero.it>",
|
"leonardo <leofiore@libero.it>",
|
||||||
|
"Levente Balogh <noreply@github.com>",
|
||||||
|
"Liam Quinn <lquinn@blackberry.com>",
|
||||||
|
"Lithin <lithin@webklipper.com>",
|
||||||
|
"Lukas Eipert <leipert@users.noreply.github.com>",
|
||||||
|
"Malash <i@malash.me>",
|
||||||
|
"Martynas <noreply@github.com>",
|
||||||
|
"Maximilian Haupt <mail@maximilianhaupt.com>",
|
||||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
||||||
"Michael Hess <mhess@connectify.me>",
|
"Michael Hess <mhess@connectify.me>",
|
||||||
"OtakuSiD <otakusid@gmail.com>",
|
"naoh <noreply@github.com>",
|
||||||
|
"Nik Rolls <nik@rolls.cc>",
|
||||||
|
"niris <nirisix@gmail.com>",
|
||||||
|
"otakuSiD <otakusid@gmail.com>",
|
||||||
|
"Peter Dave Hello <PeterDaveHello@users.noreply.github.com>",
|
||||||
|
"philippsimon <github@philippsimon.de>",
|
||||||
|
"Pieter Hendrickx <pieter.hendrickx@belfius.be>",
|
||||||
|
"Robert Tod <robert@qubit.com>",
|
||||||
"Ross Noble <rosshnoble@gmail.com>",
|
"Ross Noble <rosshnoble@gmail.com>",
|
||||||
"Sandro Sonntag <sandro.sonntag@adorsys.de>"
|
"Sandro Sonntag <sandro.sonntag@adorsys.de>",
|
||||||
|
"sgautrea <shanegautreau@gmail.com>",
|
||||||
|
"Shane Gautreau <sgautrea@opentext.com>",
|
||||||
|
"Shane Thacker <shane@steadymade.com>",
|
||||||
|
"Simon Eisenmann <simon@longsleep.org>",
|
||||||
|
"Simon Lang <me@simonlang.org>",
|
||||||
|
"Sylvain Gizard <sylvain.gizard@gmail.com>",
|
||||||
|
"szchenghuang <szchenghuang@gmail.com>",
|
||||||
|
"Vadim Kurachevsky <vadim@hmvs.org>",
|
||||||
|
"Yun Young-jin <yupmin@yupmin-office-macmini.local>"
|
||||||
],
|
],
|
||||||
"main": "src/ua-parser.js",
|
"main": "src/ua-parser.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "uglifyjs src/ua-parser.js > dist/ua-parser.min.js --comments '/UAParser\\.js/' && uglifyjs src/ua-parser.js > dist/ua-parser.pack.js --comments '/UAParser\\.js/' --compress --mangle",
|
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/UAParser\\.js/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/UAParser\\.js/' --compress --mangle",
|
||||||
"test": "jshint src/ua-parser.js && mocha -R nyan test/test.js",
|
"test": "jshint src/ua-parser.js && mocha -R nyan test/test.js",
|
||||||
"verup": "node ./node_modules/verup",
|
"verup": "node ./node_modules/verup",
|
||||||
"version": "node ./node_modules/verup 0"
|
"version": "node ./node_modules/verup 0"
|
||||||
},
|
},
|
||||||
"verup": {
|
"verup": {
|
||||||
"files": [
|
"files": [
|
||||||
"ua-parser-js.jquery.json",
|
|
||||||
"component.json",
|
|
||||||
"bower.json",
|
"bower.json",
|
||||||
"package.js",
|
"package.js",
|
||||||
"src/ua-parser.js"
|
"src/ua-parser.js"
|
||||||
@@ -64,7 +99,7 @@
|
|||||||
"jshint": "~1.1.0",
|
"jshint": "~1.1.0",
|
||||||
"mocha": "~1.8.0",
|
"mocha": "~1.8.0",
|
||||||
"requirejs": "^2.3.2",
|
"requirejs": "^2.3.2",
|
||||||
"uglify-js": "~1.3.4",
|
"uglify-js": "~2.7.5",
|
||||||
"verup": "^1.3.x"
|
"verup": "^1.3.x"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -79,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"
|
||||||
}
|
}
|
||||||
|
|||||||
66
readme.md
66
readme.md
@@ -1,18 +1,26 @@
|
|||||||
# UAParser.js
|
# UAParser.js
|
||||||
|
|
||||||
<img align="right" src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/logo.png"> A not-so-lightweight-anymore JavaScript-based User-Agent string parser. Can be used either in browser (client-side) or in node.js (server-side) environment. Also available as jQuery/Zepto plugin, Bower/Meteor package, & RequireJS/AMD module. This library aims to identify detailed type of web browser, layout engine, operating system, cpu architecture, and device type/model, entirely from user-agent string with a relatively small footprint (~11KB when minified / ~4KB gzipped). Written in vanilla JavaScript, which means it doesn't require any other library and can be used independently.
|
<img align="right" src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/logo.png"> A JavaScript-based User-Agent string parser. Can be used either in browser (client-side) or in node.js (server-side) environment. Also available as jQuery/Zepto plugin, Bower/Meteor package, & RequireJS/AMD module. This library aims to identify detailed type of web browser, layout engine, operating system, cpu architecture, and device type/model, entirely from user-agent string with a relatively small footprint (~11KB when minified / ~4KB gzipped). Written in vanilla JavaScript, which means it doesn't require any other library and can be used independently. However, it's not recommended to use this library as browser detection since the result may not accurate than using feature detection.
|
||||||
|
|
||||||
[](https://travis-ci.org/faisalman/ua-parser-js)
|
[](https://travis-ci.org/faisalman/ua-parser-js)
|
||||||
|
[](https://www.npmjs.com/package/ua-parser-js)
|
||||||
[](https://www.npmjs.com/package/ua-parser-js)
|
[](https://www.npmjs.com/package/ua-parser-js)
|
||||||
[](https://bower.io/)
|
[](https://bower.io/)
|
||||||
[](https://cdnjs.com/libraries/UAParser.js)
|
[](https://cdnjs.com/libraries/UAParser.js)
|
||||||
[](https://gratipay.com/UAParser.js)
|
[](https://gratipay.com/UAParser.js)
|
||||||
[](http://flattr.com/thing/3867907/faisalmanua-parser-js-on-GitHub)
|
[](http://flattr.com/thing/3867907/faisalmanua-parser-js-on-GitHub)
|
||||||
|
|
||||||
* Author : Faisal Salman <<fyzlman@gmail.com>>
|
* Author : Faisal Salman <<f@faisalman.com>>
|
||||||
* Demo : http://faisalman.github.io/ua-parser-js
|
* Demo : http://faisalman.github.io/ua-parser-js
|
||||||
* Source : https://github.com/faisalman/ua-parser-js
|
* Source : https://github.com/faisalman/ua-parser-js
|
||||||
|
|
||||||
|
# Constructor
|
||||||
|
|
||||||
|
* `new UAParser([uastring][,extensions])`
|
||||||
|
* returns new instance
|
||||||
|
|
||||||
|
* `UAParser([uastring][,extensions])`
|
||||||
|
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
||||||
|
|
||||||
# Methods
|
# Methods
|
||||||
|
|
||||||
@@ -21,14 +29,14 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
# Possible 'browser.name':
|
# Possible 'browser.name':
|
||||||
Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,
|
Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Bowser, Camino, Chimera,
|
||||||
Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,
|
Chrome [WebView], Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge,
|
||||||
Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,
|
Epiphany, Fennec, Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe,
|
||||||
Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,
|
IceCat, IceDragon, Iceweasel, IE[Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle,
|
||||||
Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,
|
Links, Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,
|
||||||
Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],
|
Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],
|
||||||
PhantomJS, Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser,
|
PhantomJS, Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, Sleipnir,
|
||||||
Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, WeChat, Yandex
|
SlimBrowser, Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, WeChat, Yandex
|
||||||
|
|
||||||
# 'browser.version' determined dynamically
|
# 'browser.version' determined dynamically
|
||||||
```
|
```
|
||||||
@@ -43,8 +51,8 @@ console, mobile, tablet, smarttv, wearable, embedded
|
|||||||
# Possible 'device.vendor':
|
# Possible 'device.vendor':
|
||||||
Acer, Alcatel, Amazon, Apple, Archos, Asus, BenQ, BlackBerry, Dell, GeeksPhone,
|
Acer, Alcatel, Amazon, Apple, Archos, Asus, BenQ, BlackBerry, Dell, GeeksPhone,
|
||||||
Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu, Microsoft, Motorola, Nexian,
|
Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu, Microsoft, Motorola, Nexian,
|
||||||
Nintendo, Nokia, Nvidia, Ouya, Palm, Panasonic, Polytron, RIM, Samsung, Sharp,
|
Nintendo, Nokia, Nvidia, OnePlus, Ouya, Palm, Panasonic, Pebble, Polytron, RIM,
|
||||||
Siemens, Sony-Ericsson, Sprint, Xbox, ZTE
|
Samsung, Sharp, Siemens, Sony[Ericsson], Sprint, Xbox, Xiaomi, ZTE
|
||||||
|
|
||||||
# 'device.model' determined dynamically
|
# 'device.model' determined dynamically
|
||||||
```
|
```
|
||||||
@@ -68,7 +76,7 @@ Tasman, Trident, w3m, WebKit
|
|||||||
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, Contiki,
|
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, Contiki,
|
||||||
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,
|
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,
|
||||||
Joli, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD,
|
Joli, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD,
|
||||||
Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,
|
Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PC-BSD, PCLinuxOS, Plan9, Playstation, QNX, RedHat,
|
||||||
RIM Tablet OS, RISC OS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,
|
RIM Tablet OS, RISC OS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,
|
||||||
Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
|
Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
|
||||||
|
|
||||||
@@ -80,8 +88,7 @@ Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
|
|||||||
|
|
||||||
```
|
```
|
||||||
# Possible 'cpu.architecture'
|
# Possible 'cpu.architecture'
|
||||||
68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc,
|
68k, amd64, arm[64], avr, ia[32/64], irix[64], mips[64], pa-risc, ppc, sparc[64]
|
||||||
ppc, sparc, sparc64
|
|
||||||
```
|
```
|
||||||
|
|
||||||
* `getResult()`
|
* `getResult()`
|
||||||
@@ -91,7 +98,8 @@ ppc, sparc, sparc64
|
|||||||
* returns UA string of current instance
|
* returns UA string of current instance
|
||||||
|
|
||||||
* `setUA(uastring)`
|
* `setUA(uastring)`
|
||||||
* set & parse UA string
|
* set UA string to parse
|
||||||
|
* returns current instance
|
||||||
|
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
@@ -237,20 +245,24 @@ console.log($.ua.browser.name); // "Safari"
|
|||||||
console.log($.ua.engine.name); // "Webkit"
|
console.log($.ua.engine.name); // "Webkit"
|
||||||
console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"}
|
console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"}
|
||||||
console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
|
console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
|
||||||
|
|
||||||
|
// Add class to <body> tag
|
||||||
|
// <body class="ua-browser-safari ua-devicetype-tablet">
|
||||||
|
$('body').addClass('ua-browser-' + $.ua.browser.name + ' ua-devicetype-' + $.ua.device.type);
|
||||||
```
|
```
|
||||||
|
|
||||||
## 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 = '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"}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -261,15 +273,10 @@ console.log(parser.getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
|
|||||||
* Fork and clone this repository
|
* Fork and clone this repository
|
||||||
* Make some changes as required
|
* Make some changes as required
|
||||||
* Write a unit test to showcase your feature
|
* Write a unit test to showcase your feature
|
||||||
* Run the test suites to make sure the changes you made didn't break anything
|
* Run the test suites to make sure the changes you made didn't break anything `$ npm run test`
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm run test
|
|
||||||
```
|
|
||||||
|
|
||||||
* Commit and push to your own repository
|
* Commit and push to your own repository
|
||||||
* Submit a pull request to this repository under `develop` branch
|
* Submit a pull request to this repository under `develop` branch
|
||||||
* Profit?
|
* Profit? $$$
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
@@ -280,6 +287,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
|
||||||
|
|||||||
272
src/ua-parser.js
272
src/ua-parser.js
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* UAParser.js v0.7.12
|
* UAParser.js v0.7.14
|
||||||
* 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.12',
|
var LIBVERSION = '0.7.14',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@@ -81,35 +81,29 @@
|
|||||||
|
|
||||||
var mapper = {
|
var mapper = {
|
||||||
|
|
||||||
rgx : function () {
|
rgx : function (ua, arrays) {
|
||||||
|
|
||||||
var result, i = 0, j, k, p, q, matches, match, args = arguments;
|
//var result = {},
|
||||||
|
var i = 0, j, k, p, q, matches, match;//, args = arguments;
|
||||||
|
|
||||||
|
/*// construct object barebones
|
||||||
|
for (p = 0; p < args[1].length; p++) {
|
||||||
|
q = args[1][p];
|
||||||
|
result[typeof q === OBJ_TYPE ? q[0] : q] = undefined;
|
||||||
|
}*/
|
||||||
|
|
||||||
// loop through all regexes maps
|
// loop through all regexes maps
|
||||||
while (i < args.length && !matches) {
|
while (i < arrays.length && !matches) {
|
||||||
|
|
||||||
var regex = args[i], // even sequence (0,2,4,..)
|
var regex = arrays[i], // even sequence (0,2,4,..)
|
||||||
props = args[i + 1]; // odd sequence (1,3,5,..)
|
props = arrays[i + 1]; // odd sequence (1,3,5,..)
|
||||||
|
j = k = 0;
|
||||||
// construct object barebones
|
|
||||||
if (typeof result === UNDEF_TYPE) {
|
|
||||||
result = {};
|
|
||||||
for (p in props) {
|
|
||||||
if (props.hasOwnProperty(p)){
|
|
||||||
q = props[p];
|
|
||||||
if (typeof q === OBJ_TYPE) {
|
|
||||||
result[q[0]] = undefined;
|
|
||||||
} else {
|
|
||||||
result[q] = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// try matching uastring with regexes
|
// try matching uastring with regexes
|
||||||
j = k = 0;
|
|
||||||
while (j < regex.length && !matches) {
|
while (j < regex.length && !matches) {
|
||||||
matches = regex[j++].exec(this.getUA());
|
|
||||||
|
matches = regex[j++].exec(ua);
|
||||||
|
|
||||||
if (!!matches) {
|
if (!!matches) {
|
||||||
for (p = 0; p < props.length; p++) {
|
for (p = 0; p < props.length; p++) {
|
||||||
match = matches[++k];
|
match = matches[++k];
|
||||||
@@ -119,32 +113,33 @@
|
|||||||
if (q.length == 2) {
|
if (q.length == 2) {
|
||||||
if (typeof q[1] == FUNC_TYPE) {
|
if (typeof q[1] == FUNC_TYPE) {
|
||||||
// assign modified match
|
// assign modified match
|
||||||
result[q[0]] = q[1].call(this, match);
|
this[q[0]] = q[1].call(this, match);
|
||||||
} else {
|
} else {
|
||||||
// assign given value, ignore regex match
|
// assign given value, ignore regex match
|
||||||
result[q[0]] = q[1];
|
this[q[0]] = q[1];
|
||||||
}
|
}
|
||||||
} else if (q.length == 3) {
|
} else if (q.length == 3) {
|
||||||
// check whether function or regex
|
// check whether function or regex
|
||||||
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
|
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
|
||||||
// call function (usually string mapper)
|
// call function (usually string mapper)
|
||||||
result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
|
this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
|
||||||
} else {
|
} else {
|
||||||
// sanitize match using given regex
|
// sanitize match using given regex
|
||||||
result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
|
this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
|
||||||
}
|
}
|
||||||
} else if (q.length == 4) {
|
} else if (q.length == 4) {
|
||||||
result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
|
this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result[q] = match ? match : undefined;
|
this[q] = match ? match : undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
return result;
|
//console.log(this);
|
||||||
|
//return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
str : function (str, map) {
|
str : function (str, map) {
|
||||||
@@ -259,8 +254,8 @@
|
|||||||
|
|
||||||
// Webkit/KHTML based
|
// Webkit/KHTML based
|
||||||
/(rekonq)\/([\w\.]+)*/i, // Rekonq
|
/(rekonq)\/([\w\.]+)*/i, // Rekonq
|
||||||
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i
|
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser)\/([\w\.-]+)/i
|
||||||
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS
|
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
|
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
|
||||||
@@ -272,42 +267,55 @@
|
|||||||
/(yabrowser)\/([\w\.]+)/i // Yandex
|
/(yabrowser)\/([\w\.]+)/i // Yandex
|
||||||
], [[NAME, 'Yandex'], VERSION], [
|
], [[NAME, 'Yandex'], VERSION], [
|
||||||
|
|
||||||
|
/(puffin)\/([\w\.]+)/i // Puffin
|
||||||
|
], [[NAME, 'Puffin'], VERSION], [
|
||||||
|
|
||||||
|
/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
|
||||||
|
// UCBrowser
|
||||||
|
], [[NAME, 'UCBrowser'], VERSION], [
|
||||||
|
|
||||||
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
||||||
], [[NAME, /_/g, ' '], VERSION], [
|
], [[NAME, /_/g, ' '], VERSION], [
|
||||||
|
|
||||||
/(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
|
||||||
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
||||||
], [VERSION, [NAME, 'MIUI Browser']], [
|
], [VERSION, [NAME, 'MIUI Browser']], [
|
||||||
|
|
||||||
|
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
|
||||||
|
], [VERSION, [NAME, 'Facebook']], [
|
||||||
|
|
||||||
|
/(headlesschrome) ([\w\.]+)/i // 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']], [
|
||||||
|
|
||||||
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
|
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
|
||||||
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
||||||
/(qqbrowser)[\/\s]?([\w\.]+)/i
|
|
||||||
// QQBrowser
|
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/(uc\s?browser)[\/\s]?([\w\.]+)/i,
|
|
||||||
/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
|
|
||||||
/juc.+(ucweb)[\/\s]?([\w\.]+)/i
|
|
||||||
// UCBrowser
|
|
||||||
], [[NAME, 'UCBrowser'], VERSION], [
|
|
||||||
|
|
||||||
/(dolfin)\/([\w\.]+)/i // Dolphin
|
/(dolfin)\/([\w\.]+)/i // Dolphin
|
||||||
], [[NAME, 'Dolphin'], VERSION], [
|
], [[NAME, 'Dolphin'], VERSION], [
|
||||||
|
|
||||||
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
||||||
], [[NAME, 'Chrome'], VERSION], [
|
], [[NAME, 'Chrome'], VERSION], [
|
||||||
|
|
||||||
/;fbav\/([\w\.]+);/i // Facebook App for iOS
|
/(coast)\/([\w\.]+)/i // Opera Coast
|
||||||
], [VERSION, [NAME, 'Facebook']], [
|
], [[NAME, 'Opera Coast'], VERSION], [
|
||||||
|
|
||||||
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
||||||
], [VERSION, [NAME, 'Firefox']], [
|
], [VERSION, [NAME, 'Firefox']], [
|
||||||
@@ -512,8 +520,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]], [
|
||||||
@@ -526,8 +534,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
|
||||||
@@ -547,14 +555,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
|
||||||
@@ -603,12 +612,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
|
||||||
@@ -620,20 +632,103 @@
|
|||||||
/((pebble))app\/[\d\.]+\s/i // Pebble
|
/((pebble))app\/[\d\.]+\s/i // Pebble
|
||||||
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
||||||
|
|
||||||
|
/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
|
||||||
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/crkey/i // Google Chromecast
|
||||||
|
], [[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]], [
|
||||||
|
|
||||||
|
/android.+;\s(pixel c)\s/i // Google Pixel C
|
||||||
|
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/android.+;\s(pixel xl|pixel)\s/i // Google Pixel
|
||||||
|
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/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
|
||||||
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/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
|
||||||
|
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
|
/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
|
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
||||||
], [[TYPE, util.lowerize], VENDOR, MODEL]
|
], [[TYPE, util.lowerize], VENDOR, MODEL], [
|
||||||
|
|
||||||
|
/(android.+)[;\/].+build/i // Generic Android Device
|
||||||
|
], [MODEL, [VENDOR, 'Generic']]
|
||||||
|
|
||||||
|
|
||||||
/*//////////////////////////
|
/*//////////////////////////
|
||||||
// TODO: move to string map
|
// TODO: move to string map
|
||||||
@@ -659,17 +754,6 @@
|
|||||||
/(SM-T311)/i // Samsung Galaxy Tab 3 8.0
|
/(SM-T311)/i // Samsung Galaxy Tab 3 8.0
|
||||||
], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/(R1001)/i // Oppo R1001
|
|
||||||
], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
|
|
||||||
/(X9006)/i // Oppo Find 7a
|
|
||||||
], [[MODEL, 'Find 7a'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
|
||||||
/(R2001)/i // Oppo YOYO R2001
|
|
||||||
], [[MODEL, 'Yoyo R2001'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
|
||||||
/(R815)/i // Oppo Clover R815
|
|
||||||
], [[MODEL, 'Clover R815'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
|
||||||
/(U707)/i // Oppo Find Way S
|
|
||||||
], [[MODEL, 'Find Way S'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
|
||||||
|
|
||||||
/(T3C)/i // Advan Vandroid T3C
|
/(T3C)/i // Advan Vandroid T3C
|
||||||
], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
|
||||||
/(ADVAN T1J\+)/i // Advan Vandroid T1J+
|
/(ADVAN T1J\+)/i // Advan Vandroid T1J+
|
||||||
@@ -768,8 +852,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
|
||||||
@@ -790,32 +875,60 @@
|
|||||||
// Constructor
|
// Constructor
|
||||||
////////////////
|
////////////////
|
||||||
|
|
||||||
|
var Browser = function (name, version) {
|
||||||
|
this[NAME] = name;
|
||||||
|
this[VERSION] = version;
|
||||||
|
};
|
||||||
|
var CPU = function (arch) {
|
||||||
|
this[ARCHITECTURE] = arch;
|
||||||
|
};
|
||||||
|
var Device = function (vendor, model, type) {
|
||||||
|
this[VENDOR] = vendor;
|
||||||
|
this[MODEL] = model;
|
||||||
|
this[TYPE] = type;
|
||||||
|
};
|
||||||
|
var Engine = 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 cpu = new CPU();
|
||||||
|
var device = new Device();
|
||||||
|
var engine = new Engine();
|
||||||
|
var os = new OS();
|
||||||
|
|
||||||
this.getBrowser = function () {
|
this.getBrowser = function () {
|
||||||
var browser = mapper.rgx.apply(this, rgxmap.browser);
|
mapper.rgx.call(browser, ua, rgxmap.browser);
|
||||||
browser.major = util.major(browser.version);
|
browser.major = util.major(browser.version); // deprecated
|
||||||
return browser;
|
return browser;
|
||||||
};
|
};
|
||||||
this.getCPU = function () {
|
this.getCPU = function () {
|
||||||
return mapper.rgx.apply(this, rgxmap.cpu);
|
mapper.rgx.call(cpu, ua, rgxmap.cpu);
|
||||||
|
return cpu;
|
||||||
};
|
};
|
||||||
this.getDevice = function () {
|
this.getDevice = function () {
|
||||||
return mapper.rgx.apply(this, rgxmap.device);
|
mapper.rgx.call(device, ua, rgxmap.device);
|
||||||
|
return device;
|
||||||
};
|
};
|
||||||
this.getEngine = function () {
|
this.getEngine = function () {
|
||||||
return mapper.rgx.apply(this, rgxmap.engine);
|
mapper.rgx.call(engine, ua, rgxmap.engine);
|
||||||
|
return engine;
|
||||||
};
|
};
|
||||||
this.getOS = function () {
|
this.getOS = function () {
|
||||||
return mapper.rgx.apply(this, rgxmap.os);
|
mapper.rgx.call(os, ua, rgxmap.os);
|
||||||
|
return os;
|
||||||
};
|
};
|
||||||
this.getResult = function () {
|
this.getResult = function () {
|
||||||
return {
|
return {
|
||||||
@@ -832,6 +945,11 @@
|
|||||||
};
|
};
|
||||||
this.setUA = function (uastring) {
|
this.setUA = function (uastring) {
|
||||||
ua = uastring;
|
ua = uastring;
|
||||||
|
browser = new Browser();
|
||||||
|
cpu = new CPU();
|
||||||
|
device = new Device();
|
||||||
|
engine = new Engine();
|
||||||
|
os = new OS();
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
return this;
|
return this;
|
||||||
@@ -865,7 +983,7 @@
|
|||||||
NAME : NAME,
|
NAME : NAME,
|
||||||
VERSION : VERSION
|
VERSION : VERSION
|
||||||
};
|
};
|
||||||
|
//UAParser.Utils = util;
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
// Export
|
// Export
|
||||||
@@ -885,7 +1003,7 @@
|
|||||||
define(function () {
|
define(function () {
|
||||||
return UAParser;
|
return UAParser;
|
||||||
});
|
});
|
||||||
} else {
|
} else if (window) {
|
||||||
// browser env
|
// browser env
|
||||||
window.UAParser = UAParser;
|
window.UAParser = UAParser;
|
||||||
}
|
}
|
||||||
@@ -896,7 +1014,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,4 +1,14 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"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",
|
||||||
@@ -54,7 +64,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"
|
||||||
}
|
}
|
||||||
@@ -99,6 +109,16 @@
|
|||||||
"major" : "0"
|
"major" : "0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Bowser",
|
||||||
|
"ua" : "Mozilla/5.0 (iOS; like Mac OS X) AppleWebKit/536.36 (KHTML, like Gecko) not Chrome/27.0.1500.95 Mobile/10B141 Safari/537.36 Bowser/0.2.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Bowser",
|
||||||
|
"version" : "0.2.1",
|
||||||
|
"major" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Camino",
|
"desc" : "Camino",
|
||||||
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en; rv:1.9.0.19) Gecko/2011091218 Camino/2.0.9 (like Firefox/3.0.19)",
|
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en; rv:1.9.0.19) Gecko/2011091218 Camino/2.0.9 (like Firefox/3.0.19)",
|
||||||
@@ -210,13 +230,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Facebook in-App Browser",
|
"desc" : "Facebook in-App Browser for Android",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/35.0.0.48.273;]",
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/35.0.0.48.273;]",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Chrome WebView",
|
"name" : "Facebook",
|
||||||
"version" : "43.0.2357.121",
|
"version" : "35.0.0.48.273",
|
||||||
"major" : "43"
|
"major" : "35"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Facebook in-App Browser for iOS",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 [FBAN/FBIOS;FBAV/91.0.0.41.73;FBBV/57050710;FBDV/iPhone8,1;FBMD/iPhone;FBSN/iOS;FBSV/10.3.1;FBSS/2;FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/0])",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Facebook",
|
||||||
|
"version" : "91.0.0.41.73",
|
||||||
|
"major" : "91"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -519,6 +549,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",
|
||||||
@@ -609,6 +649,16 @@
|
|||||||
"major" : "11"
|
"major" : "11"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Opera Coast",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X; en) AppleWebKit/601.1.46 (KHTML, like Gecko) Coast/5.04.110603 Mobile/13F69 Safari/7534.48.3",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Opera Coast",
|
||||||
|
"version" : "5.04.110603",
|
||||||
|
"major" : "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "PhantomJS",
|
"desc" : "PhantomJS",
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.2 Safari/534.34",
|
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.2 Safari/534.34",
|
||||||
@@ -639,6 +689,16 @@
|
|||||||
"major" : "6"
|
"major" : "6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "QQ",
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "QQBrowser",
|
||||||
|
"version" : "7.1",
|
||||||
|
"major" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "RockMelt",
|
"desc" : "RockMelt",
|
||||||
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.78 Chrome/7.0.517.44 Safari/534.7",
|
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.78 Chrome/7.0.517.44 Safari/534.7",
|
||||||
@@ -669,6 +729,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",
|
||||||
@@ -729,6 +799,26 @@
|
|||||||
"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",
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "UCBrowser",
|
||||||
|
"version" : "11.2.0.915",
|
||||||
|
"major" : "11"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "UC Browser on Samsung",
|
"desc" : "UC Browser on Samsung",
|
||||||
"ua" : "Mozilla/5.0 (Java; U; Pt-br; samsung-gt-s5620) UCBrowser8.2.1.144/69/352/UCWEB Mobile UNTRUSTED/1.0",
|
"ua" : "Mozilla/5.0 (Java; U; Pt-br; samsung-gt-s5620) UCBrowser8.2.1.144/69/352/UCWEB Mobile UNTRUSTED/1.0",
|
||||||
@@ -809,6 +899,16 @@
|
|||||||
"major" : "1"
|
"major" : "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Puffin",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Lenovo P2a42 Build/MMB29M; en-us) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Puffin/6.0.8.15804AP",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Puffin",
|
||||||
|
"version" : "6.0.8.15804AP",
|
||||||
|
"major" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Microsoft Edge",
|
"desc" : "Microsoft Edge",
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
|
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
|
||||||
@@ -838,5 +938,25 @@
|
|||||||
"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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -49,6 +49,16 @@
|
|||||||
"type" : "tablet"
|
"type" : "tablet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Huawei Honor",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; U8860 Build/HuaweiU8860) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Huawei",
|
||||||
|
"model" : "U8860",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Huawei Nexus 6P",
|
"desc" : "Huawei Nexus 6P",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC19V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537",
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC19V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537",
|
||||||
@@ -59,6 +69,26 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Huawei P10",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 7.0; VTR-L09 Build/HUAWEIVTR-L09; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Huawei",
|
||||||
|
"model" : "VTR-L09",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Huawei Y3II",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 5.1; xx-xx; HUAWEI LUA-L03 Build/HUAWEILUA-L03) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Huawei",
|
||||||
|
"model" : "LUA-L03",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "iPod",
|
"desc" : "iPod",
|
||||||
"ua" : "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
|
"ua" : "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
|
||||||
@@ -89,6 +119,16 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Meizu M5 Note",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0; M5 Note Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043024 Safari/537.36 MicroMessenger/6.5.7.1040 NetType/WIFI Language/zh_CN",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Meizu",
|
||||||
|
"model" : "M5 Note",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Microsoft Lumia 950",
|
"desc" : "Microsoft Lumia 950",
|
||||||
"ua" : "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
|
"ua" : "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
|
||||||
@@ -179,6 +219,16 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "OPPO",
|
||||||
|
"model" : "R7s",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Philips SmartTV",
|
"desc" : "Philips SmartTV",
|
||||||
"ua" : "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60",
|
"ua" : "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60",
|
||||||
@@ -209,6 +259,16 @@
|
|||||||
"type" : "tablet"
|
"type" : "tablet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Samsung SM-C5000",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; SM-C5000 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 wkbrowser 4.1.35 3065",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Samsung",
|
||||||
|
"model" : "SM-C5000",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Samsung SM-T231",
|
"desc" : "Samsung SM-T231",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T231 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T231 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
||||||
@@ -285,7 +345,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"vendor" : "Sony",
|
"vendor" : "Sony",
|
||||||
"model" : "Xperia Phone",
|
"model" : "C5303",
|
||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -295,7 +355,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"vendor" : "Sony",
|
"vendor" : "Sony",
|
||||||
"model" : "Xperia Phone",
|
"model" : "SO-02F",
|
||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -305,7 +365,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"vendor" : "Sony",
|
"vendor" : "Sony",
|
||||||
"model" : "Xperia Phone",
|
"model" : "D6653",
|
||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -315,7 +375,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"vendor" : "Sony",
|
"vendor" : "Sony",
|
||||||
"model" : "Xperia Phone",
|
"model" : "SOL25",
|
||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -325,7 +385,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"vendor" : "Sony",
|
"vendor" : "Sony",
|
||||||
"model" : "Xperia Phone",
|
"model" : "C5302",
|
||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -480,4 +540,388 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Google Chromecast",
|
||||||
|
"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" :
|
||||||
|
{
|
||||||
|
"vendor" : "Google",
|
||||||
|
"model" : "Chromecast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Google Pixel C",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Google",
|
||||||
|
"model" : "Pixel C",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Google Pixel",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 7.1; Pixel Build/NDE63V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Google",
|
||||||
|
"model" : "Pixel",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Google Pixel",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 7.1; Pixel XL Build/NDE63X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Google",
|
||||||
|
"model" : "Pixel XL",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
|
||||||
|
{
|
||||||
|
"desc" : "Generic Android Device",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 6.0.1; i980 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Generic",
|
||||||
|
"model" : "Android 6.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "LG VK Series Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0.2; VK700 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.84 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "LG",
|
||||||
|
"model" : "VK700",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "LG LK Series Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0.1; LGLK430 Build/LRX21Y) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/38.0.2125.102 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "LG",
|
||||||
|
"model" : "LK430",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "RCA Voyager III Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; RCT6973W43 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "RCA",
|
||||||
|
"model" : "RCT6973W43",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "RCA Voyager II Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0; RCT6773W22B Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "RCA",
|
||||||
|
"model" : "RCT6773W22B",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Verizon Quanta Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; QMV7B Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Verizon",
|
||||||
|
"model" : "QMV7B",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Verizon Ellipsis 8 Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; QTAQZ3 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Verizon",
|
||||||
|
"model" : "QTAQZ3",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Verizon Ellipsis 8HD Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; QTASUN1 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Verizon",
|
||||||
|
"model" : "QTASUN1",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Dell Venue 8 Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; Venue 8 3830 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Dell",
|
||||||
|
"model" : "Venue 8 3830",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Dell Venue 7 Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; Venue 7 3730 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Dell",
|
||||||
|
"model" : "Venue 7 3730",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Barnes & Noble Nook HD+ Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; Barnes & Noble Nook HD+ Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Barnes & Noble",
|
||||||
|
"model" : "Nook HD+",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Barnes & Noble V400 Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Barnes & Noble",
|
||||||
|
"model" : "V400",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "NuVision TM101A540N Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.1; TM101A540N Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/50.0.2661.86 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "NuVision",
|
||||||
|
"model" : "TM101A540N",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "ZTE K Series Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; K88 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "ZTE",
|
||||||
|
"model" : "K88",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Swizz GEN610",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; GEN610 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Swiss",
|
||||||
|
"model" : "GEN610",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Swizz ZUR700",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; ZUR700 Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Swiss",
|
||||||
|
"model" : "ZUR700",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Zeki TB782b Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; en-US; TB782B Build/IMM76D) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.0.2.299 U3/0.8.0 Mobile Safari/534.31",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Zeki",
|
||||||
|
"model" : "TB782B",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Dragon Touch Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.0.4; DT9138B Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Dragon Touch",
|
||||||
|
"model" : "9138B",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Insignia Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 6.0.1; NS-P08A7100 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Insignia",
|
||||||
|
"model" : "NS-P08A7100",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Voice Xtreme V75",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.2.1; en-us; V75 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Voice",
|
||||||
|
"model" : "V75",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "LvTel V11",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; V11 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "LvTel",
|
||||||
|
"model" : "V11",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Envizen Tablet V100MD",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; V100MD Build/V100MD.20130816) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Envizen",
|
||||||
|
"model" : "V100MD",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Rotor Tablet",
|
||||||
|
"ua" : "mozilla/5.0 (linux; android 5.0.1; tu_1491 build/lrx22c) applewebkit/537.36 (khtml, like gecko) chrome/43.0.2357.93 safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Rotor",
|
||||||
|
"model" : "1491",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "MachSpeed Tablets",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; Trio 7.85 vQ Build/Trio_7.85_vQ) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "MachSpeed",
|
||||||
|
"model" : "Trio 7.85 vQ",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Trinity Tablets",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0.1; Trinity T101 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Trinity",
|
||||||
|
"model" : "T101",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "NextBook Next7",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Next7P12 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "NextBook",
|
||||||
|
"model" : "Next7P12",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "NextBook Tablets",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0; NXA8QC116 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "NextBook",
|
||||||
|
"model" : "NXA8QC116",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Le Pan Tablets",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.2.2; Le Pan TC802A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Le Pan",
|
||||||
|
"model" : "TC802A",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Le Pan Tablets",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.2.2; Le Pan TC802A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Le Pan",
|
||||||
|
"model" : "TC802A",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Amazon Kindle Fire Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.4.3; en-us; KFSAWI Build/KTU84M) AppleWebKit/537.36 (KHTML, like Gecko) Silk/3.66 like Chrome/39.0.2171.93 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Amazon",
|
||||||
|
"model" : "KFSAWI",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"desc" : "Gigaset Tablet",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.2.2; Gigaset QV830 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Gigaset",
|
||||||
|
"model" : "QV830",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
15
test/test.js
15
test/test.js
@@ -68,10 +68,17 @@ for (var i in methods) {
|
|||||||
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.12",
|
|
||||||
"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