Created
December 27, 2022 06:46
-
-
Save kripz97/b545a2c3bfc163eb4979a727d6cc5c58 to your computer and use it in GitHub Desktop.
Code to detect browser version
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export const shouldSendSameSiteNone = useragent => { | |
return !isSameSiteNoneIncompatible(useragent); | |
}; | |
// Classes of browsers known to be incompatible. | |
const isSameSiteNoneIncompatible = useragent => { | |
return ( | |
hasWebKitSameSiteBug(useragent) || | |
dropsUnrecognizedSameSiteCookies(useragent) | |
); | |
}; | |
const hasWebKitSameSiteBug = useragent => { | |
return ( | |
isIosVersion(12, useragent) || | |
(isMacosxVersion(10, 14, useragent) && | |
(isSafari(useragent) || isMacEmbeddedBrowser(useragent))) | |
); | |
}; | |
const dropsUnrecognizedSameSiteCookies = useragent => { | |
if (isUcBrowser(useragent)) { | |
return !isUcBrowserVersionAtLeast(12, 13, 2, useragent); | |
} | |
return ( | |
isChromiumBased(useragent) && | |
isChromiumVersionAtLeast(51, useragent) && | |
!isChromiumVersionAtLeast(67, useragent) | |
); | |
}; | |
// Regex parsing of User-Agent string. (See note above!) | |
const isIosVersion = (major, useragent) => { | |
// "\(iP.+; CPU .*OS (\d+)[\d]*.*\) AppleWebKit\/" | |
const iosRegex = /\(iP.+; CPU .*OS (\d+)[\d]*.*\) AppleWebKit\//; | |
// Extract digits from the first capturing group. | |
const userAgentMatch = useragent.match(iosRegex) || []; | |
return userAgentMatch[1] === major.toString(); | |
}; | |
const isMacosxVersion = (major, minor, useragent) => { | |
// "\(Macintosh;.*Mac OS X (\d+)(\d+)[\d]*.*\) AppleWebKit\/" | |
const macOsRegex = /\(Macintosh;.*Mac OS X (\d+)(\d+)[\d]*.*\) AppleWebKit\//; | |
// Extract digits from first and second capturing groups. | |
const userAgentMatch = useragent.match(macOsRegex) || []; | |
return ( | |
userAgentMatch[1] === major.toString() && | |
userAgentMatch[2] === minor.toString() | |
); | |
}; | |
const isSafari = useragent => { | |
// "Version\/.* Safari\/" | |
const safariRegex = /Version\/.* Safari\//; | |
return safariRegex.test(useragent) && !isChromiumBased(useragent); | |
}; | |
const isMacEmbeddedBrowser = useragent => { | |
// "^Mozilla\/[\.\d]+ \(Macintosh;.*Mac OS X [\d]+\) " + "AppleWebKit\/[\.\d]+ \(KHTML, like Gecko\)$" | |
const macEmbeddedRegex = /^Mozilla\/[\.\d]+ \(Macintosh;.*Mac OS X [\d]+\) " + "AppleWebKit\/[\.\d]+ \(KHTML, like Gecko\)$/; | |
return macEmbeddedRegex.test(useragent); | |
}; | |
const isChromiumBased = useragent => { | |
// "Chrom(e|ium)" | |
const ChromiumRegex = /Chrom(e|ium)/; | |
return ChromiumRegex.test(useragent); | |
}; | |
const isChromiumVersionAtLeast = (major, useragent) => { | |
// "Chrom[^ \/]+\/(\d+)[\.\d]* " | |
const chromeVersionRegex = /Chrom[^ \/]+\/(\d+)[\.\d]* /; | |
// Extract digits from the first capturing group. | |
let version = 0; | |
if (useragent.match(chromeVersionRegex)) | |
version = +(useragent.match(chromeVersionRegex)[1] || ''); | |
return version >= major; | |
}; | |
const isUcBrowser = useragent => { | |
// "UCBrowser\/" | |
const ucBrowserRegex = /UCBrowser\//; | |
return ucBrowserRegex.test(useragent); | |
}; | |
const isUcBrowserVersionAtLeast = (major, minor, build, useragent) => { | |
// "UCBrowser\/(\d+)\.(\d+)\.(\d+)[\.\d]* " | |
const ucBrowserVersionRegex = /UCBrowser\/(\d+)\.(\d+)\.(\d+)[\.\d]* /; | |
// Extract digits from three capturing groups. | |
const major_version = +useragent.match(ucBrowserVersionRegex)[1]; | |
const minor_version = +useragent.match(ucBrowserVersionRegex)[2]; | |
const build_version = +useragent.match(ucBrowserVersionRegex)[3]; | |
if (major_version !== major) { | |
return major_version > major; | |
} | |
if (minor_version !== minor) { | |
return minor_version > minor; | |
} | |
return build_version >= build; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment