From 197c203e1165f5740fe93dea38a287bfb1a461c9 Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Sat, 7 May 2016 18:55:19 +0300 Subject: [PATCH 1/6] fix Safari browser name on iOS --- src/bowser.js | 24 ++-- src/useragents.js | 293 ++++++++++++++++++++++++---------------------- 2 files changed, 164 insertions(+), 153 deletions(-) diff --git a/src/bowser.js b/src/bowser.js index 0a40659..99da71c 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -117,15 +117,6 @@ , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) } } - else if (iosdevice) { - result = { - name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' - } - // WTF: version is not part of user agent in web apps - if (versionIdentifier) { - result.version = versionIdentifier - } - } else if (sailfish) { result = { name: 'Sailfish' @@ -206,11 +197,22 @@ , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier } } - else if (/safari/i.test(ua)) { + else if (/safari|applewebkit/i.test(ua)) { result = { name: 'Safari' , safari: t - , version: versionIdentifier + } + if (versionIdentifier) { + result.version = versionIdentifier + } + } + else if (iosdevice) { + result = { + name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' + } + // WTF: version is not part of user agent in web apps + if (versionIdentifier) { + result.version = versionIdentifier } } else if(/googlebot/i.test(ua)) { diff --git a/src/useragents.js b/src/useragents.js index 884b52f..fd8d782 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -349,7 +349,158 @@ module.exports.useragents = { , webkit: true , c: true } + , 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11B554a': { + ios: true + , osversion: '7.0.4' + , iphone: true + , mobile: true + , webkit: true + , safari: true + , a: true + } + , 'Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5': { + ios: true + , osversion: '4.3.2' + , version: '5.0' + , iphone: true + , mobile: true + , safari: true + , webkit: true + , c: true + } + , 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3': { + ios: true + , version: '3.0' + , iphone: true + , mobile: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B5097d Safari/6531.22.7': { + ios: true + , osversion: '4.1' + , version: '4.0' + , iphone: true + , mobile: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en-gb) AppleWebKit/526+ (KHTML, like Gecko) Version/3.1 iPhone': { + ios: true + , version: '3.1' + , iphone: true + , mobile: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1': { + ios: true + , osversion: '9.0' + , version: '9.0' + , iphone: true + , mobile: true + , webkit: true + , safari: true + , a: true + } + , 'Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53': { + ios: true + , osversion: '7.0.4' + , name: 'Safari' + , version: '7.0' + , ipad: true + , tablet: true + , webkit: true + , safari: true + , a: true + } + , 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25': { + ios: true + , osversion: '6.0' + , name: 'Safari' + , version: '6.0' + , ipad: true + , tablet: true + , webkit: true + , safari: true + , a: true } + , 'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3': { + ios: true + , osversion: '5.1' + , name: 'Safari' + , version: '5.1' + , ipad: true + , tablet: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5': { + ios: true + , osversion: '4.3.2' + , name: 'Safari' + , version: '5.0' + , ipad: true + , tablet: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B360 Safari/531.21.10': { + ios: true + , osversion: '3.2' + , name: 'Safari' + , version: '4.0' + , ipad: true + , tablet: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B511 Safari/9537.53': { + ios: true + , osversion: '7.0.3' + , version: '7.0' + , ipod: true + , mobile: true + , webkit: true + , safari: true + , a: true + } + , 'Mozilla/5.0 (iPod; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3': { + ios: true + , osversion: '5.1' + , version: '5.1' + , ipod: true + , mobile: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5': { + ios: true + , osversion: '4.3.3' + , version: '5.0' + , ipod: true + , mobile: true + , webkit: true + , safari: true + , c: true + } + , 'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3': { + ios: true + , version: '3.0' + , ipod: true + , mobile: true + , webkit: true + , safari: true + , c: true + } + } , 'Internet Explorer': { 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; MAARJS; rv:11.0) like Gecko': { msie: true @@ -588,148 +739,6 @@ module.exports.useragents = { , x: true } } - , iPhone: { - 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11B554a': { - ios: true - , osversion: '7.0.4' - , iphone: true - , mobile: true - , webkit: true - , a: true - } - , 'Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5': { - ios: true - , osversion: '4.3.2' - , version: '5.0' - , iphone: true - , mobile: true - , webkit: true - , c: true - } - , 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3': { - ios: true - , version: '3.0' - , iphone: true - , mobile: true - , webkit: true - , x: true - } - , 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B5097d Safari/6531.22.7': { - ios: true - , osversion: '4.1' - , version: '4.0' - , iphone: true - , mobile: true - , webkit: true - , c: true - } - , 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en-gb) AppleWebKit/526+ (KHTML, like Gecko) Version/3.1 iPhone': { - ios: true - , version: '3.1' - , iphone: true - , mobile: true - , webkit: true - , x: true - } - , 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1': { - ios: true - , osversion: '9.0' - , version: '9.0' - , iphone: true - , mobile: true - , webkit: true - , a: true - } - } - , iPad: { - 'Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53': { - ios: true - , osversion: '7.0.4' - , name: 'iPad' - , version: '7.0' - , ipad: true - , tablet: true - , webkit: true - , a: true - } - , 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25': { - ios: true - , osversion: '6.0' - , name: 'iPad' - , version: '6.0' - , ipad: true - , tablet: true - , webkit: true - , a: true - } - , 'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3': { - ios: true - , osversion: '5.1' - , name: 'iPad' - , version: '5.1' - , ipad: true - , tablet: true - , webkit: true - , c: true - } - , 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5': { - ios: true - , osversion: '4.3.2' - , name: 'iPad' - , version: '5.0' - , ipad: true - , tablet: true - , webkit: true - , c: true - } - , 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B360 Safari/531.21.10': { - ios: true - , osversion: '3.2' - , name: 'iPad' - , version: '4.0' - , ipad: true - , tablet: true - , webkit: true - , c: true - } - } - , iPod: { - 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B511 Safari/9537.53': { - ios: true - , osversion: '7.0.3' - , version: '7.0' - , ipod: true - , mobile: true - , webkit: true - , a: true - } - , 'Mozilla/5.0 (iPod; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3': { - ios: true - , osversion: '5.1' - , version: '5.1' - , ipod: true - , mobile: true - , webkit: true - , c: true - } - , 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5': { - ios: true - , osversion: '4.3.3' - , version: '5.0' - , ipod: true - , mobile: true - , webkit: true - , c: true - } - , 'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3': { - ios: true - , version: '3.0' - , ipod: true - , mobile: true - , webkit: true - , x: true - } - } , BlackBerry: { 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.1.0.4633 Mobile Safari/537.10+': { blackberry: true From 62745525dfd824ea7b15641360276a6379ec9711 Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Sun, 8 May 2016 14:24:36 +0300 Subject: [PATCH 2/6] add support firefox for iOS --- src/bowser.js | 6 +++--- src/useragents.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bowser.js b/src/bowser.js index 99da71c..c0e0825 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -47,7 +47,7 @@ , mobile = !tablet && /[^-]mobi/i.test(ua) , result - if (/opera|opr/i.test(ua)) { + if (/opera|opr|opios/i.test(ua)) { result = { name: 'Opera' , opera: t @@ -131,11 +131,11 @@ , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) } } - else if (/firefox|iceweasel/i.test(ua)) { + else if (/firefox|iceweasel|fxios/i.test(ua)) { result = { name: 'Firefox' , firefox: t - , version: getFirstMatch(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i) + , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) } if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { result.firefoxos = t diff --git a/src/useragents.js b/src/useragents.js index fd8d782..77049f5 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -715,7 +715,17 @@ module.exports.useragents = { , linux: true , c: true } + , 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) FxiOS/3.0 Mobile/13E238 Safari/601.1.46': { + firefox: true + , version: '3.0' + , osversion: '9.3.1' + , ios: true + , iphone: true + , mobile: true + , a: true + , webkit: true } + } , SeaMonkey: { 'Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1': { gecko: true From 35f635b845c678af7ef46c8070bfb3a77e5c9ed1 Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Sun, 8 May 2016 14:27:24 +0300 Subject: [PATCH 3/6] add iOS Safari and Chrome to the tests --- src/useragents.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/useragents.js b/src/useragents.js index 77049f5..49f42cf 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -131,6 +131,16 @@ module.exports.useragents = { , webkit: true , c: true } + , 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/50.0.2661.95 Mobile/13E238 Safari/601.1.46': { + chrome: true + , version: '50.0' + , osversion: '9.3.1' + , webkit: true + , ios: true + , iphone: true + , mobile: true + , a: true + } } , 'Amazon Silk': { 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true': { @@ -500,6 +510,16 @@ module.exports.useragents = { , safari: true , c: true } + , 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13E238 Safari/601.1': { + ios: true + , iphone: true + , safari: true + , version: '9.0' + , mobile: true + , osversion: '9.3.1' + , a: true + , webkit: true + } } , 'Internet Explorer': { 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; MAARJS; rv:11.0) like Gecko': { From e55dd78792e482b241b3b5ee51155cf89047894b Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Sun, 8 May 2016 14:37:10 +0300 Subject: [PATCH 4/6] add support of Maxthon browser on iOS --- src/bowser.js | 9 ++++++++- src/useragents.js | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/bowser.js b/src/bowser.js index c0e0825..fb8f3eb 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -68,6 +68,13 @@ , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) } } + else if (/mxios/i.test(ua)) { + result = { + name: 'Maxthon' + , maxthon: t + , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) + } + } else if (windowsphone) { result = { name: 'Windows Phone' @@ -291,7 +298,7 @@ if (result.msedge || (result.msie && result.version >= 10) || (result.yandexbrowser && result.version >= 15) || - (result.vivaldi && result.version >= 1.0) || + (result.vivaldi && result.version >= 1.0) || (result.chrome && result.version >= 20) || (result.firefox && result.version >= 20.0) || (result.safari && result.version >= 6) || diff --git a/src/useragents.js b/src/useragents.js index 49f42cf..ec27910 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -1145,4 +1145,16 @@ module.exports.useragents = { x: true } } + , 'Maxthon': { + 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13E238 Safari/601.1 MXiOS/4.8.6.59': { + mobile: true + , ios: true + , iphone: true + , version: '4.8.6.59' + , osversion: '9.3.1' + , webkit: true + , maxthon: true + , a: true + } + } } From 0b120a860ceed0226d6c014a8dca6354cd4bae7c Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Sun, 8 May 2016 14:41:55 +0300 Subject: [PATCH 5/6] add tests for UC Browser on iOS --- src/useragents.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/useragents.js b/src/useragents.js index ec27910..d373dba 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -1128,6 +1128,16 @@ module.exports.useragents = { webkit: true, x: true } + , 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X; en-US) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/13E238 UCBrowser/10.7.0.782 Mobile': { + iphone: true + , ios: true + , mobile: true + , osversion: '9.3.1' + , version: '10.7.0.782' + , webkit: true + , a: true + , ucbrowser: true + } } , "QupZilla": { 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.8.2 Safari/538.1': { From 4ac5b4e14d409d26deb5af6e0c63e25c2350643e Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Sun, 8 May 2016 14:58:18 +0300 Subject: [PATCH 6/6] add Opera Coast detection fix #133 --- src/bowser.js | 9 ++++++++- src/useragents.js | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/bowser.js b/src/bowser.js index fb8f3eb..37a0cd8 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -51,7 +51,14 @@ result = { name: 'Opera' , opera: t - , version: versionIdentifier || getFirstMatch(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i) + , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) + } + } + else if (/coast/i.test(ua)) { + result = { + name: 'Opera Coast' + , coast: t + , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) } } else if (/yabrowser/i.test(ua)) { diff --git a/src/useragents.js b/src/useragents.js index d373dba..d90f722 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -290,7 +290,19 @@ module.exports.useragents = { , linux: true , c: true } + } + , 'Opera Coast': { + 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Coast/5.02.99991 Mobile/13E238 Safari/7534.48.3': { + coast: true + , version: '5.02' + , osversion: '9.3.1' + , iphone: true + , ios: true + , mobile: true + , a: true + , webkit: true } + } , 'Yandex Browser': { 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 YaBrowser/15.4.2272.3420 (beta) Yowser/2.0 Safari/537.36': { yandexbrowser: true