Compare commits

...

102 Commits

Author SHA1 Message Date
Faisal Salman
4f2ee98dae Fix issue #14 2013-03-22 13:23:24 +07:00
Faisal Salman
ce8f4977c0 Revert back util.is to typeof 2013-03-20 14:09:31 +07:00
Faisal Salman
38f62b3d63 Fix issue #13 & Resolve npm package name conflict with ua-parser 2013-03-20 12:50:18 +07:00
Faisal Salman
d5d329e15d Tidying up readme 2013-03-18 22:31:47 +07:00
Faisal Salman
e89e8173f5 Fix error build 2013-03-18 22:22:58 +07:00
Faisal Salman
e58c93fe0a Merge branch 'develop' of github.com:faisalman/ua-parser-js 2013-03-18 19:09:35 +07:00
Faisal Salman
8c36f005a5 Update configs 2013-03-18 18:40:02 +07:00
Faisal Salman
5717b00343 Some premature optimizations 2013-03-18 18:30:05 +07:00
Faisal Salman
4ebe7a1899 List possible values 2013-03-16 14:33:45 +07:00
Faisal Salman
b7d76f5df0 Mention the use of Vanilla.js 2013-03-16 03:54:38 +07:00
Faisal Salman
acfce61942 Modularize test data 2013-03-16 03:16:34 +07:00
Faisal Salman
d75f84820a Some minor revisions 2013-03-16 02:09:12 +07:00
Faisal Salman
007f74178f Add build script 2013-03-16 02:06:47 +07:00
Faisal Salman
d063e532e3 Reorder files 2013-03-15 21:25:16 +07:00
Faisal Salman
f3f25ae3e7 Add component.json 2013-03-14 14:45:36 +07:00
Faisal Salman
45571b6f21 Fix my poor english 2013-03-13 11:32:44 +07:00
Faisal Salman
615d6a2034 Add new Webkit Opera 2013-03-05 21:05:38 +07:00
Faisal Salman
40ac5c5bc3 Fix issue #12 2013-02-27 21:44:43 +07:00
Faisal Salman
3eb1c1c352 Revise jQuery plugin API 2013-02-15 19:02:44 +07:00
Faisal Salman
217cef226a Update version 2013-02-15 10:23:49 +07:00
Faisal Salman
a5e4b7bf72 Merge pull request #11 from jbuck/requirejs
Add requirejs module support
2013-02-14 18:25:59 -08:00
Jon Buckley
8aaf7db771 Add requirejs module support
Fixes #10.
2013-02-14 14:52:41 -05:00
Faisal Salman
0109c76858 Automatically create $.ua object if jQuery is present 2013-02-07 23:25:21 +07:00
Faisal Salman
d1120a4d5d Update contributors 2013-02-05 20:43:15 +07:00
Faisal Salman
204345a8bf Add Rekonq, Comodo Dragon, Conkeror, Amaya, w3m, Links, ICE Browser, NetSurf, RISC OS 2013-02-05 20:29:26 +07:00
Faisal Salman
a20d8f7052 Sprint default vendor to Sprint 2013-02-05 14:43:17 +07:00
Faisal Salman
9a90d932ce Add new OS: Firefox OS 2013-01-28 18:46:03 +07:00
Faisal Salman
cea29e5c1b Add new devices: Alcatel, GeeksPhone, Huawei, Lenovo, Nexian, Panasonic, Sony 2013-01-28 18:21:12 +07:00
Faisal Salman
e0b6ae65e5 Better fix for issue #8 2013-01-28 17:11:12 +07:00
Faisal Salman
59714adea3 Add a test for issue #8 2013-01-25 20:33:03 +07:00
Faisal Salman
249dcf0c80 Merge branch 'htc-evo' 2013-01-25 19:47:58 +07:00
Faisalman
b99546072d Workaround for issue #8 2013-01-25 19:46:09 +07:00
Faisal Salman
4e911cec88 Merge pull request #9 from leetreveil/google_closure_compiler
Fix google closure compiler JSC_TRAILING_COMMA errors
2013-01-15 08:21:55 -08:00
Lee Treveil
f1fa7f38a1 Fix google closure compiler JSC_TRAILING_COMMA errors 2013-01-15 15:17:51 +00:00
Faisal Salman
a6610646ca Fix issue #7 2012-12-23 06:45:59 +07:00
Faisal Salman
4703137b79 Minify filesize by variable-izing strings 2012-12-11 18:40:03 +07:00
Faisal Salman
541dfea86d Add some more test 2012-12-07 17:04:26 +07:00
Faisal Salman
35b410009f Insert dog 2012-12-06 20:37:39 +07:00
Faisal Salman
5e84ab7b82 Add test for engine parser 2012-12-06 20:29:37 +07:00
Faisal Salman
816b5d22b4 Add Opera Tablet & capture AppleWebKit as just WebKit 2012-12-06 20:28:33 +07:00
Faisal Salman
29bb0797a6 Merge branch 'test-cases' 2012-12-05 08:56:59 +07:00
Faisal Salman
52897acf24 Fix error build 2012-12-05 08:56:54 +07:00
Faisal Salman
9ccc32ce5a More test cases 2012-12-05 08:53:32 +07:00
Faisal Salman
4a65f1b3f8 Add minifier 2012-12-04 15:57:27 +07:00
Faisal Salman
be4d8a10d1 Turn off travis-ci notification if build success 2012-12-04 15:45:03 +07:00
Faisal Salman
6d183003b3 Fix error build 2012-12-04 15:25:47 +07:00
Faisal Salman
a2b4f6d5c5 Add .travis.yml 2012-12-04 15:08:05 +07:00
Faisal Salman
3f98036d50 Add browser test cases 2012-12-04 14:49:36 +07:00
Faisal Salman
d1d4e0a7a0 Fix Chrome for iOS not detected 2012-12-04 14:04:39 +07:00
Faisalman
3ecb3fbea2 Revise window object detection 2012-11-28 15:32:56 +07:00
Faisal Salman
5cc6bf78a5 Merge pull request #6 from tantalor/master
Fixes nodejs require.
2012-11-28 00:00:51 -08:00
John Tantalo
08c7a84407 added simple test case (mocha) 2012-11-27 20:44:37 -08:00
John Tantalo
ea9d093f0d in strict mode, this is undefined 2012-11-27 19:52:35 -08:00
Faisalman
1f4befe4c3 Fix issue #4 2012-11-26 10:34:37 +07:00
Faisalman
d35fb44066 Distinguish Windows RT from Windows 8 2012-11-15 16:44:31 +07:00
Faisalman
9a6479193a Add Polaris, Tasman, PS Vita, Hurd, AmigaOS, MorphOS 2012-11-12 16:36:11 +07:00
Faisalman
527ba70cf4 Add BB10 new UA pattern & Fix Mobile Safari being caught as just Safari 2012-11-07 18:20:59 +07:00
Faisalman
3fe07487cd Add OS/2, Plan 9, AIX, QNX 2012-11-07 17:03:23 +07:00
Faisalman
8030aa33f7 Add Mosaic, Chimera, Firebird, Phoenix 2012-11-07 16:32:33 +07:00
Faisalman
99251addfc Exclude the letter 'v' from Omniweb version 2012-11-07 15:25:20 +07:00
Faisalman
610cdb84ae Improve Mac OS detection 2012-11-07 15:22:29 +07:00
Faisalman
31b386c636 Add Baidu, Yandex, UCBrowser. Make Apple & RIM as vendor name 2012-11-06 15:53:17 +07:00
Faisalman
b15b48b1bf Rename Dolfin as Dolphin 2012-11-06 14:22:26 +07:00
Faisalman
58fe246468 Add S60 & OviBrowser 2012-11-06 14:18:28 +07:00
Faisalman
e1d3f25bf8 Get device type defined by Firefox 2012-11-06 12:24:12 +07:00
Faisal Salman
4efb13be3e Return unidentified version as undefined 2012-11-02 18:22:06 +07:00
Faisal Salman
bf9fb794d8 Fix issue #3 for old Safari < 3.0 2012-11-02 17:41:29 +07:00
Faisal Salman
df815d4109 Merge pull request #3 from cadecairos/safari-fix
Fix Safari version detection
2012-11-01 23:50:15 -07:00
Christopher De Cairos
6dcee61a0b Fix Safari version detection 2012-11-01 17:11:07 -04:00
Faisal Salman
0288766544 Check if userAgent property is defined 2012-10-23 17:35:24 +07:00
Faisal Salman
7ea79afc2f Fix issue #2 2012-10-22 16:04:23 +07:00
Faisal Salman
59270c8cf7 Some fixes 2012-09-22 00:06:50 +07:00
Faisal Salman
3f92a3cb10 Fix readme & version 2012-09-21 23:21:51 +07:00
Faisal Salman
b9843b4108 Change device properties naming into more appropriate names 2012-09-21 22:59:30 +07:00
Faisal Salman
bdeefcd1fb New identifier for device: type (Mobile, Tablet, Console) 2012-09-20 01:52:23 +07:00
Faisal Salman
bf9c8de5c4 Maps object should contains only data 2012-09-18 00:40:03 +07:00
Faisal Salman
41b3e247a4 Add some Android browsers and some others 2012-09-17 23:11:28 +07:00
Faisal Salman
e5be3083cf Use strict 2012-09-15 14:18:49 +07:00
Faisal Salman
68d124c59c Reorganize the structure of the code 2012-09-15 03:48:30 +07:00
Faisal Salman
33e6fe42d1 Move string checker to outside as strMapper 2012-09-15 02:27:54 +07:00
Faisal Salman
51822ad172 Make sure the result only get constructed once 2012-09-15 02:22:41 +07:00
Faisal Salman
ec40433c5c Fix node.js old example in readme 2012-09-15 01:55:02 +07:00
Faisal Salman
65703e7c1a Move regexMapper & maps outside UAParser class 2012-09-15 01:33:38 +07:00
Faisal Salman
064d52255f Remove optional argument from all getters 2012-09-15 01:15:02 +07:00
Faisal Salman
71b5300080 Replace UAParser.result object with UAParser.getResult() 2012-09-15 01:09:28 +07:00
Faisal Salman
e41fa1c829 Modify mapper method 2012-09-14 05:11:08 +07:00
Faisal Salman
7cd76a3fba Fix Opera, Add match for replacement 2012-09-14 04:23:48 +07:00
Faisal Salman
ac1f92d3c6 Change license paragraph in readme from GPL2 to MIT 2012-09-14 02:42:11 +07:00
Faisal Salman
eaacb14ef2 Modify mapper 2012-09-13 21:22:00 +07:00
Faisalman
7704570581 Add getUA(), improve regxMap(), add Silk browser, add more older versions of Windows, etc 2012-09-13 18:39:12 +07:00
Faisal Salman
9bb8bdb1b0 Add repository to package.json 2012-09-11 03:02:31 +07:00
Faisal Salman
1f21d35ab8 Restore UAParser 2012-08-04 05:14:17 +07:00
Faisalman
d3668b9c2f Update versioning manually 2012-07-30 07:37:20 +07:00
Faisalman
a243a6a7c3 Make undefined undefined & Add Tizen, Haiku, MeeGo, Nokia 2012-07-30 07:30:43 +07:00
Faisalman
9a9844180d Remove duplicated 2012-07-29 04:20:25 +07:00
Faisalman
a84fb2f93a npm revised package.json 2012-07-29 04:14:52 +07:00
Faisalman
9bc93dc058 Remove duplicated 2012-07-29 02:25:52 +07:00
Faisalman
3d60909f30 Fix conflict with changes 2012-07-28 17:38:21 +07:00
Faisalman
8cb5b173fe Adapt js to be compatible with Node.js as module 2012-07-28 17:28:43 +07:00
Faisalman
faefb6fbb7 Added new browser: Chrome for iOS 2012-07-19 23:14:41 +07:00
Faisalman
5e4d686e3e Tag v0.2.1 2012-07-19 22:45:55 +07:00
Faisalman
f1065dc4f8 Added some devices: Asus, Acer, Dell, Nexus, ZTE 2012-07-19 05:52:11 +07:00
15 changed files with 2190 additions and 270 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules/
npm-debug.log

