jiti-meet/modules/RTC/RTCBrowserType.js

171 lines
4.6 KiB
JavaScript

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",
getBrowserType: function () {
return currentBrowser;
},
isChrome: function () {
return currentBrowser === RTCBrowserType.RTC_BROWSER_CHROME;
},
isOpera: function () {
return currentBrowser === RTCBrowserType.RTC_BROWSER_OPERA;
},
isFirefox: function () {
return currentBrowser === RTCBrowserType.RTC_BROWSER_FIREFOX;
},
isIExplorer: function () {
return currentBrowser === RTCBrowserType.RTC_BROWSER_IEXPLORER;
},
isSafari: function () {
return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI;
},
isTemasysPluginUsed: function () {
return RTCBrowserType.isIExplorer() || RTCBrowserType.isSafari();
},
getFirefoxVersion: function () {
return RTCBrowserType.isFirefox() ? browserVersion : 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.
*/
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);
console.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];
console.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);
console.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;
console.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;
console.info("This appears to be IExplorer, ver: " + version);
}
return version;
}
function detectBrowser() {
var version;
var detectors = [
detectOpera,
detectChrome,
detectFirefox,
detectIE,
detectSafari
];
// Try all browser detectors
for (var i = 0; i < detectors.length; i++) {
version = detectors[i]();
if (version)
return version;
}
console.error("Failed to detect browser type");
return undefined;
}
browserVersion = detectBrowser();
isAndroid = navigator.userAgent.indexOf('Android') != -1;
module.exports = RTCBrowserType;