Home Reference Source

js/utils/detect-browser.js

/**
 * @file detect-browser.js
 * @since 2.0.0
 */

import window from 'global/window';

/**
 * Browser detector.
 *
 * @private
 * @return {object} result containing browser, version and minVersion
 *     properties.
 */
const detectBrowser = function() {
    // returned result object
    let result = {};
    result.browser = null;
    result.version = null;
    result.minVersion = null;

    // fail early if it's not a browser
    if (typeof window === 'undefined' || !window.navigator) {
        result.browser = 'Not a supported browser.';
        return result;
    }

    if (navigator.mozGetUserMedia) { // Firefox.
        result.browser = 'firefox';
        result.version = extractVersion(navigator.userAgent,
            /Firefox\/(\d+)\./, 1);
        result.minVersion = 31;
    } else if (navigator.webkitGetUserMedia) {
        // Chrome, Chromium, Webview, Opera.
        // Version matches Chrome/WebRTC version.
        result.browser = 'chrome';
        result.version = extractVersion(navigator.userAgent,
            /Chrom(e|ium)\/(\d+)\./, 2); // buddy ignore:line
        result.minVersion = 38;
    } else if (navigator.mediaDevices &&
               navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) { // Edge.
        result.browser = 'edge';
        result.version = extractVersion(navigator.userAgent,
            /Edge\/(\d+).(\d+)$/, 2); // buddy ignore:line
        result.minVersion = 10547;
    } else if (window.RTCPeerConnection &&
        navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) { // Safari.
        result.browser = 'safari';
        result.version = extractVersion(navigator.userAgent,
            /AppleWebKit\/(\d+)\./, 1);
    } else {
        // Default fallthrough: not supported.
        result.browser = 'Not a supported browser.';
        return result;
    }

    return result;
};

/**
 * Extract browser version out of the provided user agent string.
 *
 * @private
 * @param {!string} uastring - userAgent string.
 * @param {!string} expr - Regular expression used as match criteria.
 * @param {!number} pos - position in the version string to be
 *     returned.
 * @return {!number} browser version.
 */
const extractVersion = function(uastring, expr, pos) {
    let match = uastring.match(expr);
    return match && match.length >= pos && parseInt(match[pos], 10); // buddy ignore:line
};

const isEdge = function() {
    return detectBrowser().browser === 'edge';
};

const isSafari = function() {
    return detectBrowser().browser === 'safari';
};

const isOpera = function() {
    return !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;
};

const isChrome = function() {
    return detectBrowser().browser === 'chrome';
};

const isFirefox = function() {
    return detectBrowser().browser === 'firefox';
};

export {
    detectBrowser, isEdge, isOpera, isChrome, isSafari, isFirefox
};