@applitools/driver
Version:
Applitools universal framework wrapper
177 lines (176 loc) • 8.44 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractUserAgentEnvironment = void 0;
const utils = __importStar(require("@applitools/utils"));
const majorMinorRegexpString = '(?<majorVersion>[^ .;_)]+)[_.;](?<minorVersion>[^ .;_)]*)';
const platformRegexpMapping = [
['Windows', new RegExp(`Windows(?:(?: NT)? ${majorMinorRegexpString}?)?`)],
['iOS', new RegExp(`CPU(?: i[a-zA-Z]+)? OS ${majorMinorRegexpString}`)],
['Mac OS X', new RegExp(`Mac OS X(?: ${majorMinorRegexpString})?`)],
['Android', new RegExp(`Android ${majorMinorRegexpString}`)],
['Macintosh', new RegExp(`Mac_PowerPC`)],
['Linux', new RegExp(`Linux`)],
['Chrome OS', new RegExp(`CrOS`)],
['SymbOS', new RegExp(`SymbOS`)],
];
const browserRegexpMapping = [
['IE', new RegExp(`rv:${majorMinorRegexpString}\\) like Gecko`)],
['IE', new RegExp(`MSIE ${majorMinorRegexpString}`)],
['Electron', new RegExp(`Electron/${majorMinorRegexpString}`)],
['Opera', new RegExp(`Opera/${majorMinorRegexpString}`)],
['Edge', new RegExp(`(?:Edg|Edge)/${majorMinorRegexpString}`)],
['Chrome', new RegExp(`Chrome/${majorMinorRegexpString}`)],
['Safari', new RegExp(`Safari/${majorMinorRegexpString}`)],
['Firefox', new RegExp(`Firefox/${majorMinorRegexpString}`)],
];
const browserVersionRegexp = new RegExp(`(?:Version/${majorMinorRegexpString})`);
const windowsVersionsMapping = {
'0.1.0': '7',
'0.2.0': '8',
'0.3.0': '8.1',
'10.0.0': '10',
'15.0.0': '11',
};
function extractUserAgentEnvironment(userAgent) {
var _a, _b, _c, _d;
let userAgentLegacy, userAgentObject;
if (utils.types.isString(userAgent)) {
userAgentLegacy = userAgent.trim();
}
else {
userAgentLegacy = userAgent.legacy.trim();
userAgentObject = userAgent;
}
const userAgentLegacyEnvironment = {
...extractUserAgentLegacyPlatform(userAgentLegacy),
...extractUserAgentLegacyBrowser(userAgentLegacy),
};
const userAgentEnvironment = userAgentObject && extractUserAgentObjectEnvironment(userAgentObject);
return {
...userAgentEnvironment,
platformName: (_a = userAgentEnvironment === null || userAgentEnvironment === void 0 ? void 0 : userAgentEnvironment.platformName) !== null && _a !== void 0 ? _a : userAgentLegacyEnvironment.platformName,
platformVersion: (_b = userAgentEnvironment === null || userAgentEnvironment === void 0 ? void 0 : userAgentEnvironment.platformVersion) !== null && _b !== void 0 ? _b : userAgentLegacyEnvironment.platformVersion,
browserName: (_c = userAgentLegacyEnvironment.browserName) !== null && _c !== void 0 ? _c : userAgentEnvironment === null || userAgentEnvironment === void 0 ? void 0 : userAgentEnvironment.browserName,
browserVersion: (_d = userAgentLegacyEnvironment.browserVersion) !== null && _d !== void 0 ? _d : userAgentEnvironment === null || userAgentEnvironment === void 0 ? void 0 : userAgentEnvironment.browserVersion,
isReliable: !!((userAgentEnvironment === null || userAgentEnvironment === void 0 ? void 0 : userAgentEnvironment.platformName) && (userAgentEnvironment === null || userAgentEnvironment === void 0 ? void 0 : userAgentEnvironment.platformVersion)),
};
}
exports.extractUserAgentEnvironment = extractUserAgentEnvironment;
function extractUserAgentLegacyPlatform(userAgent) {
let info;
for (const [platformName, regexp] of platformRegexpMapping) {
const match = regexp.exec(userAgent);
if (match) {
info = { platformName, ...match.groups };
break;
}
}
if (!info)
return { platformName: 'Unknown' };
if (info.platformName === 'Macintosh' || info.platformName === 'Chrome OS') {
info.minorVersion = undefined;
}
else if (info.platformName === 'Windows') {
if (info.majorVersion === 'XP') {
info.majorVersion = '5';
info.minorVersion = '1';
}
else if (info.majorVersion === '6' && info.minorVersion === '1') {
info.majorVersion = '7';
info.minorVersion = undefined;
}
else if (info.majorVersion === '6' && info.minorVersion === '2') {
info.majorVersion = '8';
info.minorVersion = undefined;
}
else if (info.majorVersion === '6' && info.minorVersion === '3') {
info.majorVersion = '8';
info.minorVersion = '1';
}
else if (info.majorVersion === '10') {
info.minorVersion = undefined;
}
else {
info.majorVersion = undefined;
info.minorVersion = undefined;
}
}
return {
platformName: info.platformName,
platformVersion: info.minorVersion ? `${info.majorVersion}.${info.minorVersion}` : info.majorVersion,
};
}
function extractUserAgentLegacyBrowser(userAgent) {
let info;
for (const [browserName, browserRegexp] of browserRegexpMapping) {
const browserMatch = browserRegexp.exec(userAgent);
if (browserMatch) {
info = { browserName, ...browserMatch.groups };
const versionMatch = browserVersionRegexp.exec(userAgent);
if (versionMatch)
info = { ...info, ...versionMatch.groups };
break;
}
}
if (!info)
return { browserName: 'Unknown' };
return {
browserName: info.browserName,
browserVersion: info.minorVersion ? `${info.majorVersion}.${info.minorVersion}` : info.majorVersion,
};
}
function extractUserAgentObjectEnvironment(userAgent) {
var _a, _b, _c, _d, _e, _f;
if (typeof userAgent.brands === 'string') {
try {
userAgent.brands = JSON.parse(userAgent.brands);
}
catch (e) {
userAgent.brands = [];
}
}
// we assume the structure of the brands array, but since it's an experimental API, we use optional chaining to stay on the safe side
const chromiumBrand = (_b = (_a = userAgent.brands) === null || _a === void 0 ? void 0 : _a.find) === null || _b === void 0 ? void 0 : _b.call(_a, brand => /Chromium/i.test(brand.brand));
const browserBrand = (_e = (_d = (_c = userAgent.brands) === null || _c === void 0 ? void 0 : _c.find) === null || _d === void 0 ? void 0 : _d.call(_c, brand => brand !== chromiumBrand && !/Not.?A.?Brand/i.test(brand.brand))) !== null && _e !== void 0 ? _e : chromiumBrand;
const environment = {
browserName: browserBrand === null || browserBrand === void 0 ? void 0 : browserBrand.brand,
browserVersion: browserBrand === null || browserBrand === void 0 ? void 0 : browserBrand.version,
platformName: userAgent.platform || undefined,
platformVersion: userAgent.platformVersion || undefined,
deviceName: userAgent.model || undefined,
isMobile: userAgent.mobile,
isChromium: Boolean(chromiumBrand),
};
if (environment.platformName === 'Windows') {
environment.platformVersion =
windowsVersionsMapping[environment.platformVersion];
}
else if (environment.platformName === 'macOS') {
environment.platformName = 'Mac OS X';
environment.platformVersion = (_f = environment.platformVersion) === null || _f === void 0 ? void 0 : _f.split(/[._]/, 2).join('.');
}
return environment;
}