From 995f49d38377d601c52c9de875f9f8bee4f779a1 Mon Sep 17 00:00:00 2001 From: Aleksejs Gordejevs Date: Wed, 7 Feb 2018 16:15:36 +0200 Subject: [PATCH] Failing to parse iPhone iOS 10.0.1 UA ? #64 --- lib/express-useragent.js | 18 +++++++++++++++++- lib/express-useragent.min.js | 2 +- test/browsers.js | 4 ++-- test/ios.js | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/lib/express-useragent.js b/lib/express-useragent.js index 716a90b..c576b6e 100644 --- a/lib/express-useragent.js +++ b/lib/express-useragent.js @@ -107,7 +107,8 @@ PhantomJS: /phantomjs\/([\d\w\.\-]+)/i, AlamoFire: /alamofire\/([\d\w\.\-]+)/i, UC: /ucbrowser\/([\d\w\.]+)/i, - Facebook: /FBAV\/([\d\w\.]+)/i + Facebook: /FBAV\/([\d\w\.]+)/i, + WebKit: /applewebkit\/([\d\w\.]+)/i }; this._Browsers = { Edge: /edge|edga|edgios/i, @@ -411,6 +412,12 @@ if (regex.test(string)) { return RegExp.$1; } + } else { + this.testWebkit(); + if (this.Agent.isWebkit && this._Versions.WebKit.test(string)) { + return RegExp.$1; + } + return 'unknown'; } } }; @@ -753,6 +760,14 @@ } }; + this.testWebkit = function testWebkit() { + var ua = this; + if (ua.Agent.browser === 'unknown' && /applewebkit/i.test(ua.Agent.source)) { + ua.Agent.browser = 'Apple WebKit'; + ua.Agent.isWebkit = true; + } + }; + this.parse = function parse(source) { var ua = new UserAgent(); ua.Agent.source = source.replace(/^\s*/, '').replace(/\s*$/, ''); @@ -769,6 +784,7 @@ ua.testSilk(); ua.testKindleFire(); ua.testCaptiveNetwork(); + ua.testWebkit(); return ua.Agent; }; diff --git a/lib/express-useragent.min.js b/lib/express-useragent.min.js index d345a60..3bd1374 100644 --- a/lib/express-useragent.min.js +++ b/lib/express-useragent.min.js @@ -3,4 +3,4 @@ * Copyright 2011-2018 Alexey Gordeyev * Licensed under MIT (https://github.com/biggora/express-useragent/blob/master/README.md#license) */ -!function(a){"use strict";var b=["\\+https:\\/\\/developers.google.com\\/\\+\\/web\\/snippet\\/","ad\\smonitoring","adsbot","apex","applebot","archive.org_bot","baiduspider","bingbot","cloudflare","cloudinary","crawler","curl","discordbot","duckduckbot","embedly","exabot","facebookexternalhit","facebot","flipboard","google","googlebot","gsa-crawler","gurujibot","guzzlehttp","heritrix","ia_archiver","insights","linkedinbot","ltx71","mediapartners","msnbot","odklbot","phantom\\.js","phantomjs","pingdom","pinterest","python","rtlnieuws","skypeuripreview","slackbot","slurp","spbot","telegrambot","test\\scertificate","testing","tiabot","tumblr ","twitterbot","vkshare","web\\sscraper","wget","yandexbot","apex","applebot","duckduckbot","facebot","flipboard","gsa-crawler","ia_archiver","pinterest","skypeuripreview","odklbot","archive.org_bot","ltx71","guzzlehttp","vkshare","discordbot","whatsapp","orangebot","smtbot","qwantify","mj12bot","ahrefsbot","ltx71","seznambot","panscient.com"],c=new RegExp("^.*("+b.join("|")+").*$"),d=function(){return this.version="1.0.10",this._Versions={Edge:/(?:edge|edga|edgios)\/([\d\w\.\-]+)/i,Firefox:/(?:firefox|fxios)\/([\d\w\.\-]+)/i,IE:/msie\s([\d\.]+[\d])|trident\/\d+\.\d+;.*[rv:]+(\d+\.\d)/i,Chrome:/(?:chrome|crios)\/([\d\w\.\-]+)/i,Chromium:/chromium\/([\d\w\.\-]+)/i,Safari:/version\/([\d\w\.\-]+)/i,Opera:/version\/([\d\w\.\-]+)|OPR\/([\d\w\.\-]+)/i,Ps3:/([\d\w\.\-]+)\)\s*$/i,Psp:/([\d\w\.\-]+)\)?\s*$/i,Amaya:/amaya\/([\d\w\.\-]+)/i,SeaMonkey:/seamonkey\/([\d\w\.\-]+)/i,OmniWeb:/omniweb\/v([\d\w\.\-]+)/i,Flock:/flock\/([\d\w\.\-]+)/i,Epiphany:/epiphany\/([\d\w\.\-]+)/i,WinJs:/msapphost\/([\d\w\.\-]+)/i,PhantomJS:/phantomjs\/([\d\w\.\-]+)/i,AlamoFire:/alamofire\/([\d\w\.\-]+)/i,UC:/ucbrowser\/([\d\w\.]+)/i,Facebook:/FBAV\/([\d\w\.]+)/i},this._Browsers={Edge:/edge|edga|edgios/i,Amaya:/amaya/i,Konqueror:/konqueror/i,Epiphany:/epiphany/i,SeaMonkey:/seamonkey/i,Flock:/flock/i,OmniWeb:/omniweb/i,Chromium:/chromium/i,Chrome:/chrome|crios/i,Safari:/safari/i,IE:/msie|trident/i,Opera:/opera|OPR\//i,PS3:/playstation 3/i,PSP:/playstation portable/i,Firefox:/firefox|fxios/i,WinJs:/msapphost/i,PhantomJS:/phantomjs/i,AlamoFire:/alamofire/i,UC:/UCBrowser/i,Facebook:/FBA[NV]/},this._OS={Windows10:/windows nt 10\.0/i,Windows81:/windows nt 6\.3/i,Windows8:/windows nt 6\.2/i,Windows7:/windows nt 6\.1/i,UnknownWindows:/windows nt 6\.\d+/i,WindowsVista:/windows nt 6\.0/i,Windows2003:/windows nt 5\.2/i,WindowsXP:/windows nt 5\.1/i,Windows2000:/windows nt 5\.0/i,WindowsPhone81:/windows phone 8\.1/i,WindowsPhone80:/windows phone 8\.0/i,OSXCheetah:/os x 10[._]0/i,OSXPuma:/os x 10[._]1(\D|$)/i,OSXJaguar:/os x 10[._]2/i,OSXPanther:/os x 10[._]3/i,OSXTiger:/os x 10[._]4/i,OSXLeopard:/os x 10[._]5/i,OSXSnowLeopard:/os x 10[._]6/i,OSXLion:/os x 10[._]7/i,OSXMountainLion:/os x 10[._]8/i,OSXMavericks:/os x 10[._]9/i,OSXYosemite:/os x 10[._]10/i,OSXElCapitan:/os x 10[._]11/i,MacOSSierra:/os x 10[._]12/i,MacOSHighSierra:/os x 10[._]13/i,Mac:/os x/i,Linux:/linux/i,Linux64:/linux x86\_64/i,ChromeOS:/cros/i,Wii:/wii/i,PS3:/playstation 3/i,PSP:/playstation portable/i,iPad:/\(iPad.*os (\d+)[._](\d+)/i,iPhone:/\(iPhone.*os (\d+)[._](\d+)/i,iOS:/ios/i,Bada:/Bada\/(\d+)\.(\d+)/i,Curl:/curl\/(\d+)\.(\d+)\.(\d+)/i},this._Platform={Windows:/windows nt/i,WindowsPhone:/windows phone/i,Mac:/macintosh/i,Linux:/linux/i,Wii:/wii/i,Playstation:/playstation/i,iPad:/ipad/i,iPod:/ipod/i,iPhone:/iphone/i,Android:/android/i,Blackberry:/blackberry/i,Samsung:/samsung/i,Curl:/curl/i,iOS:/^ios\-/i},this.DefaultAgent={isAuthoritative:!0,isMobile:!1,isTablet:!1,isiPad:!1,isiPod:!1,isiPhone:!1,isAndroid:!1,isBlackberry:!1,isOpera:!1,isIE:!1,isEdge:!1,isIECompatibilityMode:!1,isSafari:!1,isFirefox:!1,isWebkit:!1,isChrome:!1,isKonqueror:!1,isOmniWeb:!1,isSeaMonkey:!1,isFlock:!1,isAmaya:!1,isPhantomJS:!1,isEpiphany:!1,isDesktop:!1,isWindows:!1,isLinux:!1,isLinux64:!1,isMac:!1,isChromeOS:!1,isBada:!1,isSamsung:!1,isRaspberry:!1,isBot:!1,isCurl:!1,isAndroidTablet:!1,isWinJs:!1,isKindleFire:!1,isSilk:!1,isCaptive:!1,isSmartTV:!1,isUC:!1,isFacebook:!1,isAlamoFire:!1,silkAccelerated:!1,browser:"unknown",version:"unknown",os:"unknown",platform:"unknown",geoIp:{},source:""},this.Agent={},this.getBrowser=function(a){switch(!0){case this._Browsers.AlamoFire.test(a):return this.Agent.isAlamoFire=!0,"AlamoFire";case this._Browsers.Edge.test(a):return this.Agent.isEdge=!0,"Edge";case this._Browsers.PhantomJS.test(a):return this.Agent.isPhantomJS=!0,"PhantomJS";case this._Browsers.Konqueror.test(a):return this.Agent.isKonqueror=!0,"Konqueror";case this._Browsers.Amaya.test(a):return this.Agent.isAmaya=!0,"Amaya";case this._Browsers.Epiphany.test(a):return this.Agent.isEpiphany=!0,"Epiphany";case this._Browsers.SeaMonkey.test(a):return this.Agent.isSeaMonkey=!0,"SeaMonkey";case this._Browsers.Flock.test(a):return this.Agent.isFlock=!0,"Flock";case this._Browsers.OmniWeb.test(a):return this.Agent.isOmniWeb=!0,"OmniWeb";case this._Browsers.Opera.test(a):return this.Agent.isOpera=!0,"Opera";case this._Browsers.Chromium.test(a):return this.Agent.isChrome=!0,"Chromium";case this._Browsers.Facebook.test(a):return this.Agent.isFacebook=!0,"Facebook";case this._Browsers.Chrome.test(a):return this.Agent.isChrome=!0,"Chrome";case this._Browsers.WinJs.test(a):return this.Agent.isWinJs=!0,"WinJs";case this._Browsers.IE.test(a):return this.Agent.isIE=!0,"IE";case this._Browsers.Firefox.test(a):return this.Agent.isFirefox=!0,"Firefox";case this._Browsers.Safari.test(a):return this.Agent.isSafari=!0,"Safari";case this._Browsers.PS3.test(a):return"ps3";case this._Browsers.PSP.test(a):return"psp";case this._Browsers.UC.test(a):return this.Agent.isUC=!0,"UCBrowser";default:return 0!==a.indexOf("Mozilla")&&/^([\d\w\-\.]+)\/[\d\w\.\-]+/i.test(a)?(this.Agent.isAuthoritative=!1,RegExp.$1):"unknown"}},this.getBrowserVersion=function(a){var b;switch(this.Agent.browser){case"Edge":if(this._Versions.Edge.test(a))return RegExp.$1;break;case"PhantomJS":if(this._Versions.PhantomJS.test(a))return RegExp.$1;break;case"Chrome":if(this._Versions.Chrome.test(a))return RegExp.$1;break;case"Chromium":if(this._Versions.Chromium.test(a))return RegExp.$1;break;case"Safari":if(this._Versions.Safari.test(a))return RegExp.$1;break;case"Opera":if(this._Versions.Opera.test(a))return RegExp.$1?RegExp.$1:RegExp.$2;break;case"Firefox":if(this._Versions.Firefox.test(a))return RegExp.$1;break;case"WinJs":if(this._Versions.WinJs.test(a))return RegExp.$1;break;case"IE":if(this._Versions.IE.test(a))return RegExp.$2?RegExp.$2:RegExp.$1;break;case"ps3":if(this._Versions.Ps3.test(a))return RegExp.$1;break;case"psp":if(this._Versions.Psp.test(a))return RegExp.$1;break;case"Amaya":if(this._Versions.Amaya.test(a))return RegExp.$1;break;case"Epiphany":if(this._Versions.Epiphany.test(a))return RegExp.$1;break;case"SeaMonkey":if(this._Versions.SeaMonkey.test(a))return RegExp.$1;break;case"Flock":if(this._Versions.Flock.test(a))return RegExp.$1;break;case"OmniWeb":if(this._Versions.OmniWeb.test(a))return RegExp.$1;break;case"UCBrowser":if(this._Versions.UC.test(a))return RegExp.$1;break;case"Facebook":if(this._Versions.Facebook.test(a))return RegExp.$1;break;default:if("unknown"!==this.Agent.browser&&(b=new RegExp(this.Agent.browser+"[\\/ ]([\\d\\w\\.\\-]+)","i"),b.test(a)))return RegExp.$1}},this.getOS=function(a){switch(!0){case this._OS.WindowsVista.test(a):return this.Agent.isWindows=!0,"Windows Vista";case this._OS.Windows7.test(a):return this.Agent.isWindows=!0,"Windows 7";case this._OS.Windows8.test(a):return this.Agent.isWindows=!0,"Windows 8";case this._OS.Windows81.test(a):return this.Agent.isWindows=!0,"Windows 8.1";case this._OS.Windows10.test(a):return this.Agent.isWindows=!0,"Windows 10.0";case this._OS.Windows2003.test(a):return this.Agent.isWindows=!0,"Windows 2003";case this._OS.WindowsXP.test(a):return this.Agent.isWindows=!0,"Windows XP";case this._OS.Windows2000.test(a):return this.Agent.isWindows=!0,"Windows 2000";case this._OS.WindowsPhone81.test(a):return this.Agent.isWindowsPhone=!0,"Windows Phone 8.1";case this._OS.WindowsPhone80.test(a):return this.Agent.isWindowsPhone=!0,"Windows Phone 8.0";case this._OS.Linux64.test(a):return this.Agent.isLinux=!0,this.Agent.isLinux64=!0,"Linux 64";case this._OS.Linux.test(a):return this.Agent.isLinux=!0,"Linux";case this._OS.ChromeOS.test(a):return this.Agent.isChromeOS=!0,"Chrome OS";case this._OS.Wii.test(a):return"Wii";case this._OS.PS3.test(a):return"Playstation";case this._OS.PSP.test(a):return"Playstation";case this._OS.OSXCheetah.test(a):return this.Agent.isMac=!0,"OS X Cheetah";case this._OS.OSXPuma.test(a):return this.Agent.isMac=!0,"OS X Puma";case this._OS.OSXJaguar.test(a):return this.Agent.isMac=!0,"OS X Jaguar";case this._OS.OSXPanther.test(a):return this.Agent.isMac=!0,"OS X Panther";case this._OS.OSXTiger.test(a):return this.Agent.isMac=!0,"OS X Tiger";case this._OS.OSXLeopard.test(a):return this.Agent.isMac=!0,"OS X Leopard";case this._OS.OSXSnowLeopard.test(a):return this.Agent.isMac=!0,"OS X Snow Leopard";case this._OS.OSXLion.test(a):return this.Agent.isMac=!0,"OS X Lion";case this._OS.OSXMountainLion.test(a):return this.Agent.isMac=!0,"OS X Mountain Lion";case this._OS.OSXMavericks.test(a):return this.Agent.isMac=!0,"OS X Mavericks";case this._OS.OSXYosemite.test(a):return this.Agent.isMac=!0,"OS X Yosemite";case this._OS.OSXElCapitan.test(a):return this.Agent.isMac=!0,"OS X El Capitan";case this._OS.MacOSSierra.test(a):return this.Agent.isMac=!0,"macOS Sierra";case this._OS.MacOSHighSierra.test(a):return this.Agent.isMac=!0,"macOS High Sierra";case this._OS.Mac.test(a):return this.Agent.isMac=!0,"OS X";case this._OS.iPad.test(a):return this.Agent.isiPad=!0,a.match(this._OS.iPad)[0].replace("_",".");case this._OS.iPhone.test(a):return this.Agent.isiPhone=!0,a.match(this._OS.iPhone)[0].replace("_",".");case this._OS.Bada.test(a):return this.Agent.isBada=!0,"Bada";case this._OS.Curl.test(a):return this.Agent.isCurl=!0,"Curl";case this._OS.iOS.test(a):return this.Agent.isiPhone=!0,"iOS";default:return"unknown"}},this.getPlatform=function(a){switch(!0){case this._Platform.Windows.test(a):return"Microsoft Windows";case this._Platform.WindowsPhone.test(a):return this.Agent.isWindowsPhone=!0,"Microsoft Windows Phone";case this._Platform.Mac.test(a):return"Apple Mac";case this._Platform.Curl.test(a):return"Curl";case this._Platform.Android.test(a):return this.Agent.isAndroid=!0,"Android";case this._Platform.Blackberry.test(a):return this.Agent.isBlackberry=!0,"Blackberry";case this._Platform.Linux.test(a):return"Linux";case this._Platform.Wii.test(a):return"Wii";case this._Platform.Playstation.test(a):return"Playstation";case this._Platform.iPad.test(a):return this.Agent.isiPad=!0,"iPad";case this._Platform.iPod.test(a):return this.Agent.isiPod=!0,"iPod";case this._Platform.iPhone.test(a):return this.Agent.isiPhone=!0,"iPhone";case this._Platform.Samsung.test(a):return this.Agent.isiSamsung=!0,"Samsung";case this._Platform.iOS.test(a):return"Apple iOS";default:return"unknown"}},this.testCompatibilityMode=function(){var a=this;if(this.Agent.isIE&&/Trident\/(\d)\.0/i.test(a.Agent.source)){var b=parseInt(RegExp.$1,10),c=parseInt(a.Agent.version,10);7===c&&7===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=11),7===c&&6===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=10),7===c&&5===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=9),7===c&&4===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=8)}},this.testSilk=function(){var a=this;switch(!0){case new RegExp("silk","gi").test(a.Agent.source):this.Agent.isSilk=!0}return/Silk-Accelerated=true/gi.test(a.Agent.source)&&(this.Agent.SilkAccelerated=!0),!!this.Agent.isSilk&&"Silk"},this.testKindleFire=function(){var a=this;switch(!0){case/KFOT/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire";case/KFTT/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD";case/KFJWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD 8.9";case/KFJWA/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD 8.9 4G";case/KFSOWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD 7";case/KFTHWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 7";case/KFTHWA/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 7 4G";case/KFAPWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 8.9";case/KFAPWA/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 8.9 4G";default:return!1}},this.testCaptiveNetwork=function(){var a=this;switch(!0){case/CaptiveNetwork/gi.test(a.Agent.source):return a.Agent.isCaptive=!0,a.Agent.isMac=!0,a.Agent.platform="Apple Mac","CaptiveNetwork";default:return!1}},this.reset=function(){var a=this;for(var b in a.DefaultAgent)a.Agent[b]=a.DefaultAgent[b];return a},this.testMobile=function(){var a=this;switch(!0){case a.Agent.isWindows:case a.Agent.isLinux:case a.Agent.isMac:case a.Agent.isChromeOS:a.Agent.isDesktop=!0;break;case a.Agent.isAndroid:case a.Agent.isSamsung:a.Agent.isMobile=!0}switch(!0){case a.Agent.isiPad:case a.Agent.isiPod:case a.Agent.isiPhone:case a.Agent.isBada:case a.Agent.isBlackberry:case a.Agent.isAndroid:case a.Agent.isWindowsPhone:a.Agent.isMobile=!0,a.Agent.isDesktop=!1}/mobile|^ios\-/i.test(a.Agent.source)&&(a.Agent.isMobile=!0,a.Agent.isDesktop=!1)},this.testTablet=function(){var a=this;switch(!0){case a.Agent.isiPad:case a.Agent.isAndroidTablet:case a.Agent.isKindleFire:a.Agent.isTablet=!0}/tablet/i.test(a.Agent.source)&&(a.Agent.isTablet=!0)},this.testNginxGeoIP=function(a){var b=this;Object.keys(a).forEach(function(c){/^GEOIP/i.test(c)&&(b.Agent.geoIp[c]=a[c])})},this.testBot=function(){var a=this,b=c.exec(a.Agent.source.toLowerCase());b?a.Agent.isBot=b[1]:a.Agent.isAuthoritative||(a.Agent.isBot=/bot/i.test(a.Agent.source))},this.testSmartTV=function(){var a=this,b=new RegExp("smart-tv|smarttv|googletv|appletv|hbbtv|pov_tv|netcast.tv","gi").exec(a.Agent.source.toLowerCase());b&&(a.Agent.isSmartTV=b[1])},this.testAndroidTablet=function(){var a=this;a.Agent.isAndroid&&!/mobile/i.test(a.Agent.source)&&(a.Agent.isAndroidTablet=!0)},this.parse=function(a){var b=new d;return b.Agent.source=a.replace(/^\s*/,"").replace(/\s*$/,""),b.Agent.os=b.getOS(b.Agent.source),b.Agent.platform=b.getPlatform(b.Agent.source),b.Agent.browser=b.getBrowser(b.Agent.source),b.Agent.version=b.getBrowserVersion(b.Agent.source),b.testBot(),b.testSmartTV(),b.testMobile(),b.testAndroidTablet(),b.testTablet(),b.testCompatibilityMode(),b.testSilk(),b.testKindleFire(),b.testCaptiveNetwork(),b.Agent},this.Agent=this.DefaultAgent,this};return a.UserAgent=d,new d}(this); \ No newline at end of file +!function(a){"use strict";var b=["\\+https:\\/\\/developers.google.com\\/\\+\\/web\\/snippet\\/","ad\\smonitoring","adsbot","apex","applebot","archive.org_bot","baiduspider","bingbot","cloudflare","cloudinary","crawler","curl","discordbot","duckduckbot","embedly","exabot","facebookexternalhit","facebot","flipboard","google","googlebot","gsa-crawler","gurujibot","guzzlehttp","heritrix","ia_archiver","insights","linkedinbot","ltx71","mediapartners","msnbot","odklbot","phantom\\.js","phantomjs","pingdom","pinterest","python","rtlnieuws","skypeuripreview","slackbot","slurp","spbot","telegrambot","test\\scertificate","testing","tiabot","tumblr ","twitterbot","vkshare","web\\sscraper","wget","yandexbot","apex","applebot","duckduckbot","facebot","flipboard","gsa-crawler","ia_archiver","pinterest","skypeuripreview","odklbot","archive.org_bot","ltx71","guzzlehttp","vkshare","discordbot","whatsapp","orangebot","smtbot","qwantify","mj12bot","ahrefsbot","ltx71","seznambot","panscient.com"],c=new RegExp("^.*("+b.join("|")+").*$"),d=function(){return this.version="1.0.11",this._Versions={Edge:/(?:edge|edga|edgios)\/([\d\w\.\-]+)/i,Firefox:/(?:firefox|fxios)\/([\d\w\.\-]+)/i,IE:/msie\s([\d\.]+[\d])|trident\/\d+\.\d+;.*[rv:]+(\d+\.\d)/i,Chrome:/(?:chrome|crios)\/([\d\w\.\-]+)/i,Chromium:/chromium\/([\d\w\.\-]+)/i,Safari:/version\/([\d\w\.\-]+)/i,Opera:/version\/([\d\w\.\-]+)|OPR\/([\d\w\.\-]+)/i,Ps3:/([\d\w\.\-]+)\)\s*$/i,Psp:/([\d\w\.\-]+)\)?\s*$/i,Amaya:/amaya\/([\d\w\.\-]+)/i,SeaMonkey:/seamonkey\/([\d\w\.\-]+)/i,OmniWeb:/omniweb\/v([\d\w\.\-]+)/i,Flock:/flock\/([\d\w\.\-]+)/i,Epiphany:/epiphany\/([\d\w\.\-]+)/i,WinJs:/msapphost\/([\d\w\.\-]+)/i,PhantomJS:/phantomjs\/([\d\w\.\-]+)/i,AlamoFire:/alamofire\/([\d\w\.\-]+)/i,UC:/ucbrowser\/([\d\w\.]+)/i,Facebook:/FBAV\/([\d\w\.]+)/i,WebKit:/applewebkit\/([\d\w\.]+)/i},this._Browsers={Edge:/edge|edga|edgios/i,Amaya:/amaya/i,Konqueror:/konqueror/i,Epiphany:/epiphany/i,SeaMonkey:/seamonkey/i,Flock:/flock/i,OmniWeb:/omniweb/i,Chromium:/chromium/i,Chrome:/chrome|crios/i,Safari:/safari/i,IE:/msie|trident/i,Opera:/opera|OPR\//i,PS3:/playstation 3/i,PSP:/playstation portable/i,Firefox:/firefox|fxios/i,WinJs:/msapphost/i,PhantomJS:/phantomjs/i,AlamoFire:/alamofire/i,UC:/UCBrowser/i,Facebook:/FBA[NV]/},this._OS={Windows10:/windows nt 10\.0/i,Windows81:/windows nt 6\.3/i,Windows8:/windows nt 6\.2/i,Windows7:/windows nt 6\.1/i,UnknownWindows:/windows nt 6\.\d+/i,WindowsVista:/windows nt 6\.0/i,Windows2003:/windows nt 5\.2/i,WindowsXP:/windows nt 5\.1/i,Windows2000:/windows nt 5\.0/i,WindowsPhone81:/windows phone 8\.1/i,WindowsPhone80:/windows phone 8\.0/i,OSXCheetah:/os x 10[._]0/i,OSXPuma:/os x 10[._]1(\D|$)/i,OSXJaguar:/os x 10[._]2/i,OSXPanther:/os x 10[._]3/i,OSXTiger:/os x 10[._]4/i,OSXLeopard:/os x 10[._]5/i,OSXSnowLeopard:/os x 10[._]6/i,OSXLion:/os x 10[._]7/i,OSXMountainLion:/os x 10[._]8/i,OSXMavericks:/os x 10[._]9/i,OSXYosemite:/os x 10[._]10/i,OSXElCapitan:/os x 10[._]11/i,MacOSSierra:/os x 10[._]12/i,MacOSHighSierra:/os x 10[._]13/i,Mac:/os x/i,Linux:/linux/i,Linux64:/linux x86\_64/i,ChromeOS:/cros/i,Wii:/wii/i,PS3:/playstation 3/i,PSP:/playstation portable/i,iPad:/\(iPad.*os (\d+)[._](\d+)/i,iPhone:/\(iPhone.*os (\d+)[._](\d+)/i,iOS:/ios/i,Bada:/Bada\/(\d+)\.(\d+)/i,Curl:/curl\/(\d+)\.(\d+)\.(\d+)/i},this._Platform={Windows:/windows nt/i,WindowsPhone:/windows phone/i,Mac:/macintosh/i,Linux:/linux/i,Wii:/wii/i,Playstation:/playstation/i,iPad:/ipad/i,iPod:/ipod/i,iPhone:/iphone/i,Android:/android/i,Blackberry:/blackberry/i,Samsung:/samsung/i,Curl:/curl/i,iOS:/^ios\-/i},this.DefaultAgent={isAuthoritative:!0,isMobile:!1,isTablet:!1,isiPad:!1,isiPod:!1,isiPhone:!1,isAndroid:!1,isBlackberry:!1,isOpera:!1,isIE:!1,isEdge:!1,isIECompatibilityMode:!1,isSafari:!1,isFirefox:!1,isWebkit:!1,isChrome:!1,isKonqueror:!1,isOmniWeb:!1,isSeaMonkey:!1,isFlock:!1,isAmaya:!1,isPhantomJS:!1,isEpiphany:!1,isDesktop:!1,isWindows:!1,isLinux:!1,isLinux64:!1,isMac:!1,isChromeOS:!1,isBada:!1,isSamsung:!1,isRaspberry:!1,isBot:!1,isCurl:!1,isAndroidTablet:!1,isWinJs:!1,isKindleFire:!1,isSilk:!1,isCaptive:!1,isSmartTV:!1,isUC:!1,isFacebook:!1,isAlamoFire:!1,silkAccelerated:!1,browser:"unknown",version:"unknown",os:"unknown",platform:"unknown",geoIp:{},source:""},this.Agent={},this.getBrowser=function(a){switch(!0){case this._Browsers.AlamoFire.test(a):return this.Agent.isAlamoFire=!0,"AlamoFire";case this._Browsers.Edge.test(a):return this.Agent.isEdge=!0,"Edge";case this._Browsers.PhantomJS.test(a):return this.Agent.isPhantomJS=!0,"PhantomJS";case this._Browsers.Konqueror.test(a):return this.Agent.isKonqueror=!0,"Konqueror";case this._Browsers.Amaya.test(a):return this.Agent.isAmaya=!0,"Amaya";case this._Browsers.Epiphany.test(a):return this.Agent.isEpiphany=!0,"Epiphany";case this._Browsers.SeaMonkey.test(a):return this.Agent.isSeaMonkey=!0,"SeaMonkey";case this._Browsers.Flock.test(a):return this.Agent.isFlock=!0,"Flock";case this._Browsers.OmniWeb.test(a):return this.Agent.isOmniWeb=!0,"OmniWeb";case this._Browsers.Opera.test(a):return this.Agent.isOpera=!0,"Opera";case this._Browsers.Chromium.test(a):return this.Agent.isChrome=!0,"Chromium";case this._Browsers.Facebook.test(a):return this.Agent.isFacebook=!0,"Facebook";case this._Browsers.Chrome.test(a):return this.Agent.isChrome=!0,"Chrome";case this._Browsers.WinJs.test(a):return this.Agent.isWinJs=!0,"WinJs";case this._Browsers.IE.test(a):return this.Agent.isIE=!0,"IE";case this._Browsers.Firefox.test(a):return this.Agent.isFirefox=!0,"Firefox";case this._Browsers.Safari.test(a):return this.Agent.isSafari=!0,"Safari";case this._Browsers.PS3.test(a):return"ps3";case this._Browsers.PSP.test(a):return"psp";case this._Browsers.UC.test(a):return this.Agent.isUC=!0,"UCBrowser";default:return 0!==a.indexOf("Mozilla")&&/^([\d\w\-\.]+)\/[\d\w\.\-]+/i.test(a)?(this.Agent.isAuthoritative=!1,RegExp.$1):"unknown"}},this.getBrowserVersion=function(a){var b;switch(this.Agent.browser){case"Edge":if(this._Versions.Edge.test(a))return RegExp.$1;break;case"PhantomJS":if(this._Versions.PhantomJS.test(a))return RegExp.$1;break;case"Chrome":if(this._Versions.Chrome.test(a))return RegExp.$1;break;case"Chromium":if(this._Versions.Chromium.test(a))return RegExp.$1;break;case"Safari":if(this._Versions.Safari.test(a))return RegExp.$1;break;case"Opera":if(this._Versions.Opera.test(a))return RegExp.$1?RegExp.$1:RegExp.$2;break;case"Firefox":if(this._Versions.Firefox.test(a))return RegExp.$1;break;case"WinJs":if(this._Versions.WinJs.test(a))return RegExp.$1;break;case"IE":if(this._Versions.IE.test(a))return RegExp.$2?RegExp.$2:RegExp.$1;break;case"ps3":if(this._Versions.Ps3.test(a))return RegExp.$1;break;case"psp":if(this._Versions.Psp.test(a))return RegExp.$1;break;case"Amaya":if(this._Versions.Amaya.test(a))return RegExp.$1;break;case"Epiphany":if(this._Versions.Epiphany.test(a))return RegExp.$1;break;case"SeaMonkey":if(this._Versions.SeaMonkey.test(a))return RegExp.$1;break;case"Flock":if(this._Versions.Flock.test(a))return RegExp.$1;break;case"OmniWeb":if(this._Versions.OmniWeb.test(a))return RegExp.$1;break;case"UCBrowser":if(this._Versions.UC.test(a))return RegExp.$1;break;case"Facebook":if(this._Versions.Facebook.test(a))return RegExp.$1;break;default:if("unknown"===this.Agent.browser)return this.testWebkit(),this.Agent.isWebkit&&this._Versions.WebKit.test(a)?RegExp.$1:"unknown";if(b=new RegExp(this.Agent.browser+"[\\/ ]([\\d\\w\\.\\-]+)","i"),b.test(a))return RegExp.$1}},this.getOS=function(a){switch(!0){case this._OS.WindowsVista.test(a):return this.Agent.isWindows=!0,"Windows Vista";case this._OS.Windows7.test(a):return this.Agent.isWindows=!0,"Windows 7";case this._OS.Windows8.test(a):return this.Agent.isWindows=!0,"Windows 8";case this._OS.Windows81.test(a):return this.Agent.isWindows=!0,"Windows 8.1";case this._OS.Windows10.test(a):return this.Agent.isWindows=!0,"Windows 10.0";case this._OS.Windows2003.test(a):return this.Agent.isWindows=!0,"Windows 2003";case this._OS.WindowsXP.test(a):return this.Agent.isWindows=!0,"Windows XP";case this._OS.Windows2000.test(a):return this.Agent.isWindows=!0,"Windows 2000";case this._OS.WindowsPhone81.test(a):return this.Agent.isWindowsPhone=!0,"Windows Phone 8.1";case this._OS.WindowsPhone80.test(a):return this.Agent.isWindowsPhone=!0,"Windows Phone 8.0";case this._OS.Linux64.test(a):return this.Agent.isLinux=!0,this.Agent.isLinux64=!0,"Linux 64";case this._OS.Linux.test(a):return this.Agent.isLinux=!0,"Linux";case this._OS.ChromeOS.test(a):return this.Agent.isChromeOS=!0,"Chrome OS";case this._OS.Wii.test(a):return"Wii";case this._OS.PS3.test(a):return"Playstation";case this._OS.PSP.test(a):return"Playstation";case this._OS.OSXCheetah.test(a):return this.Agent.isMac=!0,"OS X Cheetah";case this._OS.OSXPuma.test(a):return this.Agent.isMac=!0,"OS X Puma";case this._OS.OSXJaguar.test(a):return this.Agent.isMac=!0,"OS X Jaguar";case this._OS.OSXPanther.test(a):return this.Agent.isMac=!0,"OS X Panther";case this._OS.OSXTiger.test(a):return this.Agent.isMac=!0,"OS X Tiger";case this._OS.OSXLeopard.test(a):return this.Agent.isMac=!0,"OS X Leopard";case this._OS.OSXSnowLeopard.test(a):return this.Agent.isMac=!0,"OS X Snow Leopard";case this._OS.OSXLion.test(a):return this.Agent.isMac=!0,"OS X Lion";case this._OS.OSXMountainLion.test(a):return this.Agent.isMac=!0,"OS X Mountain Lion";case this._OS.OSXMavericks.test(a):return this.Agent.isMac=!0,"OS X Mavericks";case this._OS.OSXYosemite.test(a):return this.Agent.isMac=!0,"OS X Yosemite";case this._OS.OSXElCapitan.test(a):return this.Agent.isMac=!0,"OS X El Capitan";case this._OS.MacOSSierra.test(a):return this.Agent.isMac=!0,"macOS Sierra";case this._OS.MacOSHighSierra.test(a):return this.Agent.isMac=!0,"macOS High Sierra";case this._OS.Mac.test(a):return this.Agent.isMac=!0,"OS X";case this._OS.iPad.test(a):return this.Agent.isiPad=!0,a.match(this._OS.iPad)[0].replace("_",".");case this._OS.iPhone.test(a):return this.Agent.isiPhone=!0,a.match(this._OS.iPhone)[0].replace("_",".");case this._OS.Bada.test(a):return this.Agent.isBada=!0,"Bada";case this._OS.Curl.test(a):return this.Agent.isCurl=!0,"Curl";case this._OS.iOS.test(a):return this.Agent.isiPhone=!0,"iOS";default:return"unknown"}},this.getPlatform=function(a){switch(!0){case this._Platform.Windows.test(a):return"Microsoft Windows";case this._Platform.WindowsPhone.test(a):return this.Agent.isWindowsPhone=!0,"Microsoft Windows Phone";case this._Platform.Mac.test(a):return"Apple Mac";case this._Platform.Curl.test(a):return"Curl";case this._Platform.Android.test(a):return this.Agent.isAndroid=!0,"Android";case this._Platform.Blackberry.test(a):return this.Agent.isBlackberry=!0,"Blackberry";case this._Platform.Linux.test(a):return"Linux";case this._Platform.Wii.test(a):return"Wii";case this._Platform.Playstation.test(a):return"Playstation";case this._Platform.iPad.test(a):return this.Agent.isiPad=!0,"iPad";case this._Platform.iPod.test(a):return this.Agent.isiPod=!0,"iPod";case this._Platform.iPhone.test(a):return this.Agent.isiPhone=!0,"iPhone";case this._Platform.Samsung.test(a):return this.Agent.isiSamsung=!0,"Samsung";case this._Platform.iOS.test(a):return"Apple iOS";default:return"unknown"}},this.testCompatibilityMode=function(){var a=this;if(this.Agent.isIE&&/Trident\/(\d)\.0/i.test(a.Agent.source)){var b=parseInt(RegExp.$1,10),c=parseInt(a.Agent.version,10);7===c&&7===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=11),7===c&&6===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=10),7===c&&5===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=9),7===c&&4===b&&(a.Agent.isIECompatibilityMode=!0,a.Agent.version=8)}},this.testSilk=function(){var a=this;switch(!0){case new RegExp("silk","gi").test(a.Agent.source):this.Agent.isSilk=!0}return/Silk-Accelerated=true/gi.test(a.Agent.source)&&(this.Agent.SilkAccelerated=!0),!!this.Agent.isSilk&&"Silk"},this.testKindleFire=function(){var a=this;switch(!0){case/KFOT/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire";case/KFTT/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD";case/KFJWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD 8.9";case/KFJWA/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD 8.9 4G";case/KFSOWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HD 7";case/KFTHWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 7";case/KFTHWA/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 7 4G";case/KFAPWI/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 8.9";case/KFAPWA/gi.test(a.Agent.source):return this.Agent.isKindleFire=!0,"Kindle Fire HDX 8.9 4G";default:return!1}},this.testCaptiveNetwork=function(){var a=this;switch(!0){case/CaptiveNetwork/gi.test(a.Agent.source):return a.Agent.isCaptive=!0,a.Agent.isMac=!0,a.Agent.platform="Apple Mac","CaptiveNetwork";default:return!1}},this.reset=function(){var a=this;for(var b in a.DefaultAgent)a.Agent[b]=a.DefaultAgent[b];return a},this.testMobile=function(){var a=this;switch(!0){case a.Agent.isWindows:case a.Agent.isLinux:case a.Agent.isMac:case a.Agent.isChromeOS:a.Agent.isDesktop=!0;break;case a.Agent.isAndroid:case a.Agent.isSamsung:a.Agent.isMobile=!0}switch(!0){case a.Agent.isiPad:case a.Agent.isiPod:case a.Agent.isiPhone:case a.Agent.isBada:case a.Agent.isBlackberry:case a.Agent.isAndroid:case a.Agent.isWindowsPhone:a.Agent.isMobile=!0,a.Agent.isDesktop=!1}/mobile|^ios\-/i.test(a.Agent.source)&&(a.Agent.isMobile=!0,a.Agent.isDesktop=!1)},this.testTablet=function(){var a=this;switch(!0){case a.Agent.isiPad:case a.Agent.isAndroidTablet:case a.Agent.isKindleFire:a.Agent.isTablet=!0}/tablet/i.test(a.Agent.source)&&(a.Agent.isTablet=!0)},this.testNginxGeoIP=function(a){var b=this;Object.keys(a).forEach(function(c){/^GEOIP/i.test(c)&&(b.Agent.geoIp[c]=a[c])})},this.testBot=function(){var a=this,b=c.exec(a.Agent.source.toLowerCase());b?a.Agent.isBot=b[1]:a.Agent.isAuthoritative||(a.Agent.isBot=/bot/i.test(a.Agent.source))},this.testSmartTV=function(){var a=this,b=new RegExp("smart-tv|smarttv|googletv|appletv|hbbtv|pov_tv|netcast.tv","gi").exec(a.Agent.source.toLowerCase());b&&(a.Agent.isSmartTV=b[1])},this.testAndroidTablet=function(){var a=this;a.Agent.isAndroid&&!/mobile/i.test(a.Agent.source)&&(a.Agent.isAndroidTablet=!0)},this.testWebkit=function(){var a=this;"unknown"===a.Agent.browser&&/applewebkit/i.test(a.Agent.source)&&(a.Agent.browser="Apple WebKit",a.Agent.isWebkit=!0)},this.parse=function(a){var b=new d;return b.Agent.source=a.replace(/^\s*/,"").replace(/\s*$/,""),b.Agent.os=b.getOS(b.Agent.source),b.Agent.platform=b.getPlatform(b.Agent.source),b.Agent.browser=b.getBrowser(b.Agent.source),b.Agent.version=b.getBrowserVersion(b.Agent.source),b.testBot(),b.testSmartTV(),b.testMobile(),b.testAndroidTablet(),b.testTablet(),b.testCompatibilityMode(),b.testSilk(),b.testKindleFire(),b.testCaptiveNetwork(),b.testWebkit(),b.Agent},this.Agent=this.DefaultAgent,this};return a.UserAgent=d,new d}(this); \ No newline at end of file diff --git a/test/browsers.js b/test/browsers.js index 38d4941..03a80bf 100644 --- a/test/browsers.js +++ b/test/browsers.js @@ -986,7 +986,7 @@ exports['Bada OS browser'] = function (test) { test.ok(!a.isIE, 'IE'); test.ok(!a.isSafari, 'Safari'); test.ok(!a.isFirefox, 'Firefox'); - test.ok(!a.isWebkit, 'Webkit'); + test.ok(a.isWebkit, 'Webkit'); test.ok(!a.isChrome, 'Chrome'); test.ok(!a.isKonqueror, 'Konqueror'); test.ok(!a.isDesktop, 'Desktop'); @@ -994,7 +994,7 @@ exports['Bada OS browser'] = function (test) { test.ok(!a.isLinux, 'Linux'); test.ok(!a.isMac, 'Mac'); test.ok(!a.isWindowsPhone, 'Windows Phone'); - test.equal(a.version, undefined); + test.equal(a.version, '533.1'); test.done(); }; diff --git a/test/ios.js b/test/ios.js index 8bf095d..e37a670 100644 --- a/test/ios.js +++ b/test/ios.js @@ -131,3 +131,35 @@ exports['iOS AlamoFire'] = function (test) { test.done(); }; + +exports['iPhone like OS X'] = function (test) { + + var s = 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) ' + + 'AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403'; + + var a = ua.parse(s); + + test.ok(a.isMobile, 'Mobile'); + test.ok(!a.isiPad, 'iPad'); + test.ok(!a.isiPod, 'iPod'); + test.ok(a.isiPhone, 'iPhone'); + test.ok(!a.isAndroid, 'Android'); + test.ok(!a.isBlackberry, 'Blackberry'); + test.ok(!a.isOpera, 'Opera'); + test.ok(!a.isIE, 'IE'); + test.ok(!a.isSafari, 'Safari'); + test.ok(!a.isFirefox, 'Firefox'); + test.ok(a.isWebkit, 'Webkit'); + test.ok(!a.isChrome, 'Chrome'); + test.ok(!a.isKonqueror, 'Konqueror'); + test.ok(!a.isDesktop, 'Desktop'); + test.ok(!a.isWindows, 'Windows'); + test.ok(!a.isLinux, 'Linux'); + test.ok(a.isMac, 'Mac'); + test.ok(!a.isWindowsPhone, 'Windows Phone'); + test.equal(a.version, '602.1.50'); + + test.done(); +}; + +// \ No newline at end of file