From 80d0934c006c282ebab35711e47afc8ba81e3736 Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:06:51 -0500 Subject: [PATCH 1/8] Added Vivaldi headers. --- src/useragents.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/useragents.js b/src/useragents.js index de560c4..d7e2976 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -1021,6 +1021,22 @@ module.exports.useragents = { , x: true } } + , Vivaldi: { + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36 Vivaldi/1.0.303.52' : { + vivaldi: true + , version: '1.0' + , mac: true + , webkit: true + , a: true + }, + 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36 Vivaldi/1.0.303.52': { + vivaldi: true + , version: '1.0' + , windows: true + , webkit: true + , c: true + } + } , Generic: { 'Generic/2.15 libww': { name: 'Generic' From fb5ddeadcb5fc70bb058e7d607297d17ab819420 Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:09:18 -0500 Subject: [PATCH 2/8] Added Vivaldi case. --- src/bowser.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/bowser.js b/src/bowser.js index fa4f666..6ea2b31 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -88,6 +88,13 @@ , version: edgeVersion } } + else if (/vivaldi/i.test(ua)) { + result = { + name: 'Vivaldi' + , vivaldi: t + , version: versionIdentifier + } + } else if (/chrome|crios|crmo/i.test(ua)) { result = { name: 'Chrome' From 87935f0e2db134b4131e858b02091c672d48246a Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:09:40 -0500 Subject: [PATCH 3/8] Docs for Vivaldi browser. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6ecd78c..3294106 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ if (bowser.msie && bowser.version <= 6) { ## Flags set for detected Browsers[Engines] + * `vivaldi`[`webkit`] * `chrome`[`webkit`] * `firefox`[`gecko`] * `msie` From 14f16d6120f0addec27addaa4e8636fcb6717efb Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:12:18 -0500 Subject: [PATCH 4/8] Trying to get version number to validate. --- src/bowser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bowser.js b/src/bowser.js index 6ea2b31..85d5a3f 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -92,7 +92,7 @@ result = { name: 'Vivaldi' , vivaldi: t - , version: versionIdentifier + , version: versionIdentifier || getFirstMatch(/vivaldi[\d]+\/(\d+(\.\d+)?)/i) } } else if (/chrome|crios|crmo/i.test(ua)) { From b01795c47571a4354ff6a798d5bb2537c6ac7d55 Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:13:48 -0500 Subject: [PATCH 5/8] Fixed typo. --- src/useragents.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/useragents.js b/src/useragents.js index d7e2976..64d6232 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -1034,7 +1034,7 @@ module.exports.useragents = { , version: '1.0' , windows: true , webkit: true - , c: true + , a: true } } , Generic: { From b98e37c6ac1dd13fff313010b67478403ede3fc3 Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:17:10 -0500 Subject: [PATCH 6/8] Vivaldi version number is now parsed correctly. --- src/bowser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bowser.js b/src/bowser.js index 85d5a3f..4448d3c 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -92,7 +92,7 @@ result = { name: 'Vivaldi' , vivaldi: t - , version: versionIdentifier || getFirstMatch(/vivaldi[\d]+\/(\d+(\.\d+)?)/i) + , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier } } else if (/chrome|crios|crmo/i.test(ua)) { From 23697032da5a3a326bff42e19eda7101f8f112d3 Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:19:56 -0500 Subject: [PATCH 7/8] Added support for grade a. --- src/bowser.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bowser.js b/src/bowser.js index 4448d3c..7c92ce5 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -260,6 +260,7 @@ if (result.msedge || (result.msie && result.version >= 10) || (result.yandexbrowser && result.version >= 15) || + (result.vivaldi && result.version >= 1.0) || (result.chrome && result.version >= 20) || (result.firefox && result.version >= 20.0) || (result.safari && result.version >= 6) || From 1d39dcabbe3c7d43219efcfdbcdb5667d03473cd Mon Sep 17 00:00:00 2001 From: Ivan Carosati Date: Mon, 7 Dec 2015 16:54:22 -0500 Subject: [PATCH 8/8] Compiled. --- bowser.js | 37 ++++++++++++++++++++++++++++++------- bowser.min.js | 2 +- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/bowser.js b/bowser.js index 0f09bf3..d2ee431 100644 --- a/bowser.js +++ b/bowser.js @@ -30,7 +30,15 @@ var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() , likeAndroid = /like android/i.test(ua) , android = !likeAndroid && /android/i.test(ua) - , chromeBook = /CrOS/.test(ua) + , chromeos = /CrOS/.test(ua) + , silk = /silk/i.test(ua) + , sailfish = /sailfish/i.test(ua) + , tizen = /tizen/i.test(ua) + , webos = /(web|hpw)os/i.test(ua) + , windowsphone = /windows phone/i.test(ua) + , windows = !windowsphone && /windows/i.test(ua) + , mac = !iosdevice && !silk && /macintosh/i.test(ua) + , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) , tablet = /tablet/i.test(ua) @@ -51,7 +59,7 @@ , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) } } - else if (/windows phone/i.test(ua)) { + else if (windowsphone) { result = { name: 'Windows Phone' , windowsphone: t @@ -71,9 +79,10 @@ , msie: t , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) } - } else if (chromeBook) { + } else if (chromeos) { result = { name: 'Chrome' + , chromeos: t , chromeBook: t , chrome: t , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) @@ -85,6 +94,13 @@ , version: edgeVersion } } + else if (/vivaldi/i.test(ua)) { + result = { + name: 'Vivaldi' + , vivaldi: t + , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier + } + } else if (/chrome|crios|crmo/i.test(ua)) { result = { name: 'Chrome' @@ -101,7 +117,7 @@ result.version = versionIdentifier } } - else if (/sailfish/i.test(ua)) { + else if (sailfish) { result = { name: 'Sailfish' , sailfish: t @@ -125,7 +141,7 @@ result.firefoxos = t } } - else if (/silk/i.test(ua)) { + else if (silk) { result = { name: 'Amazon Silk' , silk: t @@ -152,7 +168,7 @@ , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) } } - else if (/(web|hpw)os/i.test(ua)) { + else if (webos) { result = { name: 'WebOS' , webos: t @@ -167,7 +183,7 @@ , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) }; } - else if (/tizen/i.test(ua)) { + else if (tizen) { result = { name: 'Tizen' , tizen: t @@ -207,6 +223,12 @@ } else if (iosdevice) { result[iosdevice] = t result.ios = t + } else if (windows) { + result.windows = t + } else if (mac) { + result.mac = t + } else if (linux) { + result.linux = t } // OS version extraction @@ -244,6 +266,7 @@ if (result.msedge || (result.msie && result.version >= 10) || (result.yandexbrowser && result.version >= 15) || + (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/bowser.min.js b/bowser.min.js index 66a3cdf..27a37c3 100644 --- a/bowser.min.js +++ b/bowser.min.js @@ -3,4 +3,4 @@ * https://github.com/ded/bowser * MIT License | (c) Dustin Diaz 2015 */ -!function(e,t){typeof module!="undefined"&&module.exports?module.exports=t():typeof define=="function"&&define.amd?define(t):this[e]=t()}("bowser",function(){function t(t){function n(e){var n=t.match(e);return n&&n.length>1&&n[1]||""}function r(e){var n=t.match(e);return n&&n.length>1&&n[2]||""}var i=n(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(t),o=!s&&/android/i.test(t),u=/CrOS/.test(t),a=n(/edge\/(\d+(\.\d+)?)/i),f=n(/version\/(\d+(\.\d+)?)/i),l=/tablet/i.test(t),c=!l&&/[^-]mobi/i.test(t),h;/opera|opr/i.test(t)?h={name:"Opera",opera:e,version:f||n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(t)?h={name:"Yandex Browser",yandexbrowser:e,version:f||n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/windows phone/i.test(t)?(h={name:"Windows Phone",windowsphone:e},a?(h.msedge=e,h.version=a):(h.msie=e,h.version=n(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?h={name:"Internet Explorer",msie:e,version:n(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?h={name:"Chrome",chromeBook:e,chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(t)?h={name:"Microsoft Edge",msedge:e,version:a}:/chrome|crios|crmo/i.test(t)?h={name:"Chrome",chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:i?(h={name:i=="iphone"?"iPhone":i=="ipad"?"iPad":"iPod"},f&&(h.version=f)):/sailfish/i.test(t)?h={name:"Sailfish",sailfish:e,version:n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?h={name:"SeaMonkey",seamonkey:e,version:n(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel/i.test(t)?(h={name:"Firefox",firefox:e,version:n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(h.firefoxos=e)):/silk/i.test(t)?h={name:"Amazon Silk",silk:e,version:n(/silk\/(\d+(\.\d+)?)/i)}:o?h={name:"Android",version:f}:/phantom/i.test(t)?h={name:"PhantomJS",phantom:e,version:n(/phantomjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?h={name:"BlackBerry",blackberry:e,version:f||n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:/(web|hpw)os/i.test(t)?(h={name:"WebOS",webos:e,version:f||n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(h.touchpad=e)):/bada/i.test(t)?h={name:"Bada",bada:e,version:n(/dolfin\/(\d+(\.\d+)?)/i)}:/tizen/i.test(t)?h={name:"Tizen",tizen:e,version:n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||f}:/safari/i.test(t)?h={name:"Safari",safari:e,version:f}:h={name:n(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!h.msedge&&/(apple)?webkit/i.test(t)?(h.name=h.name||"Webkit",h.webkit=e,!h.version&&f&&(h.version=f)):!h.opera&&/gecko\//i.test(t)&&(h.name=h.name||"Gecko",h.gecko=e,h.version=h.version||n(/gecko\/(\d+(\.\d+)?)/i)),!h.msedge&&(o||h.silk)?h.android=e:i&&(h[i]=e,h.ios=e);var p="";h.windowsphone?p=n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i?(p=n(/os (\d+([_\s]\d+)*) like mac os x/i),p=p.replace(/[_\s]/g,".")):o?p=n(/android[ \/-](\d+(\.\d+)*)/i):h.webos?p=n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):h.blackberry?p=n(/rim\stablet\sos\s(\d+(\.\d+)*)/i):h.bada?p=n(/bada\/(\d+(\.\d+)*)/i):h.tizen&&(p=n(/tizen[\/\s](\d+(\.\d+)*)/i)),p&&(h.osversion=p);var d=p.split(".")[0];if(l||i=="ipad"||o&&(d==3||d==4&&!c)||h.silk)h.tablet=e;else if(c||i=="iphone"||i=="ipod"||o||h.blackberry||h.webos||h.bada)h.mobile=e;return h.msedge||h.msie&&h.version>=10||h.yandexbrowser&&h.version>=15||h.chrome&&h.version>=20||h.firefox&&h.version>=20||h.safari&&h.version>=6||h.opera&&h.version>=10||h.ios&&h.osversion&&h.osversion.split(".")[0]>=6||h.blackberry&&h.version>=10.1?h.a=e:h.msie&&h.version<10||h.chrome&&h.version<20||h.firefox&&h.version<20||h.safari&&h.version<6||h.opera&&h.version<10||h.ios&&h.osversion&&h.osversion.split(".")[0]<6?h.c=e:h.x=e,h}var e=!0,n=t(typeof navigator!="undefined"?navigator.userAgent:"");return n.test=function(e){for(var t=0;t1&&n[1]||""}function r(e){var n=t.match(e);return n&&n.length>1&&n[2]||""}var i=n(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(t),o=!s&&/android/i.test(t),u=/CrOS/.test(t),a=/silk/i.test(t),f=/sailfish/i.test(t),l=/tizen/i.test(t),c=/(web|hpw)os/i.test(t),h=/windows phone/i.test(t),p=!h&&/windows/i.test(t),d=!i&&!a&&/macintosh/i.test(t),v=!o&&!f&&!l&&!c&&/linux/i.test(t),m=n(/edge\/(\d+(\.\d+)?)/i),g=n(/version\/(\d+(\.\d+)?)/i),y=/tablet/i.test(t),b=!y&&/[^-]mobi/i.test(t),w;/opera|opr/i.test(t)?w={name:"Opera",opera:e,version:g||n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(t)?w={name:"Yandex Browser",yandexbrowser:e,version:g||n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:h?(w={name:"Windows Phone",windowsphone:e},m?(w.msedge=e,w.version=m):(w.msie=e,w.version=n(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?w={name:"Internet Explorer",msie:e,version:n(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?w={name:"Chrome",chromeos:e,chromeBook:e,chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(t)?w={name:"Microsoft Edge",msedge:e,version:m}:/vivaldi/i.test(t)?w={name:"Vivaldi",vivaldi:e,version:n(/vivaldi\/(\d+(\.\d+)?)/i)||g}:/chrome|crios|crmo/i.test(t)?w={name:"Chrome",chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:i?(w={name:i=="iphone"?"iPhone":i=="ipad"?"iPad":"iPod"},g&&(w.version=g)):f?w={name:"Sailfish",sailfish:e,version:n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?w={name:"SeaMonkey",seamonkey:e,version:n(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel/i.test(t)?(w={name:"Firefox",firefox:e,version:n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(w.firefoxos=e)):a?w={name:"Amazon Silk",silk:e,version:n(/silk\/(\d+(\.\d+)?)/i)}:o?w={name:"Android",version:g}:/phantom/i.test(t)?w={name:"PhantomJS",phantom:e,version:n(/phantomjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?w={name:"BlackBerry",blackberry:e,version:g||n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:c?(w={name:"WebOS",webos:e,version:g||n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(w.touchpad=e)):/bada/i.test(t)?w={name:"Bada",bada:e,version:n(/dolfin\/(\d+(\.\d+)?)/i)}:l?w={name:"Tizen",tizen:e,version:n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||g}:/safari/i.test(t)?w={name:"Safari",safari:e,version:g}:w={name:n(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!w.msedge&&/(apple)?webkit/i.test(t)?(w.name=w.name||"Webkit",w.webkit=e,!w.version&&g&&(w.version=g)):!w.opera&&/gecko\//i.test(t)&&(w.name=w.name||"Gecko",w.gecko=e,w.version=w.version||n(/gecko\/(\d+(\.\d+)?)/i)),!w.msedge&&(o||w.silk)?w.android=e:i?(w[i]=e,w.ios=e):p?w.windows=e:d?w.mac=e:v&&(w.linux=e);var E="";w.windowsphone?E=n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i?(E=n(/os (\d+([_\s]\d+)*) like mac os x/i),E=E.replace(/[_\s]/g,".")):o?E=n(/android[ \/-](\d+(\.\d+)*)/i):w.webos?E=n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):w.blackberry?E=n(/rim\stablet\sos\s(\d+(\.\d+)*)/i):w.bada?E=n(/bada\/(\d+(\.\d+)*)/i):w.tizen&&(E=n(/tizen[\/\s](\d+(\.\d+)*)/i)),E&&(w.osversion=E);var S=E.split(".")[0];if(y||i=="ipad"||o&&(S==3||S==4&&!b)||w.silk)w.tablet=e;else if(b||i=="iphone"||i=="ipod"||o||w.blackberry||w.webos||w.bada)w.mobile=e;return w.msedge||w.msie&&w.version>=10||w.yandexbrowser&&w.version>=15||w.vivaldi&&w.version>=1||w.chrome&&w.version>=20||w.firefox&&w.version>=20||w.safari&&w.version>=6||w.opera&&w.version>=10||w.ios&&w.osversion&&w.osversion.split(".")[0]>=6||w.blackberry&&w.version>=10.1?w.a=e:w.msie&&w.version<10||w.chrome&&w.version<20||w.firefox&&w.version<20||w.safari&&w.version<6||w.opera&&w.version<10||w.ios&&w.osversion&&w.osversion.split(".")[0]<6?w.c=e:w.x=e,w}var e=!0,n=t(typeof navigator!="undefined"?navigator.userAgent:"");return n.test=function(e){for(var t=0;t