| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- var logger = require("jitsi-meet-logger").getLogger(__filename);
-
- var currentBrowser;
-
- var browserVersion;
-
- var isAndroid;
-
- var RTCBrowserType = {
-
- RTC_BROWSER_CHROME: "rtc_browser.chrome",
-
- RTC_BROWSER_OPERA: "rtc_browser.opera",
-
- RTC_BROWSER_FIREFOX: "rtc_browser.firefox",
-
- RTC_BROWSER_IEXPLORER: "rtc_browser.iexplorer",
-
- RTC_BROWSER_SAFARI: "rtc_browser.safari",
-
- RTC_BROWSER_NWJS: "rtc_browser.nwjs",
-
- RTC_BROWSER_REACT_NATIVE: "rtc_browser.react-native",
-
- /**
- * Gets current browser type.
- * @returns {string}
- */
- getBrowserType: function () {
- return currentBrowser;
- },
-
- /**
- * Gets current browser name, split from the type.
- * @returns {string}
- */
- getBrowserName: function () {
- var browser = currentBrowser.split('rtc_browser.')[1];
- if (RTCBrowserType.isAndroid()) {
- browser = 'android';
- }
- return browser;
- },
-
- /**
- * Checks if current browser is Chrome.
- * @returns {boolean}
- */
- isChrome: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_CHROME;
- },
-
- /**
- * Checks if current browser is Opera.
- * @returns {boolean}
- */
- isOpera: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_OPERA;
- },
-
- /**
- * Checks if current browser is Firefox.
- * @returns {boolean}
- */
- isFirefox: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_FIREFOX;
- },
-
- /**
- * Checks if current browser is Internet Explorer.
- * @returns {boolean}
- */
- isIExplorer: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_IEXPLORER;
- },
-
- /**
- * Checks if current browser is Safari.
- * @returns {boolean}
- */
- isSafari: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI;
- },
-
- /**
- * Checks if current environment is NWJS.
- * @returns {boolean}
- */
- isNWJS: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_NWJS;
- },
-
- /**
- * Checks if current environment is React Native.
- * @returns {boolean}
- */
- isReactNative: function () {
- return currentBrowser === RTCBrowserType.RTC_BROWSER_REACT_NATIVE;
- },
-
- /**
- * Checks if Temasys RTC plugin is used.
- * @returns {boolean}
- */
- isTemasysPluginUsed: function () {
- return RTCBrowserType.isIExplorer() || RTCBrowserType.isSafari();
- },
-
- /**
- * Returns Firefox version.
- * @returns {number|null}
- */
- getFirefoxVersion: function () {
- return RTCBrowserType.isFirefox() ? browserVersion : null;
- },
-
- /**
- * Returns Chrome version.
- * @returns {number|null}
- */
- getChromeVersion: function () {
- return RTCBrowserType.isChrome() ? browserVersion : null;
- },
-
- usesPlanB: function() {
- return RTCBrowserType.isChrome() || RTCBrowserType.isOpera() ||
- RTCBrowserType.isTemasysPluginUsed();
- },
-
- usesUnifiedPlan: function() {
- return RTCBrowserType.isFirefox();
- },
-
- /**
- * Whether the browser is running on an android device.
- * @returns {boolean}
- */
- isAndroid: function() {
- return isAndroid;
- }
-
- // Add version getters for other browsers when needed
- };
-
- // detectOpera() must be called before detectChrome() !!!
- // otherwise Opera wil be detected as Chrome
- function detectChrome() {
- if (navigator.webkitGetUserMedia) {
- currentBrowser = RTCBrowserType.RTC_BROWSER_CHROME;
- var userAgent = navigator.userAgent.toLowerCase();
- // We can assume that user agent is chrome, because it's
- // enforced when 'ext' streaming method is set
- var ver = parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10);
- logger.log("This appears to be Chrome, ver: " + ver);
- return ver;
- }
- return null;
- }
-
- function detectOpera() {
- var userAgent = navigator.userAgent;
- if (userAgent.match(/Opera|OPR/)) {
- currentBrowser = RTCBrowserType.RTC_BROWSER_OPERA;
- var version = userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2];
- logger.info("This appears to be Opera, ver: " + version);
- return version;
- }
- return null;
- }
-
- function detectFirefox() {
- if (navigator.mozGetUserMedia) {
- currentBrowser = RTCBrowserType.RTC_BROWSER_FIREFOX;
- var version = parseInt(
- navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
- logger.log('This appears to be Firefox, ver: ' + version);
- return version;
- }
- return null;
- }
-
- function detectSafari() {
- if ((/^((?!chrome).)*safari/i.test(navigator.userAgent))) {
- currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
- logger.info("This appears to be Safari");
- // FIXME detect Safari version when needed
- return 1;
- }
- return null;
- }
-
- function detectIE() {
- var version;
- var ua = window.navigator.userAgent;
-
- var msie = ua.indexOf('MSIE ');
- if (msie > 0) {
- // IE 10 or older => return version number
- version = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
- }
-
- var trident = ua.indexOf('Trident/');
- if (!version && trident > 0) {
- // IE 11 => return version number
- var rv = ua.indexOf('rv:');
- version = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
- }
-
- var edge = ua.indexOf('Edge/');
- if (!version && edge > 0) {
- // IE 12 => return version number
- version = parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
- }
-
- if (version) {
- currentBrowser = RTCBrowserType.RTC_BROWSER_IEXPLORER;
- logger.info("This appears to be IExplorer, ver: " + version);
- }
- return version;
- }
-
- function detectNWJS (){
- var userAgent = navigator.userAgent;
- if (userAgent.match(/JitsiMeetNW/)) {
- currentBrowser = RTCBrowserType.RTC_BROWSER_NWJS;
- var version = userAgent.match(/JitsiMeetNW\/([\d.]+)/)[1];
- logger.info("This appears to be JitsiMeetNW, ver: " + version);
- return version;
- }
- return null;
- }
-
- function detectReactNative() {
- var match
- = navigator.userAgent.match(/\b(react[ \t_-]*native)(?:\/(\S+))?/i);
- var version;
- // If we're remote debugging a React Native app, it may be treated as
- // Chrome. Check navigator.product as well and always return some version
- // even if we can't get the real one.
- if (match || navigator.product === 'ReactNative') {
- currentBrowser = RTCBrowserType.RTC_BROWSER_REACT_NATIVE;
- var name;
- if (match && match.length > 2) {
- name = match[1];
- version = match[2];
- }
- if (!name) {
- name = 'react-native';
- }
- if (!version) {
- version = 'unknown';
- }
- console.info('This appears to be ' + name + ', ver: ' + version);
- } else {
- // We're not running in a React Native environment.
- version = null;
- }
- return version;
- }
-
- function detectBrowser() {
- var version;
- var detectors = [
- detectReactNative,
- detectNWJS,
- detectOpera,
- detectChrome,
- detectFirefox,
- detectIE,
- detectSafari
- ];
- // Try all browser detectors
- for (var i = 0; i < detectors.length; i++) {
- version = detectors[i]();
- if (version)
- return version;
- }
- logger.warn("Browser type defaults to Safari ver 1");
- currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
- return 1;
- }
-
- browserVersion = detectBrowser();
- isAndroid = navigator.userAgent.indexOf('Android') != -1;
-
- module.exports = RTCBrowserType;
|