mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-09-27 07:58:45 +03:00
Merge branch 'master' into gpu-detect-experimental
This commit is contained in:
commit
e9c651dbd6
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.19",
|
"version": "0.7.20",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Faisal Salman <fyzlman@gmail.com>"
|
"Faisal Salman <f@faisalman.com>"
|
||||||
],
|
],
|
||||||
"private": false,
|
"private": false,
|
||||||
"main": "src/ua-parser.js",
|
"main": "src/ua-parser.js",
|
||||||
|
8
dist/ua-parser.min.js
vendored
8
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
8
dist/ua-parser.pack.js
vendored
8
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2012-2018 Faisal Salman <<f@faisalman.com>>
|
Copyright (c) 2012-2019 Faisal Salman <<f@faisalman.com>>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
Package.describe({
|
Package.describe({
|
||||||
name: 'faisalman:ua-parser-js',
|
name: 'faisalman:ua-parser-js',
|
||||||
version: '0.7.19',
|
version: '0.7.20',
|
||||||
summary: 'Lightweight JavaScript-based user-agent string parser',
|
summary: 'Lightweight JavaScript-based user-agent string parser',
|
||||||
git: 'https://github.com/faisalman/ua-parser-js.git',
|
git: 'https://github.com/faisalman/ua-parser-js.git',
|
||||||
documentation: 'readme.md'
|
documentation: 'readme.md'
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "0.7.19",
|
"version": "0.7.20",
|
||||||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
||||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@ -125,7 +125,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/faisalman/ua-parser-js.git"
|
"url": "https://github.com/faisalman/ua-parser-js.git"
|
||||||
},
|
},
|
||||||
"license": "(GPL-2.0 OR MIT)",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "*"
|
"node": "*"
|
||||||
},
|
},
|
||||||
|
28
readme.md
28
readme.md
@ -259,18 +259,6 @@ $ npm install --save @types/ua-parser-js
|
|||||||
# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js
|
# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js
|
||||||
```
|
```
|
||||||
|
|
||||||
## Using CLI
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ node ua-parser.min.js "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)"
|
|
||||||
# multiple args
|
|
||||||
$ node ua-parser.min.js "Opera/1.2" "Opera/3.4"
|
|
||||||
# piped args
|
|
||||||
$ echo "Opera/1.2" | node ua-parser.min.js
|
|
||||||
# log file
|
|
||||||
$ cat ua.log | node ua-parser.min.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## Using jQuery/Zepto ($.ua)
|
## Using jQuery/Zepto ($.ua)
|
||||||
|
|
||||||
Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery/Zepto is present and create `$.ua` object based on browser's user-agent (although in case you need, `window.UAParser` constructor is still present). To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
|
Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery/Zepto is present and create `$.ua` object based on browser's user-agent (although in case you need, `window.UAParser` constructor is still present). To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
|
||||||
@ -343,16 +331,16 @@ Do you use & like UAParser.js but you don’t find a way to show some love? If y
|
|||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
Dual licensed under GPLv2 or MIT
|
MIT License
|
||||||
|
|
||||||
Copyright © 2012-2018 Faisal Salman <<f@faisalman.com>>
|
Copyright (c) 2012-2019 Faisal Salman <<f@faisalman.com>>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
the Software without restriction, including without limitation the rights to use,
|
in the Software without restriction, including without limitation the rights
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
Software, and to permit persons to whom the Software is furnished to do so,
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
283
src/ua-parser.js
283
src/ua-parser.js
@ -1,10 +1,10 @@
|
|||||||
/*!
|
/*!
|
||||||
* UAParser.js v0.7.19
|
* UAParser.js v0.7.20
|
||||||
* Lightweight JavaScript-based User-Agent string parser
|
* Lightweight JavaScript-based User-Agent string parser
|
||||||
* https://github.com/faisalman/ua-parser-js
|
* https://github.com/faisalman/ua-parser-js
|
||||||
*
|
*
|
||||||
* Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
|
* Copyright © 2012-2019 Faisal Salman <f@faisalman.com>
|
||||||
* Dual licensed under GPLv2 or MIT
|
* Licensed under MIT License
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(function (window, undefined) {
|
(function (window, undefined) {
|
||||||
@ -16,7 +16,7 @@
|
|||||||
/////////////
|
/////////////
|
||||||
|
|
||||||
|
|
||||||
var LIBVERSION = '0.7.19',
|
var LIBVERSION = '0.7.20',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@ -45,15 +45,15 @@
|
|||||||
|
|
||||||
var util = {
|
var util = {
|
||||||
extend : function (regexes, extensions) {
|
extend : function (regexes, extensions) {
|
||||||
var margedRegexes = {};
|
var mergedRegexes = {};
|
||||||
for (var i in regexes) {
|
for (var i in regexes) {
|
||||||
if (extensions[i] && extensions[i].length % 2 === 0) {
|
if (extensions[i] && extensions[i].length % 2 === 0) {
|
||||||
margedRegexes[i] = extensions[i].concat(regexes[i]);
|
mergedRegexes[i] = extensions[i].concat(regexes[i]);
|
||||||
} else {
|
} else {
|
||||||
margedRegexes[i] = regexes[i];
|
mergedRegexes[i] = regexes[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return margedRegexes;
|
return mergedRegexes;
|
||||||
},
|
},
|
||||||
has : function (str1, str2) {
|
has : function (str1, str2) {
|
||||||
if (typeof str1 === "string") {
|
if (typeof str1 === "string") {
|
||||||
@ -83,14 +83,7 @@
|
|||||||
|
|
||||||
rgx : function (ua, arrays) {
|
rgx : function (ua, arrays) {
|
||||||
|
|
||||||
//var result = {},
|
var i = 0, j, k, p, q, matches, match;
|
||||||
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 < arrays.length && !matches) {
|
while (i < arrays.length && !matches) {
|
||||||
@ -138,8 +131,6 @@
|
|||||||
}
|
}
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
// console.log(this);
|
|
||||||
//return this;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
str : function (str, map) {
|
str : function (str, map) {
|
||||||
@ -264,7 +255,7 @@
|
|||||||
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
|
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
|
||||||
], [[NAME, 'IE'], VERSION], [
|
], [[NAME, 'IE'], VERSION], [
|
||||||
|
|
||||||
/(edge|edgios|edga)\/((\d+)?[\w\.]+)/i // Microsoft Edge
|
/(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
|
||||||
], [[NAME, 'Edge'], VERSION], [
|
], [[NAME, 'Edge'], VERSION], [
|
||||||
|
|
||||||
/(yabrowser)\/([\w\.]+)/i // Yandex
|
/(yabrowser)\/([\w\.]+)/i // Yandex
|
||||||
@ -285,6 +276,9 @@
|
|||||||
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
||||||
], [[NAME, /_/g, ' '], VERSION], [
|
], [[NAME, /_/g, ' '], VERSION], [
|
||||||
|
|
||||||
|
/(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
|
||||||
|
], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
|
||||||
|
|
||||||
/(micromessenger)\/([\w\.]+)/i // WeChat
|
/(micromessenger)\/([\w\.]+)/i // WeChat
|
||||||
], [[NAME, 'WeChat'], VERSION], [
|
], [[NAME, 'WeChat'], VERSION], [
|
||||||
|
|
||||||
@ -334,6 +328,9 @@
|
|||||||
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
||||||
], [VERSION, [NAME, 'Android Browser']], [
|
], [VERSION, [NAME, 'Android Browser']], [
|
||||||
|
|
||||||
|
/(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
|
||||||
|
], [[NAME, 'Sailfish Browser'], VERSION], [
|
||||||
|
|
||||||
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
|
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
|
||||||
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
@ -384,117 +381,6 @@
|
|||||||
/(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
|
/(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
|
||||||
/(mosaic)[\/\s]([\w\.]+)/i // Mosaic
|
/(mosaic)[\/\s]([\w\.]+)/i // Mosaic
|
||||||
], [NAME, VERSION]
|
], [NAME, VERSION]
|
||||||
|
|
||||||
/* /////////////////////
|
|
||||||
// Media players BEGIN
|
|
||||||
////////////////////////
|
|
||||||
|
|
||||||
, [
|
|
||||||
|
|
||||||
/(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
|
|
||||||
/(coremedia) v((\d+)[\w\._]+)/i
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
|
|
||||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
|
|
||||||
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
|
||||||
/(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
|
|
||||||
/(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
|
|
||||||
/player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
/(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
|
|
||||||
], [[NAME, 'Flip Player'], VERSION], [
|
|
||||||
|
|
||||||
/(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
|
|
||||||
// FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
|
|
||||||
], [NAME], [
|
|
||||||
|
|
||||||
/(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
|
|
||||||
// Gstreamer
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
|
|
||||||
/(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
|
|
||||||
// Java/urllib/requests/wget/cURL
|
|
||||||
/(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
|
|
||||||
], [[NAME, /_/g, ' '], VERSION], [
|
|
||||||
|
|
||||||
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
|
|
||||||
// MPlayer SVN
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(mplayer)/i, // MPlayer (no other info)
|
|
||||||
/(yourmuze)/i, // YourMuze
|
|
||||||
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
|
|
||||||
], [NAME], [
|
|
||||||
|
|
||||||
/(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
|
|
||||||
/(winamp)\s((\d+)[\w\.-]+)/i,
|
|
||||||
/(winamp)mpeg\/((\d+)[\w\.-]+)/i
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
|
||||||
// inlight radio
|
|
||||||
], [NAME], [
|
|
||||||
|
|
||||||
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
|
|
||||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
|
||||||
// SoundTap/Totem/Stagefright/Streamium
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(smp)((\d+)[\d\.]+)/i // SMP
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
|
|
||||||
/(vlc)\/((\d+)[\w\.-]+)/i,
|
|
||||||
/(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
|
|
||||||
/(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
|
|
||||||
/(itunes)\/((\d+)[\d\.]+)/i // iTunes
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
|
|
||||||
/(windows-media-player)\/((\d+)[\w\.-]+)/i
|
|
||||||
], [[NAME, /-/g, ' '], VERSION], [
|
|
||||||
|
|
||||||
/windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
|
|
||||||
// Windows Media Server
|
|
||||||
], [VERSION, [NAME, 'Windows']], [
|
|
||||||
|
|
||||||
/(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
|
|
||||||
], [NAME, VERSION], [
|
|
||||||
|
|
||||||
/(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
|
|
||||||
/(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
|
|
||||||
], [[NAME, 'rad.io'], VERSION]
|
|
||||||
|
|
||||||
//////////////////////
|
|
||||||
// Media players END
|
|
||||||
////////////////////*/
|
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
cpu : [[
|
cpu : [[
|
||||||
@ -585,13 +471,10 @@
|
|||||||
/(sprint\s(\w+))/i // Sprint Phones
|
/(sprint\s(\w+))/i // Sprint Phones
|
||||||
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
|
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
|
|
||||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
|
||||||
|
|
||||||
/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
|
/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
|
||||||
/(zte)-(\w*)/i, // ZTE
|
/(zte)-(\w*)/i, // ZTE
|
||||||
/(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
|
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
|
||||||
// Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
|
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
||||||
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/(nexus\s9)/i // HTC Nexus 9
|
/(nexus\s9)/i // HTC Nexus 9
|
||||||
@ -658,8 +541,12 @@
|
|||||||
/android.+lg(\-?[\d\w]+)\s+build/i
|
/android.+lg(\-?[\d\w]+)\s+build/i
|
||||||
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
|
/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
|
||||||
|
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||||
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
|
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
|
||||||
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
|
||||||
|
/(lenovo)[_\s-]?([\w-]+)/i
|
||||||
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/linux;.+((jolla));/i // Jolla
|
/linux;.+((jolla));/i // Jolla
|
||||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||||
@ -679,19 +566,20 @@
|
|||||||
/android.+;\s(pixel c)[\s)]/i // Google Pixel C
|
/android.+;\s(pixel c)[\s)]/i // Google Pixel C
|
||||||
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
||||||
|
|
||||||
/android.+;\s(pixel( [23])?( xl)?)\s/i // Google Pixel
|
/android.+;\s(pixel( [23])?( xl)?)[\s)]/i // Google Pixel
|
||||||
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
|
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
/android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
||||||
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
||||||
/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i, // Xiaomi Mi
|
/android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,
|
||||||
|
// Xiaomi Mi
|
||||||
/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
|
/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
|
||||||
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
||||||
/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
|
/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
|
||||||
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
|
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
|
||||||
/android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
|
/android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
|
||||||
], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
|
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
|
||||||
/(mz)-([\w-]{2,})/i // Meizu Phone
|
/(mz)-([\w-]{2,})/i
|
||||||
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
|
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
|
||||||
|
|
||||||
/android.+a000(1)\s+build/i, // OnePlus
|
/android.+a000(1)\s+build/i, // OnePlus
|
||||||
@ -774,58 +662,6 @@
|
|||||||
|
|
||||||
/(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
|
/(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
|
||||||
], [MODEL, [VENDOR, 'Generic']]
|
], [MODEL, [VENDOR, 'Generic']]
|
||||||
|
|
||||||
|
|
||||||
/*//////////////////////////
|
|
||||||
// TODO: move to string map
|
|
||||||
////////////////////////////
|
|
||||||
|
|
||||||
/(C6603)/i // Sony Xperia Z C6603
|
|
||||||
], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
|
||||||
/(C6903)/i // Sony Xperia Z 1
|
|
||||||
], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
|
||||||
|
|
||||||
/(SM-G900[F|H])/i // Samsung Galaxy S5
|
|
||||||
], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
|
||||||
/(SM-G7102)/i // Samsung Galaxy Grand 2
|
|
||||||
], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
|
||||||
/(SM-G530H)/i // Samsung Galaxy Grand Prime
|
|
||||||
], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
|
||||||
/(SM-G313HZ)/i // Samsung Galaxy V
|
|
||||||
], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
|
||||||
/(SM-T805)/i // Samsung Galaxy Tab S 10.5
|
|
||||||
], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
|
||||||
/(SM-G800F)/i // Samsung Galaxy S5 Mini
|
|
||||||
], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
|
||||||
/(SM-T311)/i // Samsung Galaxy Tab 3 8.0
|
|
||||||
], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
|
||||||
|
|
||||||
/(T3C)/i // Advan Vandroid T3C
|
|
||||||
], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
|
|
||||||
/(ADVAN T1J\+)/i // Advan Vandroid T1J+
|
|
||||||
], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
|
|
||||||
/(ADVAN S4A)/i // Advan Vandroid S4A
|
|
||||||
], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
|
|
||||||
|
|
||||||
/(V972M)/i // ZTE V972M
|
|
||||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
|
||||||
|
|
||||||
/(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
|
|
||||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
|
||||||
/(IQ6.3)/i // i-mobile IQ IQ 6.3
|
|
||||||
], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
|
|
||||||
/(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
|
|
||||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
|
||||||
/(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
|
|
||||||
], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
|
|
||||||
|
|
||||||
/(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
|
|
||||||
], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
|
|
||||||
|
|
||||||
/////////////
|
|
||||||
// END TODO
|
|
||||||
///////////*/
|
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
engine : [[
|
engine : [[
|
||||||
@ -878,9 +714,8 @@
|
|||||||
], [[NAME, 'BlackBerry'], VERSION], [
|
], [[NAME, 'BlackBerry'], VERSION], [
|
||||||
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
|
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
|
||||||
/(tizen)[\/\s]([\w\.]+)/i, // Tizen
|
/(tizen)[\/\s]([\w\.]+)/i, // Tizen
|
||||||
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]*)/i,
|
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
|
||||||
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
|
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
|
||||||
/linux;.+(sailfish);/i // Sailfish OS
|
|
||||||
], [NAME, VERSION], [
|
], [NAME, VERSION], [
|
||||||
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
|
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
|
||||||
], [[NAME, 'Symbian'], VERSION], [
|
], [[NAME, 'Symbian'], VERSION], [
|
||||||
@ -938,22 +773,6 @@
|
|||||||
/////////////////
|
/////////////////
|
||||||
// Constructor
|
// Constructor
|
||||||
////////////////
|
////////////////
|
||||||
/*
|
|
||||||
var Browser = function (name, version) {
|
|
||||||
this[NAME] = name;
|
|
||||||
this[VERSION] = version;
|
|
||||||
};
|
|
||||||
var CPU = function (arch) {
|
|
||||||
this[ARCHITECTURE] = arch;
|
|
||||||
};
|
|
||||||
var Device = function (vendor, model, type) {
|
|
||||||
this[VENDOR] = vendor;
|
|
||||||
this[MODEL] = model;
|
|
||||||
this[TYPE] = type;
|
|
||||||
};
|
|
||||||
var Engine = Browser;
|
|
||||||
var OS = Browser;
|
|
||||||
*/
|
|
||||||
var UAParser = function (uastring, extensions) {
|
var UAParser = function (uastring, extensions) {
|
||||||
|
|
||||||
if (typeof uastring === 'object') {
|
if (typeof uastring === 'object') {
|
||||||
@ -967,11 +786,6 @@
|
|||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
var renderer;
|
var renderer;
|
||||||
// browser only
|
// browser only
|
||||||
@ -1034,11 +848,6 @@
|
|||||||
};
|
};
|
||||||
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;
|
||||||
@ -1076,7 +885,6 @@
|
|||||||
NAME : NAME,
|
NAME : NAME,
|
||||||
VERSION : VERSION
|
VERSION : VERSION
|
||||||
};
|
};
|
||||||
//UAParser.Utils = util;
|
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
// Export
|
// Export
|
||||||
@ -1089,39 +897,10 @@
|
|||||||
if (typeof module !== UNDEF_TYPE && module.exports) {
|
if (typeof module !== UNDEF_TYPE && module.exports) {
|
||||||
exports = module.exports = UAParser;
|
exports = module.exports = UAParser;
|
||||||
}
|
}
|
||||||
// TODO: test!!!!!!!!
|
|
||||||
/*
|
|
||||||
if (require && require.main === module && process) {
|
|
||||||
// cli
|
|
||||||
var jsonize = function (arr) {
|
|
||||||
var res = [];
|
|
||||||
for (var i in arr) {
|
|
||||||
res.push(new UAParser(arr[i]).getResult());
|
|
||||||
}
|
|
||||||
process.stdout.write(JSON.stringify(res, null, 2) + '\n');
|
|
||||||
};
|
|
||||||
if (process.stdin.isTTY) {
|
|
||||||
// via args
|
|
||||||
jsonize(process.argv.slice(2));
|
|
||||||
} else {
|
|
||||||
// via pipe
|
|
||||||
var str = '';
|
|
||||||
process.stdin.on('readable', function() {
|
|
||||||
var read = process.stdin.read();
|
|
||||||
if (read !== null) {
|
|
||||||
str += read;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
process.stdin.on('end', function () {
|
|
||||||
jsonize(str.replace(/\n$/, '').split('\n'));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
exports.UAParser = UAParser;
|
exports.UAParser = UAParser;
|
||||||
} else {
|
} else {
|
||||||
// requirejs env (optional)
|
// requirejs env (optional)
|
||||||
if (typeof(define) === FUNC_TYPE && define.amd) {
|
if (typeof(define) === 'function' && define.amd) {
|
||||||
define(function () {
|
define(function () {
|
||||||
return UAParser;
|
return UAParser;
|
||||||
});
|
});
|
||||||
|
@ -59,6 +59,16 @@
|
|||||||
"major" : "3"
|
"major" : "3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Sailfish Browser",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Sailfish Browser",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"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",
|
||||||
@ -1048,6 +1058,16 @@
|
|||||||
"major" : "42"
|
"major" : "42"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Edge Chromium",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.48 Safari/537.36 Edg/74.1.96.24",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Edge",
|
||||||
|
"version" : "74.1.96.24",
|
||||||
|
"major" : "74"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Iridium",
|
"desc" : "Iridium",
|
||||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Iridium/43.8 Safari/537.36 Chrome/43.0.2357.132",
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Iridium/43.8 Safari/537.36 Chrome/43.0.2357.132",
|
||||||
@ -1088,6 +1108,16 @@
|
|||||||
"major" : "6"
|
"major" : "6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WeChat Desktop for Windows Built-in Browser",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "WeChat(Win) Desktop",
|
||||||
|
"version" : "3.43.901.400",
|
||||||
|
"major" : "3"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "GSA on iOS",
|
"desc" : "GSA on iOS",
|
||||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) GSA/30.1.161623614 Mobile/14F89 Safari/602.1",
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) GSA/30.1.161623614 Mobile/14F89 Safari/602.1",
|
||||||
|
@ -133,6 +133,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lenovo Tab 2",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 5.0.1; Lenovo TAB 2 A7-30HC Build/LRX21M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.157 Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Lenovo",
|
||||||
|
"model": "TAB 2 A7",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"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",
|
||||||
@ -157,7 +166,7 @@
|
|||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "Meizu",
|
"vendor": "Meizu",
|
||||||
"model": "M5 Note",
|
"model": "M5 Note",
|
||||||
"type": "tablet"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -522,6 +531,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Xiaomi Mi A1",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; Mi A1 Build/OPR1.170623.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Xiaomi",
|
||||||
|
"model": "Mi A1",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Xiaomi Mi Note",
|
"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",
|
"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",
|
||||||
@ -558,6 +576,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Samsung Galaxy C9 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 6.0; SAMSUNG SM-C900F Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.2 Chrome/44.0.2403.133 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Samsung",
|
||||||
|
"model": "SM-C900F",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Samsung Galaxy S5",
|
"desc": "Samsung Galaxy S5",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; SM-G900F Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 5.0; SM-G900F Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Mobile Safari/537.36",
|
||||||
@ -647,6 +674,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel XL",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel XL",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 2",
|
"desc": "Google Pixel 2",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
||||||
@ -665,6 +701,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 2 XL",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 2 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 2 XL",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 3",
|
"desc": "Google Pixel 3",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
||||||
@ -683,6 +728,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 3 XL",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 3 XL",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Generic Android Device",
|
"desc": "Generic Android Device",
|
||||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; i980 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; i980 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||||
|
@ -170,6 +170,15 @@
|
|||||||
"version" : "2.2.2"
|
"version" : "2.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Sailfish",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Sailfish",
|
||||||
|
"version" : "3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "WebOS",
|
"desc" : "WebOS",
|
||||||
"ua" : "",
|
"ua" : "",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user