mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-16 15:11:50 +03:00
Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6cc6742f5e | ||
|
|
cf977c50ed | ||
|
|
4c15b10730 | ||
|
|
a3c7619d3a | ||
|
|
82aba654f9 | ||
|
|
2f1b14906f | ||
|
|
a3a09d33bc | ||
|
|
946ba02c54 | ||
|
|
d2d570fcd5 | ||
|
|
18e08428f4 | ||
|
|
552915907e | ||
|
|
7a68f35574 | ||
|
|
2bc75f10bc | ||
|
|
fe568ffe96 | ||
|
|
252db2534e | ||
|
|
6555bf6e81 | ||
|
|
740fc93b4b | ||
|
|
eed646f9ce | ||
|
|
764de40fe0 | ||
|
|
49609c0990 | ||
|
|
ef69224d7c | ||
|
|
caa2f47c06 | ||
|
|
5177c460a5 | ||
|
|
3e2d5c1817 | ||
|
|
29a0372611 | ||
|
|
2aa2f77881 | ||
|
|
1e228b2fbe | ||
|
|
5379ec8513 | ||
|
|
01ae611dfa | ||
|
|
2de1f2a75d | ||
|
|
975cbdc89e | ||
|
|
507714c3c7 | ||
|
|
2b4a20d162 | ||
|
|
34848e8ec2 | ||
|
|
97b52b2cfd | ||
|
|
9f0419607b | ||
|
|
b13c891d7f | ||
|
|
7f9919f896 | ||
|
|
9fe7561d78 | ||
|
|
b99840d074 | ||
|
|
61b0f1c054 | ||
|
|
58880fda7f | ||
|
|
73735e1ca8 | ||
|
|
0f0ea13fab | ||
|
|
1fb82fb6ff | ||
|
|
88f2f4e24c | ||
|
|
1a4dab5829 | ||
|
|
2467a458e3 | ||
|
|
aadabcce29 | ||
|
|
d0b7c5892f | ||
|
|
d3f959ee28 | ||
|
|
d1a33d7d85 | ||
|
|
3dae55a3c8 | ||
|
|
87b88246a2 | ||
|
|
a56c990ec3 | ||
|
|
458f3c3cd2 | ||
|
|
f28f87c412 | ||
|
|
0d42b3a752 | ||
|
|
4344c43d04 | ||
|
|
909d6fc26d |
28
bower.json
28
bower.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.11",
|
"version": "0.7.13",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Faisal Salman <fyzlman@gmail.com>"
|
"Faisal Salman <fyzlman@gmail.com>"
|
||||||
],
|
],
|
||||||
@@ -13,31 +13,5 @@
|
|||||||
"test",
|
"test",
|
||||||
"tests"
|
"tests"
|
||||||
],
|
],
|
||||||
"contributors": [
|
|
||||||
"Faisal Salman <fyzlman@gmail.com>",
|
|
||||||
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
|
||||||
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
|
|
||||||
"Christopher De Cairos <chris.decairos@gmail.com>",
|
|
||||||
"Davit Barbakadze <jayarjo@gmail.com>",
|
|
||||||
"Dmitry Tyschenko <dtyschenko@gmail.com>",
|
|
||||||
"Douglas Li <doug@knotch.it>",
|
|
||||||
"Dumitru Uzun <duzun@mail.ru>",
|
|
||||||
"Erik Hesselink <hesselink@gmail.com>",
|
|
||||||
"Fabian Becker <halfdan@xnorfz.de>",
|
|
||||||
"Hendrik Helwich <h.helwich@iplabs.de>",
|
|
||||||
"Jackpoll <jackpoll123456@gmail.com>",
|
|
||||||
"Jake Mc <startswithaj@users.noreply.github.com>",
|
|
||||||
"John Tantalo <john.tantalo@gmail.com>",
|
|
||||||
"John Yanarella <jmy@codecatalyst.com>",
|
|
||||||
"Jon Buckley <jon@jbuckley.ca>",
|
|
||||||
"Kendall Buchanan <kendall@kendagriff.com>",
|
|
||||||
"Lee Treveil <leetreveil@gmail.com>",
|
|
||||||
"Leonardo <leofiore@libero.it>",
|
|
||||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
|
||||||
"Michael Hess <mhess@connectify.me>",
|
|
||||||
"OtakuSiD <otakusid@gmail.com>",
|
|
||||||
"Ross Noble <rosshnoble@gmail.com>",
|
|
||||||
"Sandro Sonntag <sandro.sonntag@adorsys.de>"
|
|
||||||
],
|
|
||||||
"dependencies": {}
|
"dependencies": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "ua-parser-js",
|
|
||||||
"version": "0.7.11",
|
|
||||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
|
||||||
"keywords": [
|
|
||||||
"user-agent",
|
|
||||||
"parser",
|
|
||||||
"browser",
|
|
||||||
"engine",
|
|
||||||
"os",
|
|
||||||
"device",
|
|
||||||
"cpu"
|
|
||||||
],
|
|
||||||
"scripts": [
|
|
||||||
"src/ua-parser.js"
|
|
||||||
],
|
|
||||||
"main": "src/ua-parser.js",
|
|
||||||
"license": "MIT",
|
|
||||||
"development": {
|
|
||||||
"jshint/jshint": "*",
|
|
||||||
"visionmedia/mocha": "*",
|
|
||||||
"mishoo/uglifyjs2": "*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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.11',
|
version: '0.7.13',
|
||||||
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'
|
||||||
|
|||||||
53
package.json
53
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.11",
|
"version": "0.7.13",
|
||||||
"author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)",
|
"author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)",
|
||||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@@ -15,34 +15,69 @@
|
|||||||
],
|
],
|
||||||
"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"
|
||||||
@@ -50,7 +85,6 @@
|
|||||||
"verup": {
|
"verup": {
|
||||||
"files": [
|
"files": [
|
||||||
"ua-parser-js.jquery.json",
|
"ua-parser-js.jquery.json",
|
||||||
"component.json",
|
|
||||||
"bower.json",
|
"bower.json",
|
||||||
"package.js",
|
"package.js",
|
||||||
"src/ua-parser.js"
|
"src/ua-parser.js"
|
||||||
@@ -63,7 +97,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"jshint": "~1.1.0",
|
"jshint": "~1.1.0",
|
||||||
"mocha": "~1.8.0",
|
"mocha": "~1.8.0",
|
||||||
"uglify-js": "~1.3.4",
|
"requirejs": "^2.3.2",
|
||||||
|
"uglify-js": "~2.7.5",
|
||||||
"verup": "^1.3.x"
|
"verup": "^1.3.x"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
110
readme.md
110
readme.md
@@ -1,36 +1,42 @@
|
|||||||
# UAParser.js
|
# UAParser.js
|
||||||
|
|
||||||
Lightweight JavaScript-based User-Agent string parser. Supports browser & node.js environment. Also available as jQuery/Zepto plugin, Component/Bower/Meteor package, & RequireJS/AMD module
|
<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)
|
||||||
[](http://flattr.com/thing/3867907/faisalmanua-parser-js-on-GitHub)
|
[](https://www.npmjs.com/package/ua-parser-js)
|
||||||
|
[](https://www.npmjs.com/package/ua-parser-js)
|
||||||
|
[](https://bower.io/)
|
||||||
[](https://cdnjs.com/libraries/UAParser.js)
|
[](https://cdnjs.com/libraries/UAParser.js)
|
||||||
|
[](https://gratipay.com/UAParser.js)
|
||||||
|
[](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
|
||||||
|
|
||||||
## Features
|
# Constructor
|
||||||
|
|
||||||
Extract detailed type of web browser, layout engine, operating system, cpu architecture, and device type/model purely from user-agent string with relatively lightweight footprint (~11KB minified / ~4KB gzipped). Written in vanilla js, which means it doesn't depends on any other library.
|
* `new UAParser([uastring][,extensions])`
|
||||||
|
* returns new instance
|
||||||
|
|
||||||

|
* `UAParser([uastring][,extensions])`
|
||||||
|
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
||||||
|
|
||||||
## Methods
|
# Methods
|
||||||
|
|
||||||
* `getBrowser()`
|
* `getBrowser()`
|
||||||
* returns `{ name: '', version: '' }`
|
* returns `{ name: '', version: '' }`
|
||||||
|
|
||||||
```
|
```
|
||||||
# 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
|
||||||
```
|
```
|
||||||
@@ -45,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
|
||||||
```
|
```
|
||||||
@@ -70,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
|
||||||
|
|
||||||
@@ -82,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()`
|
||||||
@@ -93,9 +98,11 @@ 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
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
@@ -168,7 +175,7 @@ ppc, sparc, sparc64
|
|||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using node.js
|
## Using node.js
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ npm install ua-parser-js
|
$ npm install ua-parser-js
|
||||||
@@ -189,34 +196,35 @@ http.createServer(function (req, res) {
|
|||||||
console.log('Server running at http://127.0.0.1:1337/');
|
console.log('Server running at http://127.0.0.1:1337/');
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using requirejs
|
## Using requirejs
|
||||||
|
|
||||||
```js
|
```js
|
||||||
require(['ua-parser-js'], function(UAParser) {
|
requirejs.config({
|
||||||
|
baseUrl : 'js/lib', // path to your script directory
|
||||||
|
paths : {
|
||||||
|
'ua-parser-js' : 'ua-parser.min'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
requirejs(['ua-parser-js'], function(UAParser) {
|
||||||
var parser = new UAParser();
|
var parser = new UAParser();
|
||||||
console.log(parser.getResult());
|
console.log(parser.getResult());
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using component
|
## Using bower
|
||||||
|
|
||||||
```sh
|
|
||||||
$ component install faisalman/ua-parser-js
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using bower
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ bower install ua-parser-js
|
$ bower install ua-parser-js
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using meteor
|
## Using meteor
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ meteor add faisalman:ua-parser-js
|
$ meteor add faisalman:ua-parser-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)`.
|
||||||
|
|
||||||
@@ -237,9 +245,13 @@ 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])`
|
||||||
|
|
||||||
@@ -247,25 +259,35 @@ Pass your own regexes to extend the limited matching rules.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// Example:
|
// Example:
|
||||||
var uaString = 'ownbrowser/1.3';
|
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||||||
var ownBrowser = [[/(ownbrowser)\/([\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: ownBrowser});
|
var parser = new UAParser(uaString, { browser: myOwnRegex });
|
||||||
console.log(parser.getBrowser()); // {name: "ownbrowser", version: "1.3"}
|
console.log(parser.getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
Verify, test, & minify script
|
# Development
|
||||||
|
|
||||||
|
## Contribute
|
||||||
|
|
||||||
|
* Fork and clone this repository
|
||||||
|
* Make some changes as required
|
||||||
|
* Write a unit test to showcase your feature
|
||||||
|
* Run the test suites to make sure the changes you made didn't break anything `$ npm run test`
|
||||||
|
* Commit and push to your own repository
|
||||||
|
* Submit a pull request to this repository under `develop` branch
|
||||||
|
* Profit? $$$
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
Build a minified & packed script
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ npm run test
|
|
||||||
$ npm run build
|
$ npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
Then submit a pull request to https://github.com/faisalman/ua-parser-js under `develop` branch.
|
|
||||||
|
|
||||||
|
# License
|
||||||
## License
|
|
||||||
|
|
||||||
Dual licensed under GPLv2 & MIT
|
Dual licensed under GPLv2 & MIT
|
||||||
|
|
||||||
|
|||||||
245
src/ua-parser.js
245
src/ua-parser.js
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* UAParser.js v0.7.11
|
* UAParser.js v0.7.13
|
||||||
* 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.11',
|
var LIBVERSION = '0.7.13',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
return str.toLowerCase();
|
return str.toLowerCase();
|
||||||
},
|
},
|
||||||
major : function (version) {
|
major : function (version) {
|
||||||
return typeof(version) === STR_TYPE ? version.split(".")[0] : undefined;
|
return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
|
||||||
},
|
},
|
||||||
trim : function (str) {
|
trim : function (str) {
|
||||||
return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
||||||
@@ -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) {
|
||||||
@@ -241,7 +236,7 @@
|
|||||||
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
|
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
/(OPiOS)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
|
/(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
|
||||||
], [[NAME, 'Opera Mini'], VERSION], [
|
], [[NAME, 'Opera Mini'], VERSION], [
|
||||||
|
|
||||||
/\s(opr)\/([\w\.]+)/i // Opera Webkit
|
/\s(opr)\/([\w\.]+)/i // Opera Webkit
|
||||||
@@ -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,38 +267,53 @@
|
|||||||
/(yabrowser)\/([\w\.]+)/i // Yandex
|
/(yabrowser)\/([\w\.]+)/i // Yandex
|
||||||
], [[NAME, 'Yandex'], VERSION], [
|
], [[NAME, 'Yandex'], VERSION], [
|
||||||
|
|
||||||
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
/(puffin)\/([\w\.]+)/i // Puffin
|
||||||
], [[NAME, /_/g, ' '], VERSION], [
|
], [[NAME, 'Puffin'], VERSION], [
|
||||||
|
|
||||||
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(MicroMessenger)\/([\w\.]+)/i // WeChat
|
|
||||||
], [[NAME, 'WeChat'], VERSION], [
|
|
||||||
|
|
||||||
/(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(uc\s?browser)[\/\s]?([\w\.]+)/i,
|
/(uc\s?browser)[\/\s]?([\w\.]+)/i,
|
||||||
/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
|
/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
|
||||||
/JUC.+(ucweb)[\/\s]?([\w\.]+)/i
|
/juc.+(ucweb)[\/\s]?([\w\.]+)/i,
|
||||||
|
/(ucbrowser)\/([\w\.]+)/i
|
||||||
// UCBrowser
|
// UCBrowser
|
||||||
], [[NAME, 'UCBrowser'], VERSION], [
|
], [[NAME, 'UCBrowser'], VERSION], [
|
||||||
|
|
||||||
|
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
||||||
|
], [[NAME, /_/g, ' '], VERSION], [
|
||||||
|
|
||||||
|
/(micromessenger)\/([\w\.]+)/i // WeChat
|
||||||
|
], [[NAME, 'WeChat'], VERSION], [
|
||||||
|
|
||||||
|
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
||||||
|
], [NAME, VERSION], [
|
||||||
|
|
||||||
|
/xiaomi\/miuibrowser\/([\w\.]+)/i // 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
|
||||||
|
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
|
||||||
|
|
||||||
|
/android.+samsungbrowser\/([\w\.]+)/i,
|
||||||
|
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
||||||
|
], [VERSION, [NAME, 'Android Browser']], [
|
||||||
|
|
||||||
|
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
|
||||||
|
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
||||||
|
], [NAME, 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], [
|
||||||
|
|
||||||
/XiaoMi\/MiuiBrowser\/([\w\.]+)/i // MIUI Browser
|
/(coast)\/([\w\.]+)/i // Opera Coast
|
||||||
], [VERSION, [NAME, 'MIUI Browser']], [
|
], [[NAME, 'Opera Coast'], VERSION], [
|
||||||
|
|
||||||
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i // Android Browser
|
|
||||||
], [VERSION, [NAME, 'Android Browser']], [
|
|
||||||
|
|
||||||
/FBAV\/([\w\.]+);/i // Facebook App for iOS
|
|
||||||
], [VERSION, [NAME, 'Facebook']], [
|
|
||||||
|
|
||||||
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
||||||
], [VERSION, [NAME, 'Firefox']], [
|
], [VERSION, [NAME, 'Firefox']], [
|
||||||
@@ -480,9 +490,6 @@
|
|||||||
|
|
||||||
device : [[
|
device : [[
|
||||||
|
|
||||||
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
|
|
||||||
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
|
|
||||||
|
|
||||||
/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
|
/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
|
||||||
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
||||||
|
|
||||||
@@ -519,7 +526,7 @@
|
|||||||
/\(bb10;\s(\w+)/i // BlackBerry 10
|
/\(bb10;\s(\w+)/i // BlackBerry 10
|
||||||
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
|
||||||
// Asus Tablets
|
// Asus Tablets
|
||||||
/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7)/i
|
/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
|
||||||
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
|
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
|
||||||
@@ -553,6 +560,12 @@
|
|||||||
/(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
|
||||||
|
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
|
||||||
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
|
/[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
|
||||||
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
|
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
|
||||||
/(kin\.[onetw]{3})/i // Microsoft Kin
|
/(kin\.[onetw]{3})/i // Microsoft Kin
|
||||||
@@ -562,23 +575,30 @@
|
|||||||
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
|
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
|
||||||
/mot[\s-]?(\w+)*/i,
|
/mot[\s-]?(\w+)*/i,
|
||||||
/(XT\d{3,4}) build\//i,
|
/(XT\d{3,4}) build\//i,
|
||||||
/(nexus\s[6])/i
|
/(nexus\s6)/i
|
||||||
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
|
||||||
/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
|
/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
|
||||||
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n8000|sgh-t8[56]9|nexus 10))/i,
|
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
|
||||||
/((SM-T\w+))/i
|
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
|
||||||
], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
|
|
||||||
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
|
|
||||||
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
|
|
||||||
/sec-((sgh\w+))/i
|
|
||||||
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
|
|
||||||
/hbbtv.+maple;(\d+)/i
|
/hbbtv.+maple;(\d+)/i
|
||||||
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
|
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
|
||||||
|
|
||||||
/\(dtv[\);].+(aquos)/i // Sharp
|
/\(dtv[\);].+(aquos)/i // Sharp
|
||||||
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
|
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
|
||||||
|
|
||||||
|
/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
|
||||||
|
/((SM-T\w+))/i
|
||||||
|
], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
|
||||||
|
/smart-tv.+(samsung)/i
|
||||||
|
], [VENDOR, [TYPE, SMARTTV], MODEL], [
|
||||||
|
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
|
||||||
|
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
|
||||||
|
/sec-((sgh\w+))/i
|
||||||
|
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/sie-(\w+)*/i // Siemens
|
/sie-(\w+)*/i // Siemens
|
||||||
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
@@ -606,16 +626,31 @@
|
|||||||
/((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.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
/android.+;\s(pixel c)\s/i // Google Pixel C
|
||||||
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
||||||
/android.+(mi[\s\-_]*(?:one|one[\s_]plus)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
|
|
||||||
|
/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.+(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
|
||||||
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/android.+a000(1)\s+build/i // OnePlus
|
||||||
|
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/\s(tablet)[;\/]/i, // Unidentifiable Tablet
|
/\s(tablet)[;\/]/i, // Unidentifiable Tablet
|
||||||
/\s(mobile)[;\/]/i // Unidentifiable Mobile
|
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
||||||
], [[TYPE, util.lowerize], VENDOR, MODEL]
|
], [[TYPE, util.lowerize], VENDOR, MODEL]
|
||||||
|
|
||||||
/*//////////////////////////
|
/*//////////////////////////
|
||||||
@@ -642,17 +677,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+
|
||||||
@@ -702,7 +726,8 @@
|
|||||||
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
|
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
|
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
|
||||||
/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
|
/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, // Windows Phone
|
||||||
|
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
|
||||||
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
|
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
|
||||||
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
|
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
|
||||||
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
|
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
|
||||||
@@ -729,7 +754,7 @@
|
|||||||
// GNU/Linux based
|
// GNU/Linux based
|
||||||
/(mint)[\/\s\(]?(\w+)*/i, // Mint
|
/(mint)[\/\s\(]?(\w+)*/i, // Mint
|
||||||
/(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
|
/(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
|
||||||
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,
|
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,
|
||||||
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
|
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
|
||||||
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
|
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
|
||||||
/(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
|
/(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
|
||||||
@@ -747,6 +772,9 @@
|
|||||||
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
|
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
|
||||||
], [NAME, VERSION],[
|
], [NAME, VERSION],[
|
||||||
|
|
||||||
|
/(haiku)\s(\w+)/i // Haiku
|
||||||
|
], [NAME, VERSION],[
|
||||||
|
|
||||||
/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
|
/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
|
||||||
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
|
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
|
||||||
|
|
||||||
@@ -756,7 +784,6 @@
|
|||||||
|
|
||||||
// Other
|
// Other
|
||||||
/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
|
/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
|
||||||
/(haiku)\s(\w+)/i, // Haiku
|
|
||||||
/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
|
/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
|
||||||
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
|
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
|
||||||
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
|
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
|
||||||
@@ -770,6 +797,20 @@
|
|||||||
// 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) {
|
||||||
|
|
||||||
@@ -779,25 +820,34 @@
|
|||||||
|
|
||||||
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 {
|
||||||
ua : this.getUA(),
|
ua : this.getUA(),
|
||||||
browser : this.getBrowser(),
|
browser : this.getBrowser(),
|
||||||
@@ -812,6 +862,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;
|
||||||
@@ -845,7 +900,7 @@
|
|||||||
NAME : NAME,
|
NAME : NAME,
|
||||||
VERSION : VERSION
|
VERSION : VERSION
|
||||||
};
|
};
|
||||||
|
//UAParser.Utils = util;
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
// Export
|
// Export
|
||||||
@@ -862,7 +917,7 @@
|
|||||||
} else {
|
} else {
|
||||||
// requirejs env (optional)
|
// requirejs env (optional)
|
||||||
if (typeof(define) === FUNC_TYPE && define.amd) {
|
if (typeof(define) === FUNC_TYPE && define.amd) {
|
||||||
define("ua-parser-js", [], function () {
|
define(function () {
|
||||||
return UAParser;
|
return UAParser;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -880,7 +935,7 @@
|
|||||||
if (typeof $ !== UNDEF_TYPE) {
|
if (typeof $ !== UNDEF_TYPE) {
|
||||||
var parser = new UAParser();
|
var parser = new UAParser();
|
||||||
$.ua = parser.getResult();
|
$.ua = parser.getResult();
|
||||||
$.ua.get = function() {
|
$.ua.get = function () {
|
||||||
return parser.getUA();
|
return parser.getUA();
|
||||||
};
|
};
|
||||||
$.ua.set = function (uastring) {
|
$.ua.set = function (uastring) {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,34 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Android Browser",
|
||||||
|
"version" : "4.0",
|
||||||
|
"major" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Android Browser on Galaxy S3",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; en-us; SAMSUNG GT-I9300I Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Android Browser",
|
||||||
|
"version" : "1.5",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Android Browser on HTC Flyer (P510E)",
|
"desc" : "Android Browser on HTC Flyer (P510E)",
|
||||||
"ua" : "Mozilla/5.0 (Linux; U; Android 3.2.1; ru-ru; HTC Flyer P510e Build/HTK75C) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
|
"ua" : "Mozilla/5.0 (Linux; U; Android 3.2.1; ru-ru; HTC Flyer P510e Build/HTK75C) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
|
||||||
@@ -19,6 +49,26 @@
|
|||||||
"major" : "4"
|
"major" : "4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Android Browser on Huawei P8 (H891L)",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; HUAWEI H891L Build/HuaweiH891L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Android Browser",
|
||||||
|
"version" : "4.0",
|
||||||
|
"major" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Android Browser on Samsung S6 (SM-G925F)",
|
||||||
|
"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" :
|
||||||
|
{
|
||||||
|
"name" : "Android Browser",
|
||||||
|
"version" : "3.0",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Arora",
|
"desc" : "Arora",
|
||||||
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-CH) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2",
|
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-CH) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2",
|
||||||
@@ -59,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)",
|
||||||
@@ -89,6 +149,16 @@
|
|||||||
"major" : "20"
|
"major" : "20"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Chrome WebView",
|
||||||
|
"version" : "43.0.2357.65",
|
||||||
|
"major" : "43"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Chrome on iOS",
|
"desc" : "Chrome on iOS",
|
||||||
"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",
|
||||||
@@ -159,6 +229,26 @@
|
|||||||
"major" : "1"
|
"major" : "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"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;]",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Facebook",
|
||||||
|
"version" : "35.0.0.48.273",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Firebird",
|
"desc" : "Firebird",
|
||||||
"ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7",
|
"ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7",
|
||||||
@@ -549,6 +639,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",
|
||||||
@@ -579,6 +679,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 +779,16 @@
|
|||||||
"major" : "1"
|
"major" : "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
@@ -749,6 +869,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",
|
||||||
|
|||||||
@@ -1,4 +1,34 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Asus Nexus 7",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Asus",
|
||||||
|
"model" : "Nexus 7",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Asus Padfone",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.1.1; PadFone 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Asus",
|
||||||
|
"model" : "PadFone",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Desktop (IE11 with Tablet string)",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; GWX:MANAGED; rv:11.0) like Gecko",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "undefined",
|
||||||
|
"model" : "undefined",
|
||||||
|
"type" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "HTC Evo Shift 4G",
|
"desc" : "HTC Evo Shift 4G",
|
||||||
"ua" : "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0",
|
"ua" : "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0",
|
||||||
@@ -19,6 +49,26 @@
|
|||||||
"type" : "tablet"
|
"type" : "tablet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Huawei",
|
||||||
|
"model" : "Nexus 6P",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Apple",
|
||||||
|
"model" : "iPod touch",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "LG Nexus 4",
|
"desc" : "LG Nexus 4",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
|
"ua" : "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
|
||||||
@@ -39,6 +89,26 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Microsoft",
|
||||||
|
"model" : "Lumia 950",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Motorola Moto X",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; XT1097 Build/KXE21.187-38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Motorola",
|
||||||
|
"model" : "XT1097",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Motorola Nexus 6",
|
"desc" : "Motorola Nexus 6",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
|
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
|
||||||
@@ -99,6 +169,26 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "OnePlus One",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; A0001 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "OnePlus",
|
||||||
|
"model" : "1",
|
||||||
|
"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",
|
||||||
@@ -119,6 +209,16 @@
|
|||||||
"type" : "tablet"
|
"type" : "tablet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Samsung Galaxy Note 8",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.2.2; GT-N5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Samsung",
|
||||||
|
"model" : "GT-N5100",
|
||||||
|
"type" : "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"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",
|
||||||
@@ -179,6 +279,16 @@
|
|||||||
"type" : "smarttv"
|
"type" : "smarttv"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Samsung SmartTV",
|
||||||
|
"ua" : "Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Samsung",
|
||||||
|
"model" : "undefined",
|
||||||
|
"type" : "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Sony C5303 (Xperia SP)",
|
"desc" : "Sony C5303 (Xperia SP)",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36",
|
"ua" : "Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36",
|
||||||
@@ -219,6 +329,16 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Sony Xperia SP",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.3; C5302 Build/12.1.A.1.201) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Sony",
|
||||||
|
"model" : "Xperia Phone",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Sony SGP521 (Xperia Z2 Tablet)",
|
"desc" : "Sony SGP521 (Xperia Z2 Tablet)",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
||||||
@@ -279,6 +399,16 @@
|
|||||||
"type" : "mobile"
|
"type" : "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Xiaomi Mi Note",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; MI NOTE LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"vendor" : "Xiaomi",
|
||||||
|
"model" : "MI NOTE LTE",
|
||||||
|
"type" : "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Xiaomi Mi One Plus",
|
"desc" : "Xiaomi Mi One Plus",
|
||||||
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; MI-ONE Plus Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; MI-ONE Plus Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||||
@@ -360,4 +490,47 @@
|
|||||||
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
582
test/mediaplayer-test.json
Normal file
582
test/mediaplayer-test.json
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Coremedia",
|
||||||
|
"ua" : "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F2108",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "CoreMedia",
|
||||||
|
"version" : "1.0.0.10F2108",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AppleCoreMedia",
|
||||||
|
"ua" : "AppleCoreMedia/1.0.0.10A403 (iPad; U; CPU OS 6_0 like Mac OS X; it_it)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AppleCoreMedia",
|
||||||
|
"version" : "1.0.0.10A403",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AppleTv",
|
||||||
|
"ua" : "AppleTV/3.0.2 (Macintosh; Intel Mac OS X 10.4.7) AppleWebKit/528.18",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "WebKit",
|
||||||
|
"version" : "528.18",
|
||||||
|
"major" : "528"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Aqualung",
|
||||||
|
"ua" : "Aqualung/R-1114",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Aqualung",
|
||||||
|
"version" : "R-1114",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Ares",
|
||||||
|
"ua" : "Ares 2.2.4.3048",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Ares",
|
||||||
|
"version" : "2.2.4.3048",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Audacious",
|
||||||
|
"ua" : "Audacious/3.2.2 neon/0.29.3",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Audacious",
|
||||||
|
"version" : "3.2.2",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AudiMusicStream",
|
||||||
|
"ua" : "AudiMusicStream/3020.130826151911",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AudiMusicStream",
|
||||||
|
"version" : "3020.130826151911",
|
||||||
|
"major" : "3020"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "BASS",
|
||||||
|
"ua" : "BASS/2.4",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BASS",
|
||||||
|
"version" : "2.4",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "BSPlayer",
|
||||||
|
"ua" : "BSPlayer/2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BSPlayer",
|
||||||
|
"version" : "2",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Core",
|
||||||
|
"ua" : "CORE/6.506.4.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "CORE",
|
||||||
|
"version" : "6.506.4.1",
|
||||||
|
"major" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Clementine",
|
||||||
|
"ua" : "Clementine 1.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Clementine",
|
||||||
|
"version" : "1.1",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Dalvik",
|
||||||
|
"ua" : "Dalvik/1.2.0 (Linux; U; Android 2.2.1; GT-S5830L Build/FROYO)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Dalvik",
|
||||||
|
"version" : "1.2.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NexPlayer",
|
||||||
|
"ua" : "E97510d/ Player/NexPlayer 4.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "NexPlayer",
|
||||||
|
"version" : "4.0",
|
||||||
|
"major" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "FLRP",
|
||||||
|
"ua" : "FLRP/2.5 CFNetwork/609.1.4 Darwin/13.0.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Flip Player",
|
||||||
|
"version" : "2.5",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "FStream",
|
||||||
|
"ua" : "FStream",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "FStream",
|
||||||
|
"version" : "undefined",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "GStreamer",
|
||||||
|
"ua" : "GStreamer souphttpsrc (compatible; LG NetCast.TV-2012) libsoup/2.34.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "GStreamer",
|
||||||
|
"version" : "2.34.2",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "GnomeMplayer",
|
||||||
|
"ua" : "GnomeMplayer/1.0.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "GnomeMplayer",
|
||||||
|
"version" : "1.0.2",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HTC Streaming Player",
|
||||||
|
"ua" : "HTC Streaming Player htc_asia_wwe / 1.0 / endeavoru / 4.1.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HTC Streaming Player",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HTC One S",
|
||||||
|
"ua" : "HTC_One_S/3.16.111.10",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HTC One S",
|
||||||
|
"version" : "3.16.111.10",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Java",
|
||||||
|
"ua" : "Java/1.4.1_04",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Java",
|
||||||
|
"version" : "1.4.1_04",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "LG Player",
|
||||||
|
"ua" : "LG Player 1.0; Android",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "LG Player",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NexPlayer",
|
||||||
|
"ua" : "LG-P700/V10k-DEC-12-2012 Player/NexPlayer 4.0 for Android",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "NexPlayer",
|
||||||
|
"version" : "4.0",
|
||||||
|
"major" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "LG Player",
|
||||||
|
"ua" : "LGE400/V10b Player/LG Player 1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "LG Player",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Lavf",
|
||||||
|
"ua" : "Lavf52.111.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Lavf",
|
||||||
|
"version" : "52.111.0",
|
||||||
|
"major" : "52"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Lyssna",
|
||||||
|
"ua" : "Lyssna/46 CFNetwork/609.1.4 Darwin/13.0.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Lyssna",
|
||||||
|
"version" : "46",
|
||||||
|
"major" : "46"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MPlayer",
|
||||||
|
"ua" : "MPlayer 1.1-4.2.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MPlayer",
|
||||||
|
"version" : "1.1-4.2.1",
|
||||||
|
"major" : ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MPlayer SVN",
|
||||||
|
"ua" : "MPlayer SVN-r33713-4.6.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MPlayer",
|
||||||
|
"version" : "r33713-4.6.1",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MPlayer ubuntu",
|
||||||
|
"ua" : "MPlayer svn r34540 (Ubuntu), built with gcc-4.6",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MPlayer",
|
||||||
|
"version" : "r34540",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MoC",
|
||||||
|
"ua" : "Music On Console/2.5.0-beta1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Music On Console",
|
||||||
|
"version" : "2.5.0-beta1",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MPD",
|
||||||
|
"ua" : "Music Player Daemon 0.17.4",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Music Player Daemon",
|
||||||
|
"version" : "0.17.4",
|
||||||
|
"major" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NSPlayer",
|
||||||
|
"ua" : "NSPlayer/11.0.5358.4827 WMFSDK/11.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "NSPlayer",
|
||||||
|
"version" : "11.0.5358.4827",
|
||||||
|
"major" : "11"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Nero Home",
|
||||||
|
"ua" : "Nero Home/1.5.3.0 (compatible; Nero AG; Nero Home 1.5.3.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Nero Home",
|
||||||
|
"version" : "1.5.3.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NexPlayer",
|
||||||
|
"ua" : "NexPlayer 4.0 for Android( stagefright alternative )",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "NexPlayer",
|
||||||
|
"version" : "4.0",
|
||||||
|
"major" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Nokia3xx",
|
||||||
|
"ua" : "Nokia303/14.87 CLDC-1.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Nokia303",
|
||||||
|
"version" : "14.87",
|
||||||
|
"major" : "14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MPlayer SVN Sherpya",
|
||||||
|
"ua" : "MPlayer Sherpya-SVN-r33124-4.2.5",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MPlayer",
|
||||||
|
"version" : "r33124-4.2.5",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Philips Songbird",
|
||||||
|
"ua" : "NotMoz/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.3) Gecko/20101207 Philips-Songbird/5.4.1980 Songbird/1.9.4 (20110302030555)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Songbird",
|
||||||
|
"version" : "1.9.4",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Ossproxy",
|
||||||
|
"ua" : "OSSProxy 1.3.336.320 (Build 336.320 Win32 en-us)(Aug 16 2013 17:38:43)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "OSSProxy",
|
||||||
|
"version" : "1.3.336.320",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Winamp3",
|
||||||
|
"ua" : "Nullsoft Winamp3 version 3.0 (compatible)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Winamp",
|
||||||
|
"version" : "3.0",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "PSP",
|
||||||
|
"ua" : "PSP-InternetRadioPlayer/1.00",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "PSP-InternetRadioPlayer",
|
||||||
|
"version" : "1.00",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "urllib",
|
||||||
|
"ua" : "Python-urllib/2.7",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Python-urllib",
|
||||||
|
"version" : "2.7",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "QuickTime",
|
||||||
|
"ua" : "QuickTime/7.5.6 (qtver=7.5.6;cpu=IA32;os=Mac 10.5.8)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "QuickTime",
|
||||||
|
"version" : "7.5.6",
|
||||||
|
"major" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "RMA",
|
||||||
|
"ua" : "RMA/1.0 (compatible; RealMedia)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "RMA",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "RadioApp",
|
||||||
|
"ua" : "RadioApp/1.0 CFNetwork/609.1.4 Darwin/11.4.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "RadioApp",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "RadioClientApplication",
|
||||||
|
"ua" : "RadioClientApplication/20 CFNetwork/609.1.4 Darwin/13.0.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "RadioClientApplication",
|
||||||
|
"version" : "20",
|
||||||
|
"major" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "stagefright",
|
||||||
|
"ua" : "Samsung GT-I9070 stagefright/1.1 (Linux;Android 2.3.6)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "stagefright",
|
||||||
|
"version" : "1.1",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Soundtap",
|
||||||
|
"ua" : "Soundtap/1.2.4 CFNetwork/672.0.2 Darwin/14.0.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Soundtap",
|
||||||
|
"version" : "1.2.4",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Streamium",
|
||||||
|
"ua" : "Streamium/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Streamium",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Totem",
|
||||||
|
"ua" : "Totem/3.0.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Totem",
|
||||||
|
"version" : "3.0.1",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "VLC",
|
||||||
|
"ua" : "VLC media player - version 0.8.6c Janus - (c) 1996-2007 the VideoLAN team",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "VLC",
|
||||||
|
"version" : "0.8.6c",
|
||||||
|
"major" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "VLC",
|
||||||
|
"ua" : "VLC/2.0.0 LibVLC/2.0.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "VLC",
|
||||||
|
"version" : "2.0.0",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Videos",
|
||||||
|
"ua" : "Videos/3.8.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Video",
|
||||||
|
"version" : "3.8.2",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Wget",
|
||||||
|
"ua" : "Wget/1.12 (darwin10.7.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Wget",
|
||||||
|
"version" : "1.12",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Winamp",
|
||||||
|
"ua" : "Winamp 2.81",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Winamp",
|
||||||
|
"version" : "2.81",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Winamp",
|
||||||
|
"ua" : "WinampMPEG/2.00",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Winamp",
|
||||||
|
"version" : "2.00",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Media Player",
|
||||||
|
"ua" : "Windows-Media-Player/10.00.00.4019",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Media Player",
|
||||||
|
"version" : "10.00.00.4019",
|
||||||
|
"major" : "10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "XBMC",
|
||||||
|
"ua" : "XBMC/12.0 Git:20130127-fb595f2 (Windows NT 6.1;WOW64;Win64;x64; http://www.xbmc.org)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "XBMC",
|
||||||
|
"version" : "12.0",
|
||||||
|
"major" : "12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "rad.io",
|
||||||
|
"ua" : "rad.io 1.18.1 rv:593 (iPhone 4S; iPhone OS 7.0.4; it_IT)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "rad.io",
|
||||||
|
"version" : "1.18.1",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "BE-Test",
|
||||||
|
"ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BE Test",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -107,6 +107,15 @@
|
|||||||
"version" : "6.1"
|
"version" : "6.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Phone",
|
||||||
|
"ua" : "Opera/9.80 (Windows Phone; Opera Mini/7.6.8/35.7518; U; ru) Presto/2.8.119 Version/11.10",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Phone",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows Phone OS",
|
"desc" : "Windows Phone OS",
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
|
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
|
||||||
@@ -145,11 +154,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Tizen",
|
"desc" : "Tizen",
|
||||||
"ua" : "",
|
"ua" : "Mozilla/5.0 (Linux; Tizen 2.3; SAMSUNG SM-Z130H) AppleWebKit/537.3 (KHTML, like Gecko) Version/2.3 Mobile Safari/537.3",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "",
|
"name" : "Tizen",
|
||||||
"version" : ""
|
"version" : "2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -280,11 +289,20 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Ubuntu",
|
"desc" : "Ubuntu",
|
||||||
"ua" : "",
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.22+ (KHTML, like Gecko) Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.22+ Ubuntu/12.04 (3.4.1-0ubuntu1) Epiphany/3.4.1",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "",
|
"name" : "Ubuntu",
|
||||||
"version" : ""
|
"version" : "12.04"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Ubuntu",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/31.0.1650.63 Chrome/31.0.1650.63 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Ubuntu",
|
||||||
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -496,11 +514,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Haiku",
|
"desc" : "Haiku",
|
||||||
"ua" : "",
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Haiku R1 x86) AppleWebKit/602.1.1 (KHTML, like Gecko) WebPositive/1.2 Version/8.0 Safari/602.1.1",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "",
|
"name" : "Haiku",
|
||||||
"version" : ""
|
"version" : "R1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
35
test/test.js
35
test/test.js
@@ -1,4 +1,5 @@
|
|||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
var requirejs = require('requirejs');
|
||||||
var UAParser = require('./../src/ua-parser');
|
var UAParser = require('./../src/ua-parser');
|
||||||
var browsers = require('./browser-test.json');
|
var browsers = require('./browser-test.json');
|
||||||
var cpus = require('./cpu-test.json');
|
var cpus = require('./cpu-test.json');
|
||||||
@@ -43,15 +44,6 @@ describe('UAParser()', function () {
|
|||||||
assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
|
assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Injected Browser', function () {
|
|
||||||
var uaString = 'ownbrowser/1.3';
|
|
||||||
var ownBrowser = [[/(ownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
|
|
||||||
var parser = new UAParser(uaString, {browser: ownBrowser});
|
|
||||||
assert.equal(parser.getBrowser().name, 'ownbrowser');
|
|
||||||
assert.equal(parser.getBrowser().major, '1');
|
|
||||||
assert.equal(parser.getBrowser().version, '1.3');
|
|
||||||
});
|
|
||||||
|
|
||||||
for (var i in methods) {
|
for (var i in methods) {
|
||||||
describe(methods[i]['title'], function () {
|
describe(methods[i]['title'], function () {
|
||||||
for (var j in methods[i]['list']) {
|
for (var j in methods[i]['list']) {
|
||||||
@@ -72,3 +64,28 @@ for (var i in methods) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe('Extending Regex', function () {
|
||||||
|
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||||||
|
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');
|
||||||
|
assert.equal(parser.getBrowser().version, '1.3');
|
||||||
|
assert.equal(parser.getBrowser().major, '1');
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Using Require.js', function () {
|
||||||
|
it('should loaded automatically', function(done) {
|
||||||
|
requirejs.config({
|
||||||
|
baseUrl : 'dist',
|
||||||
|
paths : {
|
||||||
|
'ua-parser-js' : 'ua-parser.min'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
requirejs(['ua-parser-js'], function(ua) {
|
||||||
|
var parser = new ua('Dillo/1.0');
|
||||||
|
assert.deepEqual(parser.getBrowser().name, 'Dillo');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.11",
|
"version": "0.7.13",
|
||||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"user-agent",
|
"user-agent",
|
||||||
|
|||||||
Reference in New Issue
Block a user