Skip to content

Instantly share code, notes, and snippets.

@kripz97
Created December 27, 2022 06:46
Show Gist options
  • Save kripz97/b545a2c3bfc163eb4979a727d6cc5c58 to your computer and use it in GitHub Desktop.
Save kripz97/b545a2c3bfc163eb4979a727d6cc5c58 to your computer and use it in GitHub Desktop.
Code to detect browser version
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