{"version":3,"file":"getBrowser.cjs","sources":["../../src/browser/getBrowser.js"],"sourcesContent":["/* global window, chrome, browser */\n\nconst getBrowserStrategyGetManifest = function () {\n    let name = 'not-available';\n\n    const manifest = (\n        typeof chrome === 'object' &&\n        chrome &&\n        chrome.runtime &&\n        typeof chrome.runtime.getManifest === 'function' &&\n        chrome.runtime.getManifest()\n    );\n\n    if (\n        manifest &&\n        manifest['applications'] &&\n        manifest['applications']['gecko']\n    ) {\n        name = 'Firefox';\n    }\n\n    return {\n        name: name.toLowerCase()\n    };\n};\n\nconst getBrowserStrategyGetBrowserInfo = async function () {\n    let name = 'not-available';\n    let version = 'not-available';\n\n    const browserInfo = (\n        typeof browser === 'object' &&\n        browser &&\n        browser.runtime &&\n        typeof browser.runtime.getBrowserInfo === 'function' &&\n        await browser.runtime.getBrowserInfo()\n    );\n\n    if (browserInfo) {\n        name = browserInfo.name;\n        version = browserInfo.version;\n    }\n\n    return {\n        name: name.toLowerCase(),\n        version\n    };\n};\n\nconst getBrowserStrategyCustomHacks = function () {\n    let name = 'not-available';\n    const version = 'not-available';\n    let byPassedUserAgentModification = false;\n\n    identifyBrowserName: {\n        // Detect browser (without using window.navigator.userAgent)\n\n        if (typeof window.mozInnerScreenX === 'number') {\n            // DATED-CODE\n            name = 'Firefox';\n            break identifyBrowserName;\n        }\n\n        if (typeof window.opr === 'object' && window.opr) {\n            // DATED-CODE\n            name = 'Opera';\n            break identifyBrowserName;\n        }\n\n        if (typeof window.navigator.brave === 'object' && window.navigator.brave) {\n            // DATED-CODE\n            name = 'Brave';\n            break identifyBrowserName;\n        }\n\n        // Just a block\n        {\n            const userAgentData = window.navigator.userAgentData || {};\n            const brands = userAgentData.brands;\n\n            if (Array.isArray(brands)) {\n                if (!brands.length) {\n                    // DATED-CODE: As of 2023-Jan, the code would reach here if a user has customized the User-Agent string on\n                    // Chrome / Chromium based browser. Firefox does not support `window.navigator.userAgentData` yet.\n                    byPassedUserAgentModification = true;\n                    name = 'Chrome'; // Note: This is still a guess which should be true for most of the users.\n                    break identifyBrowserName;\n                }\n            }\n        }\n    }\n\n    return {\n        name: name.toLowerCase(),\n        version,\n        byPassedUserAgentModification\n    };\n};\n\nconst getBrowserStrategyUserAgentData = function () {\n    let name = 'not-available';\n    let version = 'not-available';\n\n    const userAgentData = window.navigator.userAgentData || {};\n    const brands = userAgentData.brands || [];\n\n    for (const ob of brands) {\n        const brand = ((brand) => {\n            if (brand === 'Google Chrome') {\n                return 'Chrome';\n            } else if (brand === 'Microsoft Edge') {\n                return 'Edge';\n            } else {\n                return brand.toLowerCase();\n            }\n        })(ob.brand);\n        if (\n            brand === 'Chrome' ||\n            brand === 'Edge' ||\n            brand === 'Brave' ||\n            brand === 'Opera' ||\n            (\n                brand === 'Chromium' &&\n                name === 'not-available'\n            )\n        ) {\n            name = brand;\n            version = ob.version || 'not-available';\n        }\n    }\n\n    return {\n        name: name.toLowerCase(),\n        version\n    };\n};\n\nconst getBrowserStrategyUserAgent = function () {\n    // https://stackoverflow.com/questions/5916900/how-can-you-detect-the-version-of-a-browser/16938481#16938481\n    const ua = navigator.userAgent;\n    let tem;\n    let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n    if (/trident/i.test(M[1])) {\n        tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n        return { name: 'IE', version: (tem[1] || '') };\n    }\n    if (M[1] === 'Chrome') {\n        tem = ua.match(/\\bOPR|Edge\\/(\\d+)/);\n        if (tem !== null) { return { name: 'Opera', version: tem[1] }; }\n    }\n    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n    if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) { M.splice(1, 1, tem[1]); }\n\n    const name = M[0] || 'not-available';\n    const version = M[1] || 'not-available';\n\n    return {\n        name: name.toLowerCase(),\n        version\n    };\n};\n\nconst getBrowser = (function () {\n    let confidenceLevel = 0;\n    let sourceOfConfidence = 'not-available';\n    let name = 'not-available';\n    let flagChromiumBased = null;\n    let encounteredError = null;\n\n    return async function () {\n        if (name === 'not-available') {\n            try {\n                identifyBrowserNameAndConfidenceLevel: {\n                    name = getBrowserStrategyGetManifest().name;\n                    if (name !== 'not-available') {\n                        sourceOfConfidence = 'getManifest';\n                        confidenceLevel = 1;\n                        break identifyBrowserNameAndConfidenceLevel;\n                    }\n\n                    name = (await getBrowserStrategyGetBrowserInfo()).name;\n                    if (name !== 'not-available') {\n                        sourceOfConfidence = 'getBrowserInfo';\n                        confidenceLevel = 1;\n                        break identifyBrowserNameAndConfidenceLevel;\n                    }\n\n                    name = getBrowserStrategyCustomHacks().name;\n                    if (name !== 'not-available') {\n                        sourceOfConfidence = 'customHacks';\n                        confidenceLevel = 0.9;\n                        break identifyBrowserNameAndConfidenceLevel;\n                    }\n\n                    name = getBrowserStrategyUserAgentData().name;\n                    if (name !== 'not-available') {\n                        sourceOfConfidence = 'userAgentData';\n                        confidenceLevel = 0.8;\n                        break identifyBrowserNameAndConfidenceLevel;\n                    }\n\n                    name = getBrowserStrategyUserAgent().name;\n                    if (name !== 'not-available') {\n                        sourceOfConfidence = 'userAgent';\n                        confidenceLevel = 0.7;\n                        break identifyBrowserNameAndConfidenceLevel;\n                    }\n\n                    name = 'chrome';\n                    sourceOfConfidence = 'blind-guess';\n                    confidenceLevel = 0.1;\n                }\n            } catch (err) {\n                encounteredError = err;\n            }\n\n            if (name === 'firefox') {\n                flagChromiumBased = false;\n            } else if (\n                [\n                    'brave',\n                    'chrome',\n                    'chromium',\n                    'opera',\n                    'edge'\n                ].includes(name)\n            ) {\n                flagChromiumBased = true;\n            }\n        }\n\n        return {\n            confidenceLevel,\n            sourceOfConfidence,\n            name,\n            flagChromiumBased,\n            encounteredError\n        };\n    };\n})();\n\nexport {\n    getBrowserStrategyGetManifest,\n    getBrowserStrategyGetBrowserInfo,\n    getBrowserStrategyCustomHacks,\n    getBrowserStrategyUserAgentData,\n    getBrowserStrategyUserAgent,\n    getBrowser\n};\n"],"names":["getBrowserStrategyGetManifest","name","manifest","chrome","runtime","getManifest","toLowerCase","getBrowserStrategyGetBrowserInfo","async","version","browserInfo","browser","getBrowserInfo","getBrowserStrategyCustomHacks","byPassedUserAgentModification","identifyBrowserName","window","mozInnerScreenX","opr","navigator","brave","brands","userAgentData","Array","isArray","length","getBrowserStrategyUserAgentData","ob","brand","getBrowserStrategyUserAgent","ua","userAgent","tem","M","match","test","exec","appName","appVersion","splice","getBrowser","confidenceLevel","sourceOfConfidence","flagChromiumBased","encounteredError","err","includes"],"mappings":"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"}