From 21a0a0ce72bfa68adf6f01c397a76b84993cb0f1 Mon Sep 17 00:00:00 2001 From: Jason Pang Date: Fri, 25 Aug 2017 21:23:35 -0700 Subject: [PATCH] Fix Chrome detection for Android 8 OPR6 build num One of Android 8's build numbers is 'opr6.170623.013'. This is expressed in the user agent as: "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36" Because this library detects the Opera browser if "opera", "opr", or "opios" is contained in the user agent, the above user agent string is incorrectly detected as a versionless Opera, instead of Chrome 60. This commit changes the detection of "opr" to require a trailing slash '/' character. This works because uild numbers are expressed as Build/X..., whereas Opera versions are expressed as OPR/X. fixes #193 --- src/bowser.js | 4 ++-- src/useragents.js | 30 ++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/bowser.js b/src/bowser.js index a510e96..19a7079 100644 --- a/src/bowser.js +++ b/src/bowser.js @@ -56,7 +56,7 @@ , opera: t , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) } - } else if (/opr|opios/i.test(ua)) { + } else if (/opr\/|opios/i.test(ua)) { // a new Opera result = { name: 'Opera' @@ -351,7 +351,7 @@ default: return undefined } } - + // OS version extraction var osVersion = ''; if (result.windows) { diff --git a/src/useragents.js b/src/useragents.js index 719b7a0..91a13c7 100644 --- a/src/useragents.js +++ b/src/useragents.js @@ -7,7 +7,16 @@ */ module.exports.useragents = { Chrome: { - 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 9 Build/LMY48T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Safari/537.36': { + 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36': { + chrome: true + , android: true + , osversion: '8.0.0' + , mobile: true + , version: '60.0' + , blink: true + , a: true + } + , 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 9 Build/LMY48T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Safari/537.36': { chrome: true , android: true , osversion: '5.1.1' @@ -206,7 +215,24 @@ module.exports.useragents = { } } , Opera: { - 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.72 Safari/537.36 OPR/19.0.1340.69721': { + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 OPR/47.0.2631.55': { + opera: true + , blink: true + , mac: true + , osversion: '10.11.6' + , version: '47.0' + , a: true + } + , 'Mozilla/5.0 (Linux; Android 8.0; Nexus 6P Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36 OPR/42.7.2246.114996': { + opera: true + , blink: true + , android: true + , osversion: '8.0' + , mobile: true + , version: '42.7' + , a: true + } + , 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.72 Safari/537.36 OPR/19.0.1340.69721': { opera: true , blink: true , android: true