6
.travis.yml Normal file
View File

@@ -0,0 +1,6 @@
language: node_js
node_js:
- 0.8
- 0.6
notifications:
email: false

37
build/build.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
# dependencies
JSHINT_DIR="node_modules/jshint/bin/jshint"
MOCHA_DIR="node_modules/mocha/bin/mocha"
UGLIFY_DIR="node_modules/uglify-js/bin/uglifyjs"
# check module directory & install if not found
function check_module {
if ! type $2 &> /dev/null
then
echo "$2 is not found"
if ! type "npm" &> /dev/null
then
echo "npm is not installed"
echo "Exiting"
exit 1
else
echo "Installing $1..."
npm install $1
fi
fi
}
check_module "jshint" $JSHINT_DIR
check_module "mocha" $MOCHA_DIR
check_module "uglify-js" $UGLIFY_DIR
echo "Verifiying code..."
$JSHINT_DIR src/ua-parser.js
echo "Running test..."
$MOCHA_DIR -R nyan test/test.js
echo "Minifying script..."
$UGLIFY_DIR src/ua-parser.js > src/ua-parser.min.js
echo "OK"

14
component.json Normal file
View File

@@ -0,0 +1,14 @@
{
"name": "ua-parser-js",
"version": "0.5.25",
"description": "Lightweight JavaScript-based user-agent string parser",
"keywords": ["user-agent", "parser", "browser", "engine", "os", "device"],
"scripts": ["src/ua-parser.js"],
"main": "src/ua-parser.js",
"license": "MIT",
"development": {
"jshint/jshint": "*",
"visionmedia/mocha": "*",
"mishoo/uglifyjs2": "*"
}
}

View File

@@ -1,40 +1,64 @@
{
"title" : "UA-Parser.js",
"name" : "ua-parser-js",
"version" : "0.1.2",
"author" : {
"name" : "Faisal Salman",
"email" : "fyzlman@gmail.com",
"url" : "http://faisalman.com"
},
"description" : "Lightweight JavaScript-based user-agent parser",
"keywords" : [
"title": "UAParser.js",
"name": "ua-parser-js",
"version": "0.5.25",
"author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)",
"description": "Lightweight JavaScript-based user-agent string parser",
"keywords": [
"user-agent",
"parser",
"browser"
"browser",
"engine",
"os",
"device"
],
"homepage" : "http://faisalman.github.com/ua-parser-js",
"homepage": "http://github.com/faisalman/ua-parser-js",
"contributors": [
{
"name" : "Faisal Salman",
"email" : "fyzlman@gmail.com"
}
"Faisal Salman <fyzlman@gmail.com>",
"Christopher De Cairos <chris.decairos@gmail.com>",
"John Tantalo <john.tantalo@gmail.com>",
"Jon Buckley <jon@jbuckley.ca>",
"Lee Treveil <leetreveil@gmail.com>"
],
"main" : "ua-parser.js",
"main": "src/ua-parser.js",
"scripts": {
"test": "./build/build.sh"
},
"devDependencies": {
"jshint": ">= 1.1.0",
"mocha": ">= 1.7.1",
"uglify-js": ">= 1.3.4"
},
"repositories": [
{
"type" : "git",
"url" : "https://github.com/faisalman/ua-parser-js.git"
"type": "git",
"url": "https://github.com/faisalman/ua-parser-js.git"
}
],
"licenses" : [
"repository" :
{
"type": "git",
"url": "https://github.com/faisalman/ua-parser-js.git"
},
"licenses": [
{
"type" : "GPLv2",
"url" : "http://www.gnu.org/licenses/gpl-2.0.html"
"type": "GPLv2",
"url": "http://www.gnu.org/licenses/gpl-2.0.html"
},
{
"type" : "MIT",
"url" : "http://www.opensource.org/licenses/mit-license.php"
"type": "MIT",
"url": "http://www.opensource.org/licenses/mit-license.php"
}
]
],
"engines": {
"node": "*"
},
"directories": {
"lib": "src",
"test": "test"
},
"files": [
""
],
"repository": "git://github.com/faisalman/ua-parser-js.git"
}

231
readme.md
View File

@@ -1,32 +1,98 @@
# UA-Parser.js
# UAParser.js
JavaScript-based user-agent parser
Lightweight JavaScript-based User-Agent string parser. Supports browser & node.js environment. Also available as Component package, Bower package, jQuery.ua, & AMD module
* Author : Faisalman <<fyzlman@gmail.com>>
* Home : http://faisalman.github.com/ua-parser-js
* Source : https://github.com/faisalman/ua-parser-js
* License : GPLv2
[![Build Status](https://travis-ci.org/faisalman/ua-parser-js.png?branch=master)](https://travis-ci.org/faisalman/ua-parser-js)
* Author : Faisalman <<fyzlman@gmail.com>>
* Demo : http://faisalman.github.com/ua-parser-js
* Source : https://github.com/faisalman/ua-parser-js
## Features
Get detailed type and version of web browser, layout engine, and operating system.
Extract detailed type of web browser, layout engine, operating system, and device purely from user-agent string with relatively lightweight footprint (~7KB minified / ~3KB gzipped). Written in vanilla js, which means it doesn't depends on any other library.
![It's over 9000](https://pbs.twimg.com/media/A9LpEG6CIAA5VrT.jpg)
## Methods
* `getBrowser([uastring])`
* `getEngine([uastring])`
* `getOS([uastring])`
* `getBrowser()`
* returns `{ name: '', major: '', version: '' }`
```
# Possible 'browser.name':
Amaya, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome, Chromium,
Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Epiphany, Fennec, Firebird,
Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, Iceweasel,
IE [Mobile], Jasmine, K-Meleon, Konqueror, Kindle, Links, Lunascape, Lynx, Maemo,
Maxthon, Midori, Minimo, [Mobile] Safari, Mosaic, Mozilla, Netfront, Netscape,
NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet], Phoenix, Polaris, RockMelt,
Silk, Skyfire, SeaMonkey, SlimBrowser, Swiftfox, Tizen, UCBrowser, w3m, Yandex
# 'browser.version' & 'browser.major' determined dynamically
```
* `getDevice()`
* returns `{ model: '', type: '', vendor: '' }`
```
# Possible 'device.type':
console, mobile, tablet
# Possible 'device.vendor':
Acer, Alcatel, Apple, Asus, BenQ, BlackBerry, Dell, GeeksPhone, HP, HTC, Huawei,
Lenovo, LG, Meizu, Motorola, Nexian, Nintendo, Nokia, Palm, Panasonic,
RIM, Samsung, Siemens, Sony-Ericsson, Sprint, ZTE
# 'device.model' determined dynamically
```
* `getEngine()`
* returns `{ name: '', version: '' }`
```
# Possible 'engine.name'
Amaya, Gecko, iCab, KHTML, Links, Lynx, NetFront, NetSurf, Presto, Tasman,
Trident, w3m, WebKit
# 'engine.version' determined dynamically
```
* `getOS()`
* returns `{ name: '', version: '' }`
```
# Possible 'os.name'
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,
Joli, Linux, Mac OS, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD, Nintendo,
OpenBSD, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat, RIM Tablet OS,
RISC OS, Slackware, Solaris, SUSE, Symbian, Tizen, Ubuntu, UNIX, WebOS,
Windows [Phone/Mobile], Zenwalk
# 'os.version' determined dynamically
```
* `getResult()`
* returns `{ browser: {}, device: {}, engine: {}, os: {} }`
* `getUA()`
* returns UA string of current instance
* `setUA(uastring)`
* set & parse UA string
## Example
```html
<script type="text/javascript" src="ua-parser.js"></script>
<!doctype html>
<html>
<head>
<script type="text/javascript" src="ua-parser.min.js"></script>
<script type="text/javascript">
var p = new UAParser(); // if no string given as parameter, by default it takes ua string from current browser's window.navigator
console.log(p.result);
var parser = new UAParser();
// by default it takes ua string from current browser's window.navigator.userAgent
console.log(parser.getResult());
/*
/// this will print an object structured like this:
{
@@ -42,30 +108,137 @@ Get detailed type and version of web browser, layout engine, and operating syste
os: {
name: "",
version: ""
},
device: {
model: "",
type: "",
vendor: ""
}
}
*/
// let's test a custom user-agent string as an example
p.setUA("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2");
console.log(p.result.browser); // {name: "Chromium", major: "15", version: "15.0.874.106"}
console.log(p.result.engine); // {name: "AppleWebKit", version: "535.2"}
console.log(p.result.os); // {name: "Ubuntu", version: "11.10"}
var uastring = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2";
parser.setUA(uastring);
var result = parser.getResult();
// this will also produce the same result (without instantiation):
// var result = UAParser(uastring);
console.log(result.browser); // {name: "Chromium", major: "15", version: "15.0.874.106"}
console.log(result.device); // {model: undefined, type: undefined, vendor: undefined}
console.log(result.os); // {name: "Ubuntu", version: "11.10"}
console.log(result.os.version); // "11.10"
console.log(result.engine.name); // "WebKit"
// do some other tests
var uastring2 = "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)";
console.log(parser.setUA(uastring2).getBrowser().name); // "Konqueror"
console.log(parser.getOS()); // {name: "OpenBSD", version: undefined}
console.log(parser.getEngine()); // {name: "KHTML", version: "4.1.4"}
var uastring3 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11';
console.log(parser.setUA(uastring3).getDevice().model); // "PlayBook"
console.log(parser.getOS()) // {name: "RIM Tablet OS", version: "1.0.0"}
console.log(parser.getBrowser().name); // "Safari"
</script>
</head>
<body>
</body>
</html>
```
### Using requirejs
```js
require(['ua-parser'], function(UAParser) {
var parser = new UAParser();
console.log(parser.getResult());
});
```
### Using node.js
```sh
$ npm install ua-parser-js
```
```js
var UAParser = require('ua-parser-js');
var parser = new UAParser();
console.log(parser.getResult());
```
### Using component
```sh
$ component install faisalman/ua-parser-js
```
```js
var UAParser = require('ua-parser-js');
var parser = new UAParser();
console.log(parser.getResult());
```
### Using bower
```sh
$ bower install ua-parser-js
```
### Using jQuery.ua
Although written in vanilla js (which means it doesn't depends on jQuery), if you're using jQuery, this library will automatically detect 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)`.
```js
// In browser with default user-agent: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0':
// Do some tests
console.log($.ua.device); // {vendor: "HTC", model: "Evo Shift 4G", type: "mobile"}
console.log($.ua.os); // {name: "Android", version: "2.3.4"}
console.log($.ua.os.name); // "Android"
console.log($.ua.get()); // "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
// reset to custom user-agent
$.ua.set('Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13');
// Test again
console.log($.ua.browser.name); // "Safari"
console.log($.ua.engine.name); // "Webkit"
console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"}
console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
```
## Development
Install dependencies
```sh
$ npm install jshint
$ npm install mocha
$ npm install uglify-js
```
Verify, test, & minify script
```sh
$ ./build/build.sh
```
## License
Copyright © 2012 Faisalman <<fyzlman@gmail.com>>
Dual licensed under GPLv2 & MIT
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
Copyright © 2012-2013 Faisalman <<fyzlman@gmail.com>>
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

500
src/ua-parser.js Normal file
View File

@@ -0,0 +1,500 @@
// UAParser.js v0.5.25
// Lightweight JavaScript-based User-Agent string parser
// https://github.com/faisalman/ua-parser-js
//
// Copyright © 2012-2013 Faisalman <fyzlman@gmail.com>
// Dual licensed under GPLv2 & MIT
(function (window, undefined) {
'use strict';
//////////////
// Constants
/////////////
var EMPTY = '',
UNKNOWN = '?',
FUNC_TYPE = 'function',
UNDEF_TYPE = 'undefined',
OBJ_TYPE = 'object',
MAJOR = 'major',
MODEL = 'model',
NAME = 'name',
TYPE = 'type',
VENDOR = 'vendor',
VERSION = 'version',
CONSOLE = 'console',
MOBILE = 'mobile',
TABLET = 'tablet';
///////////
// Helper
//////////
var util = {
has : function (str1, str2) {
return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
}
};
///////////////
// Map helper
//////////////
var mapper = {
rgx : function () {
// loop through all regexes maps
for (var result, i = 0, j, k, p, q, matches, match, args = arguments; i < args.length; i += 2) {
var regex = args[i], // even sequence (0,2,4,..)
props = args[i + 1]; // odd sequence (1,3,5,..)
// construct object barebones
if (typeof(result) === UNDEF_TYPE) {
result = {};
for (p in props) {
q = props[p];
if (typeof(q) === OBJ_TYPE) {
result[q[0]] = undefined;
} else {
result[q] = undefined;
}
}
}
// try matching uastring with regexes
for (j = k = 0; j < regex.length; j++) {
matches = regex[j].exec(this.getUA());
if (!!matches) {
for (p in props) {
match = matches[++k];
q = props[p];
// check if given property is actually array
if (typeof(q) === OBJ_TYPE) {
if (q.length == 2) {
// assign given value, ignore regex match
result[q[0]] = q[1];
} else if (q.length == 3) {
// check whether function or regex
if (typeof(q[1]) === FUNC_TYPE && !(q[1].exec && q[1].test)) {
// call function (usually string mapper)
result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
} else {
// sanitize match using given regex
result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
}
}
} else {
result[q] = match ? match : undefined;
}
}
break;
}
}
if(!!matches) break; // break the loop immediately if match found
}
return result;
},
str : function (str, map) {
for (var i in map) {
// check if array
if (typeof(map[i]) === OBJ_TYPE && map[i].length > 0) {
for (var j in map[i]) {
if (util.has(map[i][j], str)) {
return (i === UNKNOWN) ? undefined : i;
}
}
} else if (util.has(map[i], str)) {
return (i === UNKNOWN) ? undefined : i;
}
}
return str;
}
};
///////////////
// String map
//////////////
var maps = {
browser : {
oldsafari : {
major : {
'1' : ['/8', '/1', '/3'],
'2' : '/4',
'?' : '/'
},
version : {
'1.0' : '/8',
'1.2' : '/1',
'1.3' : '/3',
'2.0' : '/412',
'2.0.2' : '/416',
'2.0.3' : '/417',
'2.0.4' : '/419',
'?' : '/'
}
}
},
device : {
sprint : {
model : {
'Evo Shift 4G' : '7373KT'
},
vendor : {
'HTC' : 'APA',
'Sprint' : 'Sprint'
}
}
},
os : {
windows : {
version : {
'ME' : '4.90',
'NT 3.11' : 'NT3.51',
'NT 4.0' : 'NT4.0',
'2000' : 'NT 5.0',
'XP' : ['NT 5.1', 'NT 5.2'],
'Vista' : 'NT 6.0',
'7' : 'NT 6.1',
'8' : 'NT 6.2',
'RT' : 'ARM'
}
}
}
};
//////////////
// Regex map
/////////////
var regexes = {
browser : [[
// Presto based
/(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini
/(opera\s[mobiletab]+).+version\/((\d+)?[\w\.-]+)/i, // Opera Mobi/Tablet
/(opera).+version\/((\d+)?[\w\.]+)/i, // Opera > 9.80
/(opera)[\/\s]+((\d+)?[\w\.]+)/i // Opera < 9.80
], [NAME, VERSION, MAJOR], [
/\s(opr)\/((\d+)?[\w\.]+)/i // Opera Webkit
], [[NAME, 'Opera'], VERSION, MAJOR], [
// Mixed
/(kindle)\/((\d+)?[\w\.]+)/i, // Kindle
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?((\d+)?[\w\.]+)*/i,
// Lunascape/Maxthon/Netfront/Jasmine/Blazer
// Trident based
/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?((\d+)?[\w\.]*)/i,
// Avant/IEMobile/SlimBrowser/Baidu
/ms(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer
// Webkit/KHTML based
/(rekonq)((?:\/)[\w\.]+)*/i, // Rekonq
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt)\/((\d+)?[\w\.-]+)/i
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt
], [NAME, VERSION, MAJOR], [
/(yabrowser)\/((\d+)?[\w\.]+)/i // Yandex
], [[NAME, 'Yandex'], VERSION, MAJOR], [
/(comodo_dragon)\/((\d+)?[\w\.]+)/i // Comodo Dragon
], [[NAME, /_/g, ' '], VERSION, MAJOR], [
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?((\d+)?[\w\.]+)/i
// Chrome/OmniWeb/Arora/Tizen/Nokia
], [NAME, VERSION, MAJOR], [
/(dolfin)\/((\d+)?[\w\.]+)/i // Dolphin
], [[NAME, 'Dolphin'], VERSION, MAJOR], [
/((?:android.+)crmo|crios)\/((\d+)?[\w\.]+)/i // Chrome for Android/iOS
], [[NAME, 'Chrome'], VERSION, MAJOR], [
/version\/((\d+)?[\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
], [VERSION, MAJOR, [NAME, 'Mobile Safari']], [
/version\/((\d+)?[\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
], [VERSION, MAJOR, NAME], [
/webkit.+?(mobile\s?safari|safari)((\/[\w\.]+))/i // Safari < 3.0
], [NAME, [MAJOR, mapper.str, maps.browser.oldsafari.major], [VERSION, mapper.str, maps.browser.oldsafari.version]], [
/(konqueror)\/((\d+)?[\w\.]+)/i, // Konqueror
/(webkit|khtml)\/((\d+)?[\w\.]+)/i
], [NAME, VERSION, MAJOR], [
// Gecko based
/(navigator|netscape)\/((\d+)?[\w\.-]+)/i // Netscape
], [[NAME, 'Netscape'], VERSION, MAJOR], [
/(swiftfox)/i, // Swiftfox
/(iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?((\d+)?[\w\.\+]+)/i,
// Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/((\d+)?[\w\.-]+)/i,
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
/(mozilla)\/((\d+)?[\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
// Other
/(uc\s?browser|polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?((\d+)?[\w\.]+)/i,
// UCBrowser/Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf
/(links)\s\(((\d+)?[\w\.]+)/i, // Links
/(gobrowser)\/?((\d+)?[\w\.]+)*/i, // GoBrowser
/(ice\s?browser)\/v?((\d+)?[\w\._]+)/i, // ICE Browser
/(mosaic)[\/\s]((\d+)?[\w\.]+)/i // Mosaic
], [NAME, VERSION, MAJOR]
],
device : [[
/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
], [MODEL, VENDOR, [TYPE, TABLET]], [
/(hp).+(touchpad)/i, // HP TouchPad
/(kindle)\/([\w\.]+)/i, // Kindle
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook
/(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
], [VENDOR, MODEL, [TYPE, TABLET]], [
/\((ip[honed]+);.+(apple)/i // iPod/iPhone
], [MODEL, VENDOR, [TYPE, MOBILE]], [
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola)[\s_-]?([\w-]+)*/i,
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
/(asus)-?(\w+)/i // Asus
], [VENDOR, MODEL, [TYPE, MOBILE]], [
/\((bb10);\s(\w+)/i // BlackBerry 10
], [[VENDOR, 'BlackBerry'], MODEL, [TYPE, MOBILE]], [
/android.+((transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+))/i // Asus Tablets
], [[VENDOR, 'Asus'], MODEL, [TYPE, TABLET]], [
/(sony)\s(tablet\s[ps])/i // Sony Tablets
], [VENDOR, MODEL, [TYPE, TABLET]], [
/(nintendo)\s([wids3u]+)/i // Nintendo
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
/((playstation)\s[3portablevi]+)/i // Playstation
], [[VENDOR, 'Sony'], MODEL, [TYPE, CONSOLE]], [
/(sprint\s(\w+))/i // Sprint Phones
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
/(zte)-(\w+)*/i, // ZTE
/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|;\ssony)[_\s-]?([\w-]+)*/i
// Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
/\s((milestone|droid[2x]?))[globa\s]*\sbuild\//i, // Motorola
/(mot)[\s-]?(\w+)*/i
], [[VENDOR, 'Motorola'], MODEL, [TYPE, MOBILE]], [
/android.+\s((mz60\d|xoom[\s2]{0,2}))\sbuild\//i
], [[VENDOR, 'Motorola'], MODEL, [TYPE, TABLET]], [
/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n8000|sgh-t8[56]9))/i
], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus))/i,
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
/sec-((sgh\w+))/i
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
/(sie)-(\w+)*/i // Siemens
], [[VENDOR, 'Siemens'], MODEL, [TYPE, MOBILE]], [
/(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
/(nokia)[\s_-]?([\w-]+)*/i
], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
/android\s3\.[\s\w-;]{10}((a\d{3}))/i // Acer
], [[VENDOR, 'Acer'], MODEL, [TYPE, TABLET]], [
/android\s3\.[\s\w-;]{10}(lg?)-([06cv9]{3,4})/i // LG
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
/((nexus\s4))/i,
/(lg)[e;\s-\/]+(\w+)*/i
], [[VENDOR, 'LG'], MODEL, [TYPE, MOBILE]], [
/(mobile|tablet);.+rv\:.+gecko\//i // Unidentifiable
], [TYPE, VENDOR, MODEL]
],
engine : [[
/(presto)\/([\w\.]+)/i, // Presto
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
/(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
], [NAME, VERSION], [
/rv\:([\w\.]+).*(gecko)/i // Gecko
], [VERSION, NAME]
],
os : [[
// Windows based
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
// Mobile/Embedded OS
/\((bb)(10);/i // BlackBerry 10
], [[NAME, 'BlackBerry'], VERSION], [
/(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
/(tizen)\/([\w\.]+)/i, // Tizen
/(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego)[\/\s-]?([\w\.]+)*/i
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo
], [NAME, VERSION], [
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
], [[NAME, 'Symbian'], VERSION],[
/mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
], [[NAME, 'Firefox OS'], VERSION], [
// Console
/(nintendo|playstation)\s([wids3portablevu]+)/i, // Nintendo/Playstation
// GNU/Linux based
/(mint)[\/\s\(]?(\w+)*/i, // Mint
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i,
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk
/(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
/(gnu)\s?([\w\.]+)*/i // GNU
], [NAME, VERSION], [
/(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
], [[NAME, 'Chromium OS'], VERSION],[
// Solaris
/(sunos)\s?([\w\.]+\d)*/i // Solaris
], [[NAME, 'Solaris'], VERSION], [
// BSD based
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
], [NAME, VERSION],[
/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i // iOS
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i // Mac OS
], [NAME, [VERSION, /_/g, '.']], [
// Other
/(haiku)\s(\w+)/i, // Haiku
/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
/(macintosh|mac(?=_powerpc)|plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos)/i,
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS
/(unix)\s?([\w\.]+)*/i // UNIX
], [NAME, VERSION]
]
};
/////////////////
// Constructor
////////////////
var UAParser = function (uastring) {
var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
if (!(this instanceof UAParser)) {
return new UAParser(uastring).getResult();
}
this.getBrowser = function () {
return mapper.rgx.apply(this, regexes.browser);
};
this.getDevice = function () {
return mapper.rgx.apply(this, regexes.device);
};
this.getEngine = function () {
return mapper.rgx.apply(this, regexes.engine);
};
this.getOS = function () {
return mapper.rgx.apply(this, regexes.os);
};
this.getResult = function() {
return {
browser : this.getBrowser(),
engine : this.getEngine(),
os : this.getOS(),
device : this.getDevice()
};
};
this.getUA = function() {
return ua;
};
this.setUA = function (uastring) {
ua = uastring;
return this;
};
this.setUA(ua);
};
///////////
// Export
//////////
// check js environment
if (typeof(exports) !== UNDEF_TYPE) {
// nodejs env
if (typeof(module) !== UNDEF_TYPE && module.exports) {
exports = module.exports = UAParser;
}
exports.UAParser = UAParser;
} else if (typeof(define) === FUNC_TYPE && define.amd) {
// requirejs env
define(function() {
return UAParser;
});
} else {
// browser env
window.UAParser = UAParser;
// jQuery specific (optional)
if (typeof(window.jQuery) !== UNDEF_TYPE) {
var $ = window.jQuery;
var parser = new UAParser();
$.ua = parser.getResult();
$.ua.get = function() {
return parser.getUA();
};
$.ua.set = function(uastring) {
parser.setUA(uastring);
var result = parser.getResult();
for (var prop in result) {
$.ua[prop] = result[prop];
}
};
}
}
})(this);

7
src/ua-parser.min.js vendored Normal file

File diff suppressed because one or more lines are too long

631
test/browser-test.json Normal file
View File

@@ -0,0 +1,631 @@
[
{
"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",
"expect" :
{
"name" : "Arora",
"version" : "0.2",
"major" : "0"
}
},
{
"desc" : "Avant",
"ua" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB5; Avant Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"expect" :
{
"name" : "Avant Browser",
"version" : "undefined",
"major" : "undefined"
}
},
{
"desc" : "Baidu",
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; baidubrowser 1.x)",
"expect" :
{
"name" : "baidubrowser",
"version" : "1.x",
"major" : "1"
}
},
{
"desc" : "Bolt",
"ua" : "Mozilla/5.0 (X11; 78; CentOS; US-en) AppleWebKit/527+ (KHTML, like Gecko) Bolt/0.862 Version/3.0 Safari/523.15",
"expect" :
{
"name" : "Bolt",
"version" : "0.862",
"major" : "0"
}
},
{
"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)",
"expect" :
{
"name" : "Camino",
"version" : "2.0.9",
"major" : "2"
}
},
{
"desc" : "Chimera",
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-PL; rv:1.0.1) Gecko/20021111 Chimera/0.6",
"expect" :
{
"name" : "Chimera",
"version" : "0.6",
"major" : "0"
}
},
{
"desc" : "Chrome",
"ua" : "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"expect" :
{
"name" : "Chrome",
"version" : "20.0.1090.0",
"major" : "20"
}
},
{
"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",
"expect" :
{
"name" : "Chrome",
"version" : "19.0.1084.60",
"major" : "19"
}
},
{
"desc" : "Chromium",
"ua" : "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.10 Chromium/16.0.912.21 Chrome/16.0.912.21 Safari/535.7",
"expect" :
{
"name" : "Chromium",
"version" : "16.0.912.21",
"major" : "16"
}
},
{
"desc" : "Chrome on Android",
"ua" : "Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7",
"expect" :
{
"name" : "Chrome",
"version" : "16.0.912.75",
"major" : "16"
}
},
{
"desc" : "Dillo",
"ua" : "Dillo/2.2",
"expect" :
{
"name" : "Dillo",
"version" : "2.2",
"major" : "2"
}
},
{
"desc" : "Dolphin",
"ua" : "Mozilla/5.0 (SCH-F859/F859DG12;U;NUCLEUS/2.1;Profile/MIDP-2.1 Configuration/CLDC-1.1;480*800;CTC/2.0) Dolfin/2.0",
"expect" :
{
"name" : "Dolphin",
"version" : "2.0",
"major" : "2"
}
},
{
"desc" : "Doris",
"ua" : "Doris/1.15 [en] (Symbian)",
"expect" :
{
"name" : "Doris",
"version" : "1.15",
"major" : "1"
}
},
{
"desc" : "Epiphany",
"ua" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20040628 Epiphany/1.2.6",
"expect" :
{
"name" : "Epiphany",
"version" : "1.2.6",
"major" : "1"
}
},
{
"desc" : "Firebird",
"ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7",
"expect" :
{
"name" : "Firebird",
"version" : "0.7",
"major" : "0"
}
},
{
"desc" : "Firefox",
"ua" : "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2",
"expect" :
{
"name" : "Firefox",
"version" : "15.0a2",
"major" : "15"
}
},
{
"desc" : "Fennec",
"ua" : "Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1",
"expect" :
{
"name" : "Fennec",
"version" : "1.0a1",
"major" : "1"
}
},
{
"desc" : "Flock",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008100716 Firefox/3.0.3 Flock/2.0",
"expect" :
{
"name" : "Flock",
"version" : "2.0",
"major" : "2"
}
},
{
"desc" : "GoBrowser",
"ua" : "Nokia5700XpressMusic/GoBrowser/1.6.91",
"expect" :
{
"name" : "GoBrowser",
"version" : "1.6.91",
"major" : "1"
}
},
{
"desc" : "IceApe",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.19) Gecko/20110817 Iceape/2.0.14",
"expect" :
{
"name" : "Iceape",
"version" : "2.0.14",
"major" : "2"
}
},
{
"desc" : "IceCat",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092921 IceCat/3.0.3-g1",
"expect" :
{
"name" : "IceCat",
"version" : "3.0.3-g1",
"major" : "3"
}
},
{
"desc" : "Iceweasel",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.16) Gecko/2009121610 Iceweasel/3.0.6 (Debian-3.0.6-3)",
"expect" :
{
"name" : "Iceweasel",
"version" : "3.0.6",
"major" : "3"
}
},
{
"desc" : "iCab",
"ua" : "iCab/2.9.5 (Macintosh; U; PPC; Mac OS X)",
"expect" :
{
"name" : "iCab",
"version" : "2.9.5",
"major" : "2"
}
},
{
"desc" : "IEMobile",
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) 320x240; VZW; Motorola-Q9c; Windows Mobile 6.1 Standard",
"expect" :
{
"name" : "IEMobile",
"version" : "7.11",
"major" : "7"
}
},
{
"desc" : "K-Meleon",
"ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2",
"expect" :
{
"name" : "K-Meleon",
"version" : "0.8.2",
"major" : "0"
}
},
{
"desc" : "Kindle Browser",
"ua" : "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.5 (screen 600x800; rotate)",
"expect" :
{
"name" : "Kindle",
"version" : "2.5",
"major" : "2"
}
},
{
"desc" : "Konqueror",
"ua" : "Mozilla/5.0 (compatible; Konqueror/3.5; Linux; X11; x86_64) KHTML/3.5.6 (like Gecko) (Kubuntu)",
"expect" :
{
"name" : "Konqueror",
"version" : "3.5",
"major" : "3"
}
},
{
"desc" : "Lunascape",
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090804 Firefox/3.5.2 Lunascape/5.1.4.5",
"expect" :
{
"name" : "Lunascape",
"version" : "5.1.4.5",
"major" : "5"
}
},
{
"desc" : "Lynx",
"ua" : "Lynx/2.8.5dev.16 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.6b",
"expect" :
{
"name" : "Lynx",
"version" : "2.8.5dev.16",
"major" : "2"
}
},
{
"desc" : "Maemo Browser",
"ua" : "Mozilla/5.0 (X11; U; Linux armv7l; ru-RU; rv:1.9.2.3pre) Gecko/20100723 Firefox/3.5 Maemo Browser 1.7.4.8 RX-51 N900",
"expect" :
{
"name" : "Maemo Browser",
"version" : "1.7.4.8",
"major" : "1"
}
},
{
"desc" : "Maxthon",
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)",
"expect" :
{
"name" : "Maxthon",
"version" : "undefined",
"major" : "undefined"
}
},
{
"desc" : "Midori",
"ua" : "Midori/0.2.2 (X11; Linux i686; U; en-us) WebKit/531.2+",
"expect" :
{
"name" : "Midori",
"version" : "0.2.2",
"major" : "0"
}
},
{
"desc" : "Minimo",
"ua" : "Mozilla/5.0 (X11; U; Linux armv6l; rv 1.8.1.5pre) Gecko/20070619 Minimo/0.020",
"expect" :
{
"name" : "Minimo",
"version" : "0.020",
"major" : "0"
}
},
{
"desc" : "Mobile Safari",
"ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7",
"expect" :
{
"name" : "Mobile Safari",
"version" : "4.0.5",
"major" : "4"
}
},
{
"desc" : "Mosaic",
"ua" : "NCSA_Mosaic/2.6 (X11; SunOS 4.1.3 sun4m)",
"expect" :
{
"name" : "Mosaic",
"version" : "2.6",
"major" : "2"
}
},
{
"desc" : "Mozilla",
"ua" : "Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20070606",
"expect" :
{
"name" : "Mozilla",
"version" : "5.0",
"major" : "5"
}
},
{
"desc" : "MSIE",
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC)",
"expect" :
{
"name" : "IE",
"version" : "5.0b1",
"major" : "5"
}
},
{
"desc" : "NetFront",
"ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
"expect" :
{
"name" : "NetFront",
"version" : "3.0",
"major" : "3"
}
},
{
"desc" : "Netscape on Windows ME",
"ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0",
"expect" :
{
"name" : "Netscape",
"version" : "9.0",
"major" : "9"
}
},
{
"desc" : "Netscape on Windows 2000",
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1",
"expect" :
{
"name" : "Netscape",
"version" : "8.0.1",
"major" : "8"
}
},
{
"desc" : "Nokia Browser",
"ua" : "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/025.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba",
"expect" :
{
"name" : "NokiaBrowser",
"version" : "7.3.1.37",
"major" : "7"
}
},
{
"desc" : "OmniWeb",
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.48",
"expect" :
{
"name" : "OmniWeb",
"version" : "558.48",
"major" : "558"
}
},
{
"desc" : "Opera > 9.80",
"ua" : "Opera/9.80 (X11; Linux x86_64; U; Linux Mint; en) Presto/2.2.15 Version/10.10",
"expect" :
{
"name" : "Opera",
"version" : "10.10",
"major" : "10"
}
},
{
"desc" : "Opera < 9.80 on Windows",
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 6.01 [en]",
"expect" :
{
"name" : "Opera",
"version" : "6.01",
"major" : "6"
}
},
{
"desc" : "Opera < 9.80 on OSX",
"ua" : "Opera/8.5 (Macintosh; PPC Mac OS X; U; en)",
"expect" :
{
"name" : "Opera",
"version" : "8.5",
"major" : "8"
}
},
{
"desc" : "Opera Mobile",
"ua" : "Opera/9.80 (Android 2.3.5; Linux; Opera Mobi/ADR-1111101157; U; de) Presto/2.9.201 Version/11.50",
"expect" :
{
"name" : "Opera Mobi",
"version" : "11.50",
"major" : "11"
}
},
{
"desc" : "Opera Webkit",
"ua" : "Mozilla/5.0 AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.52315",
"expect" :
{
"name" : "Opera",
"version" : "14.0.1025.52315",
"major" : "14"
}
},
{
"desc" : "Opera Mini",
"ua" : "Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25",
"expect" :
{
"name" : "Opera Mini",
"version" : "5.1.21214",
"major" : "5"
}
},
{
"desc" : "Opera Tablet",
"ua" : "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
"expect" :
{
"name" : "Opera Tablet",
"version" : "11.1",
"major" : "11"
}
},
{
"desc" : "Phoenix",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2b) Gecko/20021029 Phoenix/0.4",
"expect" :
{
"name" : "Phoenix",
"version" : "0.4",
"major" : "0"
}
},
{
"desc" : "Polaris",
"ua" : "LG-LX600 Polaris/6.0 MMP/2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1",
"expect" :
{
"name" : "Polaris",
"version" : "6.0",
"major" : "6"
}
},
{
"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",
"expect" :
{
"name" : "RockMelt",
"version" : "0.8.36.78",
"major" : "0"
}
},
{
"desc" : "Safari",
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8",
"expect" :
{
"name" : "Safari",
"version" : "5.0.1",
"major" : "5"
}
},
{
"desc" : "Safari < 3.0",
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3",
"expect" :
{
"name" : "Safari",
"version" : "2.0.4",
"major" : "2"
}
},
{
"desc" : "SeaMonkey",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 SeaMonkey/2.0b1pre",
"expect" :
{
"name" : "SeaMonkey",
"version" : "2.0b1pre",
"major" : "2"
}
},
{
"desc" : "Silk Browser",
"ua" : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-84)",
"expect" :
{
"name" : "Silk",
"version" : "1.1.0-84",
"major" : "1"
}
},
{
"desc" : "Skyfire",
"ua" : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17 Skyfire/2.0",
"expect" :
{
"name" : "Skyfire",
"version" : "2.0",
"major" : "2"
}
},
{
"desc" : "SlimBrowser",
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SlimBrowser)",
"expect" :
{
"name" : "SlimBrowser",
"version" : "undefined",
"major" : "undefined"
}
},
{
"desc" : "Swiftfox",
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 (Swiftfox)",
"expect" :
{
"name" : "Swiftfox",
"version" : "undefined",
"major" : "undefined"
}
},
{
"desc" : "Tizen Browser",
"ua" : "Mozilla/5.0 (Linux; U; Tizen/1.0 like Android; en-us; AppleWebKit/534.46 (KHTML, like Gecko) Tizen Browser/1.0 Mobile",
"expect" :
{
"name" : "Tizen Browser",
"version" : "1.0",
"major" : "1"
}
},
{
"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",
"expect" :
{
"name" : "UCBrowser",
"version" : "8.2.1.144",
"major" : "8"
}
},
{
"desc" : "UC Browser on Nokia",
"ua" : "Mozilla/5.0 (S60V3; U; en-in; NokiaN73)/UC Browser8.4.0.159/28/351/UCWEB Mobile",
"expect" :
{
"name" : "UC Browser",
"version" : "8.4.0.159",
"major" : "8"
}
},
{
"desc" : "Yandex",
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5",
"expect" :
{
"name" : "Yandex",
"version" : "1.0.1084.5402",
"major" : "1"
}
}]

21
test/device-test.json Normal file
View File

@@ -0,0 +1,21 @@
[
{
"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",
"expect" :
{
"vendor" : "HTC",
"model" : "Evo Shift 4G",
"type" : "mobile"
}
},
{
"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",
"expect" :
{
"vendor" : "LG",
"model" : "Nexus 4",
"type" : "mobile"
}
}]

64
test/engine-test.json Normal file
View File

@@ -0,0 +1,64 @@
[
{
"desc" : "Gecko",
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre",
"expect" :
{
"name" : "Gecko",
"version" : "2.0b9pre"
}
},
{
"desc" : "KHTML",
"ua" : "Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)",
"expect" :
{
"name" : "KHTML",
"version" : "4.5.4"
}
},
{
"desc" : "NetFront",
"ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
"expect" :
{
"name" : "NetFront",
"version" : "3.0"
}
},
{
"desc" : "Presto",
"ua" : "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
"expect" :
{
"name" : "Presto",
"version" : "2.8.149"
}
},
{
"desc" : "Tasman",
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; PPC Mac OS X 10.4.7; Tasman 1.0)",
"expect" :
{
"name" : "Tasman",
"version" : "1.0"
}
},
{
"desc" : "Trident",
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
"expect" :
{
"name" : "Trident",
"version" : "6.0"
}
},
{
"desc" : "WebKit",
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4",
"expect" :
{
"name" : "WebKit",
"version" : "533.19.4"
}
}]

568
test/os-test.json Normal file
View File

@@ -0,0 +1,568 @@
[
{
"desc" : "Windows 95",
"ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)",
"expect" :
{
"name" : "Windows",
"version" : "95"
}
},
{
"desc" : "Windows 98",
"ua" : "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)",
"expect" :
{
"name" : "Windows",
"version" : "98"
}
},
{
"desc" : "Windows ME",
"ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90) Gecko/20020502 CS 2000 7.0/7.0",
"expect" :
{
"name" : "Windows",
"version" : "ME"
}
},
{
"desc" : "Windows 2000",
"ua" : "Mozilla/3.0 (compatible; MSIE 3.0; Windows NT 5.0)",
"expect" :
{
"name" : "Windows",
"version" : "2000"
}
},
{
"desc" : "Windows XP",
"ua" : "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 5.2)",
"expect" :
{
"name" : "Windows",
"version" : "XP"
}
},
{
"desc" : "Windows Vista",
"ua" : "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)",
"expect" :
{
"name" : "Windows",
"version" : "Vista"
}
},
{
"desc" : "Windows 7",
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
"expect" :
{
"name" : "Windows",
"version" : "7"
}
},
{
"desc" : "Windows 8",
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; .NET4.0E; .NET4.0C)",
"expect" :
{
"name" : "Windows",
"version" : "8"
}
},
{
"desc" : "Windows RT",
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)",
"expect" :
{
"name" : "Windows",
"version" : "RT"
}
},
{
"desc" : "Windows CE",
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
"expect" :
{
"name" : "Windows",
"version" : "CE"
}
},
{
"desc" : "Windows Mobile",
"ua" : "Mozilla/5.0 (ZTE-E_N72/N72V1.0.0B02;U;Windows Mobile/6.1;Profile/MIDP-2.0 Configuration/CLDC-1.1;320*240;CTC/2.0) IE/6.0 (compatible; MSIE 4.01; Windows CE; PPC)/UC Browser7.7.1.88",
"expect" :
{
"name" : "Windows Mobile",
"version" : "6.1"
}
},
{
"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)",
"expect" :
{
"name" : "Windows Phone OS",
"version" : "7.0"
}
},
{
"desc" : "Windows Phone 8",
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8X by HTC)",
"expect" :
{
"name" : "Windows Phone",
"version" : "8.0"
}
},
{
"desc" : "BlackBerry",
"ua" : "BlackBerry9300/5.0.0.912 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/378",
"expect" :
{
"name" : "BlackBerry",
"version" : "5.0.0.912"
}
},
{
"desc" : "BlackBerry 10",
"ua" : "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.386 Mobile Safari/537.3+",
"expect" :
{
"name" : "BlackBerry",
"version" : "10"
}
},
{
"desc" : "Tizen",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Android",
"ua" : "Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; VM670 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko)",
"expect" :
{
"name" : "Android",
"version" : "2.2.2"
}
},
{
"desc" : "WebOS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Palm OS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "QNX",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Bada",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "RIM Tablet OS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "MeeGo",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Symbian",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Firefox OS",
"ua" : "Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0",
"expect" :
{
"name" : "Firefox OS",
"version" : "undefined"
}
},
{
"desc" : "Nintendo",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "PlayStation",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Mint",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Joli",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Ubuntu",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Debian",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "OpenSUSE",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Gentoo",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Arch",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Slackware",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Fedora",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Mandriva",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "CentOS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "PCLinuxOS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "RedHat",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Zenwalk",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Hurd",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Linux",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "GNU",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Chromium OS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Solaris",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "FreeBSD",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "OpenBSD",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "NetBSD",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "DragonFly",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"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",
"expect" :
{
"name" : "iOS",
"version" : "5.1.1"
}
},
{
"desc" : "iOS with Opera Mini",
"ua" : "Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10",
"expect" :
{
"name" : "iOS",
"version" : "undefined"
}
},
{
"desc" : "Mac OS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Haiku",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "AIX",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Plan9",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "Minix",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "BeOS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "OS/2",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "AmigaOS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "MorphOS",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "UNIX",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
},
{
"desc" : "",
"ua" : "",
"expect" :
{
"name" : "",
"version" : ""
}
}]

58
test/test.js Normal file
View File

@@ -0,0 +1,58 @@
var assert = require('assert');
var UAParser = require('./../src/ua-parser');
var browsers = require('./browser-test.json');
var devices = require('./device-test.json');
var engines = require('./engine-test.json');
var os = require('./os-test.json');
var parser = new UAParser();
var methods = [
{
title : 'getBrowser',
label : 'browser',
list : browsers,
properties : ['name', 'major', 'version']
},
{
title : 'getDevice',
label : 'device',
list : devices,
properties : ['model', 'type', 'vendor']
},
{
title : 'getEngine',
label : 'engine',
list : engines,
properties : ['name', 'version']
},
{
title : 'getOS',
label : 'os',
list : os,
properties : ['name', 'version']
}];
describe('UAParser()', function () {
var ua = 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6';
assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
});
for (var i in methods) {
describe(methods[i]['title'], function () {
for (var j in methods[i]['list']) {
if (!!methods[i]['list'][j].ua) {
describe('[' + methods[i]['list'][j].desc + ']', function () {
describe('"' + methods[i]['list'][j].ua + '"', function () {
var expect = methods[i]['list'][j].expect;
var result = parser.setUA(methods[i]['list'][j].ua).getResult()[methods[i]['label']];
for (var k in methods[i]['properties']) {
var m = methods[i]['properties'][k];
it('should return ' + methods[i]['label'] + ' ' + m + ': ' + expect[m], function () {
assert.equal(result[m], expect[m] != 'undefined' ? expect[m] : undefined);
});
}
});
});
}
}
});
}

31
ua-parser-js.jquery.json Normal file
View File

@@ -0,0 +1,31 @@
{
"title": "UAParser.js",
"name": "ua-parser-js",
"version": "0.5.25",
"description": "Lightweight JavaScript-based user-agent string parser",
"keywords": [
"user-agent",
"parser",
"browser",
"engine",
"os",
"device"
],
"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/src/ua-parser.min.js"
}

View File

@@ -1,216 +0,0 @@
// UA-Parser.js v0.2.0
// Lightweight JavaScript-based user-agent parser
// https://github.com/faisalman/ua-parser-js
//
// Copyright © 2012 Faisalman
// Licensed under GPLv2
function UAParser (uastring) {
var ua = uastring || window.navigator.userAgent;
// regexp mapper
var regxMap = function (ua) {
var result;
var i, j, k, l;
for (i = 1; i < arguments.length; i += 2) {
var regex = arguments[i];
var props = arguments[i + 1];
var isMatchFound = false;
for (j = 0; j < regex.length; j++) {
var match = regex[j].exec(ua);
//console.log(match);
if (!!match) {
result = {};
l = 1;
for (k = 0; k < props.length; k++) {
if (typeof props[k] === 'object' && props[k].length === 2) {
result[props[k][0]] = props[k][1];
l -= 1;
} else if (typeof props[k] === 'object' && props[k].length === 3) {
result[props[k][0]] = (!!match[k + l]) ? match[k + l].replace(props[k][1], props[k][2]) : undefined;
} else {
result[props[k]] = (!!match[k + l]) ? match[k + l] : undefined;
}
}
isMatchFound = true;
break;
}
}
if (!isMatchFound) {
result = {};
for (k in props) {
if (props.hasOwnProperty(k)) {
if (typeof props[k] == 'object') {
result[props[k][0]] = undefined;
} else {
result[props[k]] = undefined;
}
}
}
} else {
return result;
}
}
return result;
};
var mapper = {
os : {
win: function (str, match) {
switch (match.toLowerCase()) {
case 'nt 5.0':
return '2000';
case 'nt 5.1':
case 'nt 5.2':
return 'XP';
case 'nt 6.0':
return 'Vista';
case 'nt 6.1':
return '7';
case 'nt 6.2':
return '8';
default:
return match;
};
}
}
};
this.getBrowser = function (uastring) {
return regxMap(uastring || ua, [
// Mixed
/(kindle)\/((\d+)?[\w\.]+)/i, // Kindle
/(lunascape|maxthon|netfront|jasmine)[\/\s]?((\d+)?[\w\.]+)/i, // Lunascape/Maxthon/Netfront/Jasmine
// Presto based
/(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini
/(opera\smobi)\/((\d+)?[\w\.-]+)/i, // Opera Mobile
/(opera).*\/((\d+)?[\w\.]+)/i, // Opera
// Trident based
/(avant\sbrowser|iemobile|slimbrowser)[\/\s]?((\d+)?[\w\.]*)/i, // Avant/IEMobile/SlimBrowser
/ms(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer
// Webkit/KHTML based
/(chromium|flock|rockmelt|midori|epiphany)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany
/(chrome|omniweb|arora|dolfin)\/((\d+)?[\w\.]+)/i, // Chrome/OmniWeb/Arora/Dolphin
], ['name', 'version', 'major'], [
/android.+crmo\/((\d+)?[\w\.]+)/i, // Chrome for Android
], [['name', 'Chrome'], 'version', 'major'], [
/(mobile\ssafari|safari|konqueror)\/((\d+)?[\w\.]+)/i, // Safari/Konqueror
/(applewebkit|khtml)\/((\d+)?[\w\.]+)/i,
// Gecko based
/(iceweasel|camino|fennec|maemo|minimo)[\/\s]?((\d+)?[\w\.\+]+)/i, // Iceweasel/Camino/Fennec/Maemo/Minimo
/(firefox|seamonkey|netscape|navigator|k-meleon|icecat|iceape)\/((\d+)?[\w\.]+)/i,
// Firefox/SeaMonkey/Netscape/K-Meleon/IceCat/IceApe
/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
// Other
/(lynx|dillo|icab)[\/\s]?((\d+)?[\w\.]+)/i, // Lynx/Dillo/iCab
], ['name', 'version', 'major']);
};
this.getEngine = function (uastring) {
return regxMap(uastring || ua, [
/(presto)\/([\w\.]+)/i, // Presto
/([aple]*webkit|trident)\/([\w\.]+)/i, // Webkit/Trident
/(khtml)\/([\w\.]+)/i // KHTML
], ['name', 'version'], [
/rv\:([\w\.]+).*(gecko)/i // Gecko
], ['version', 'name']);
};
this.getOS = function (uastring) {
return regxMap(uastring || ua, [
// Windows based
/(windows\sphone\sos|windows)\s+([\w\.\s]+)*/i, // Windows
], ['name', ['version', /(nt\s[\d\.]+)/gi, mapper.os.win]], [
// Mobile/Embedded OS
/(blackberry).+version\/([\w\.]+)/i, // Blackberry
/(android|symbianos|symbos|webos|palm\os|qnx|bada|rim\stablet\sos)[\/\s-]?([\w\.]+)*/i,
// Android/Symbian/WebOS/Palm/QNX/Bada/RIM
/(nintendo|playstation)\s([wids3portable]+)/i, // Nintendo/Playstation
// GNU/Linux based
/(mint)[\/\s\(]?(\w+)*/i, // Mint
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i,
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk
/(gnu|linux)\s?([\w\.]+)*/i // Other GNU/Linux
], ['name', 'version'], [
/cros\s([\w\.\s]+)/i // Chromium OS
], [['name', 'Chromium OS'], 'version'],[
// Solaris
/sunos\s?([\w\.\s]+)*/i // Solaris
], [['name', 'Solaris'], 'version'], [
// BSD based
/\s(\w*bsd|dragonfly)\s?([\w\.]+)*/i, // FreeBSD/NetBSD/OpenBSD/DragonFly
], ['name', 'version'],[
/(ip[honead]+).*os\s*([\w]+)*\slike\smac/i // iOS
], [['name', /.+/g, 'iOS'], ['version', /_/g, '.']], [
/(mac\sos)\sx\s([\w\s\.]+)/i, // Mac OS
], ['name', ['version', /_/g, '.']], [
// Other
/(macintosh|unix|minix|beos)[\/\s]?()*/i
], ['name', 'version']);
};
this.getDevice = function (uastring) {
return regxMap(uastring || ua, [
/\((ip[honead]+|playbook);/i, // iPod/iPhone/iPad/PlayBook
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
/(blackberry|benq|nokia|palm(?=\-)|sonyericsson)[\s-]?([\w-]+)*/i, // BenQ/Nokia/Palm/Sony-Ericsson
/(hp)\s([\w\s]+)/i, // HP iPAQ
/(hp).+(touchpad)/i, // HP TouchPad
/(kindle)\/([\w\.]+)/i, // Kindle
/(lg)[e;\s-]+(\w+)*/i, // LG
/(nintendo|playstation)\s([wids3portable]+)/i // Nintendo/Playstation
], ['name', 'version'], [
/(htc)[;_\s-]+([\w\s]+(?=\))|[\w]+)*/i, // HTC
/(zte)-([\w]+)*/i
], ['name', ['version', /_/g, ' ']], [
/\s(milestone|mz601|droid[2x]?|xoom)[globa\s]*\sbuild\//i, // Motorola
/mot[\s-]?(\w+)*/i
], [['name', 'Motorola'], 'version'], [
/(s[cgp]h-\w+|gt-\w+|galaxy\snexus)/i, // Samsung
/sam[sung]*[\s-]*(\w+-?[\w-]*)*/i,
/sec-(sgh\w+)/i
], [['name', 'Samsung'], 'version'], [
/sie-(\w+)*/i // Siemens
], [['name', 'Siemens'], 'version']);
};
this.setUA = function (uastring) {
ua = uastring || ua;
return this.result = {
browser : this.getBrowser(),
engine : this.getEngine(),
os : this.getOS(),
device : this.getDevice()
};
};
this.setUA(ua);
};