outdated-browser-rework
Version:
Detects outdated browsers and asks users to upgrade to a new version. Handles mobile devices!
140 lines (119 loc) • 3.83 kB
JavaScript
var DEFAULTS = {
Chrome: 57, // Includes Chrome for mobile devices
Edge: 39,
Safari: 10,
"Mobile Safari": 10,
Opera: 50,
Firefox: 50,
Vivaldi: 1,
IE: false
}
var EDGEHTML_VS_EDGE_VERSIONS = {
12: 0.1,
13: 21,
14: 31,
15: 39,
16: 41,
17: 42,
18: 44
}
var updateDefaults = function (defaults, updatedValues) {
for (var key in updatedValues) {
defaults[key] = updatedValues[key]
}
return defaults
}
module.exports = function (parsedUserAgent, options) {
// Set default options
var browserSupport = options.browserSupport ? updateDefaults(DEFAULTS, options.browserSupport) : DEFAULTS
var requiredCssProperty = options.requiredCssProperty || false
var browserName = parsedUserAgent.browser.name;
var isAndroidButNotChrome
if (options.requireChromeOnAndroid) {
isAndroidButNotChrome = parsedUserAgent.os.name === "Android" && parsedUserAgent.browser.name !== "Chrome"
}
var parseMinorVersion = function (version) {
return version.replace(/[^\d.]/g, '').split(".")[1];
}
var isBrowserUnsupported = function () {
var isUnsupported = false
if (!(browserName in browserSupport)) {
if (!options.isUnknownBrowserOK) {
isUnsupported = true
}
} else if (!browserSupport[browserName]) {
isUnsupported = true
}
return isUnsupported;
}
var isBrowserUnsupportedResult = isBrowserUnsupported();
var isBrowserOutOfDate = function () {
var browserVersion = parsedUserAgent.browser.version;
var browserMajorVersion = parsedUserAgent.browser.major;
var osName = parsedUserAgent.os.name;
var osVersion = parsedUserAgent.os.version;
// Edge legacy needed a version mapping, Edge on Chromium doesn't
if (browserName === "Edge" && browserMajorVersion <= 18) {
browserMajorVersion = EDGEHTML_VS_EDGE_VERSIONS[browserMajorVersion];
}
// Firefox Mobile on iOS is essentially Mobile Safari so needs to be handled that way
// See: https://github.com/mikemaccana/outdated-browser-rework/issues/98#issuecomment-597721173
if (browserName === 'Firefox' && osName === 'iOS') {
browserName = 'Mobile Safari';
browserVersion = osVersion;
browserMajorVersion = osVersion.substring(0, osVersion.indexOf('.'));
}
var isOutOfDate = false
if (isBrowserUnsupportedResult) {
isOutOfDate = true;
} else if (browserName in browserSupport) {
var minVersion = browserSupport[browserName]
if (typeof minVersion == 'object') {
var minMajorVersion = minVersion.major
var minMinorVersion = minVersion.minor
if (browserMajorVersion < minMajorVersion) {
isOutOfDate = true
} else if (browserMajorVersion == minMajorVersion) {
var browserMinorVersion = parseMinorVersion(browserVersion)
if (browserMinorVersion < minMinorVersion) {
isOutOfDate = true
}
}
} else if (browserMajorVersion < minVersion) {
isOutOfDate = true
}
}
return isOutOfDate
}
// Returns true if a browser supports a css3 property
var isPropertySupported = function (property) {
if (!property) {
return true
}
var div = document.createElement("div")
var vendorPrefixes = ["khtml", "ms", "o", "moz", "webkit"]
var count = vendorPrefixes.length
// Note: HTMLElement.style.hasOwnProperty seems broken in Edge
if (property in div.style) {
return true
}
property = property.replace(/^[a-z]/, function (val) {
return val.toUpperCase()
})
while (count--) {
var prefixedProperty = vendorPrefixes[count] + property
// See comment re: HTMLElement.style.hasOwnProperty above
if (prefixedProperty in div.style) {
return true
}
}
return false
}
// Return results
return {
isAndroidButNotChrome: isAndroidButNotChrome,
isBrowserOutOfDate: isBrowserOutOfDate(),
isBrowserUnsupported: isBrowserUnsupportedResult,
isPropertySupported: isPropertySupported(requiredCssProperty)
};
}