You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RTCBrowserType.js 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. var logger = require("jitsi-meet-logger").getLogger(__filename);
  2. var currentBrowser;
  3. var browserVersion;
  4. var isAndroid;
  5. var RTCBrowserType = {
  6. RTC_BROWSER_CHROME: "rtc_browser.chrome",
  7. RTC_BROWSER_OPERA: "rtc_browser.opera",
  8. RTC_BROWSER_FIREFOX: "rtc_browser.firefox",
  9. RTC_BROWSER_IEXPLORER: "rtc_browser.iexplorer",
  10. RTC_BROWSER_SAFARI: "rtc_browser.safari",
  11. RTC_BROWSER_NWJS: "rtc_browser.nwjs",
  12. getBrowserType: function () {
  13. return currentBrowser;
  14. },
  15. isChrome: function () {
  16. return currentBrowser === RTCBrowserType.RTC_BROWSER_CHROME;
  17. },
  18. isOpera: function () {
  19. return currentBrowser === RTCBrowserType.RTC_BROWSER_OPERA;
  20. },
  21. isFirefox: function () {
  22. return currentBrowser === RTCBrowserType.RTC_BROWSER_FIREFOX;
  23. },
  24. isIExplorer: function () {
  25. return currentBrowser === RTCBrowserType.RTC_BROWSER_IEXPLORER;
  26. },
  27. isSafari: function () {
  28. return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI;
  29. },
  30. isNWJS: function () {
  31. return currentBrowser === RTCBrowserType.RTC_BROWSER_NWJS;
  32. },
  33. isTemasysPluginUsed: function () {
  34. return RTCBrowserType.isIExplorer() || RTCBrowserType.isSafari();
  35. },
  36. getFirefoxVersion: function () {
  37. return RTCBrowserType.isFirefox() ? browserVersion : null;
  38. },
  39. getChromeVersion: function () {
  40. return RTCBrowserType.isChrome() ? browserVersion : null;
  41. },
  42. usesPlanB: function() {
  43. return RTCBrowserType.isChrome() || RTCBrowserType.isOpera() ||
  44. RTCBrowserType.isTemasysPluginUsed();
  45. },
  46. usesUnifiedPlan: function() {
  47. return RTCBrowserType.isFirefox();
  48. },
  49. /**
  50. * Whether the browser is running on an android device.
  51. */
  52. isAndroid: function() {
  53. return isAndroid;
  54. }
  55. // Add version getters for other browsers when needed
  56. };
  57. // detectOpera() must be called before detectChrome() !!!
  58. // otherwise Opera wil be detected as Chrome
  59. function detectChrome() {
  60. if (navigator.webkitGetUserMedia) {
  61. currentBrowser = RTCBrowserType.RTC_BROWSER_CHROME;
  62. var userAgent = navigator.userAgent.toLowerCase();
  63. // We can assume that user agent is chrome, because it's
  64. // enforced when 'ext' streaming method is set
  65. var ver = parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10);
  66. logger.log("This appears to be Chrome, ver: " + ver);
  67. return ver;
  68. }
  69. return null;
  70. }
  71. function detectOpera() {
  72. var userAgent = navigator.userAgent;
  73. if (userAgent.match(/Opera|OPR/)) {
  74. currentBrowser = RTCBrowserType.RTC_BROWSER_OPERA;
  75. var version = userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2];
  76. logger.info("This appears to be Opera, ver: " + version);
  77. return version;
  78. }
  79. return null;
  80. }
  81. function detectFirefox() {
  82. if (navigator.mozGetUserMedia) {
  83. currentBrowser = RTCBrowserType.RTC_BROWSER_FIREFOX;
  84. var version = parseInt(
  85. navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
  86. logger.log('This appears to be Firefox, ver: ' + version);
  87. return version;
  88. }
  89. return null;
  90. }
  91. function detectSafari() {
  92. if ((/^((?!chrome).)*safari/i.test(navigator.userAgent))) {
  93. currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
  94. logger.info("This appears to be Safari");
  95. // FIXME detect Safari version when needed
  96. return 1;
  97. }
  98. return null;
  99. }
  100. function detectIE() {
  101. var version;
  102. var ua = window.navigator.userAgent;
  103. var msie = ua.indexOf('MSIE ');
  104. if (msie > 0) {
  105. // IE 10 or older => return version number
  106. version = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
  107. }
  108. var trident = ua.indexOf('Trident/');
  109. if (!version && trident > 0) {
  110. // IE 11 => return version number
  111. var rv = ua.indexOf('rv:');
  112. version = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
  113. }
  114. var edge = ua.indexOf('Edge/');
  115. if (!version && edge > 0) {
  116. // IE 12 => return version number
  117. version = parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
  118. }
  119. if (version) {
  120. currentBrowser = RTCBrowserType.RTC_BROWSER_IEXPLORER;
  121. logger.info("This appears to be IExplorer, ver: " + version);
  122. }
  123. return version;
  124. }
  125. function detectNWJS (){
  126. var userAgent = navigator.userAgent;
  127. if (userAgent.match(/JitsiMeetNW/)) {
  128. currentBrowser = RTCBrowserType.RTC_BROWSER_NWJS;
  129. var version = userAgent.match(/JitsiMeetNW\/([\d.]+)/)[1];
  130. logger.info("This appears to be JitsiMeetNW, ver: " + version);
  131. return version;
  132. }
  133. return null;
  134. }
  135. function detectBrowser() {
  136. var version;
  137. var detectors = [
  138. detectNWJS,
  139. detectOpera,
  140. detectChrome,
  141. detectFirefox,
  142. detectIE,
  143. detectSafari
  144. ];
  145. // Try all browser detectors
  146. for (var i = 0; i < detectors.length; i++) {
  147. version = detectors[i]();
  148. if (version)
  149. return version;
  150. }
  151. logger.warn("Browser type defaults to Safari ver 1");
  152. currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
  153. return 1;
  154. }
  155. browserVersion = detectBrowser();
  156. isAndroid = navigator.userAgent.indexOf('Android') != -1;
  157. module.exports = RTCBrowserType;