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 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. RTC_BROWSER_REACT_NATIVE: "rtc_browser.react-native",
  13. /**
  14. * Gets current browser type.
  15. * @returns {string}
  16. */
  17. getBrowserType: function () {
  18. return currentBrowser;
  19. },
  20. /**
  21. * Gets current browser name, split from the type.
  22. * @returns {string}
  23. */
  24. getBrowserName: function () {
  25. var browser = currentBrowser.split('rtc_browser.')[1];
  26. if (RTCBrowserType.isAndroid()) {
  27. browser = 'android';
  28. }
  29. return browser;
  30. },
  31. /**
  32. * Checks if current browser is Chrome.
  33. * @returns {boolean}
  34. */
  35. isChrome: function () {
  36. return currentBrowser === RTCBrowserType.RTC_BROWSER_CHROME;
  37. },
  38. /**
  39. * Checks if current browser is Opera.
  40. * @returns {boolean}
  41. */
  42. isOpera: function () {
  43. return currentBrowser === RTCBrowserType.RTC_BROWSER_OPERA;
  44. },
  45. /**
  46. * Checks if current browser is Firefox.
  47. * @returns {boolean}
  48. */
  49. isFirefox: function () {
  50. return currentBrowser === RTCBrowserType.RTC_BROWSER_FIREFOX;
  51. },
  52. /**
  53. * Checks if current browser is Internet Explorer.
  54. * @returns {boolean}
  55. */
  56. isIExplorer: function () {
  57. return currentBrowser === RTCBrowserType.RTC_BROWSER_IEXPLORER;
  58. },
  59. /**
  60. * Checks if current browser is Safari.
  61. * @returns {boolean}
  62. */
  63. isSafari: function () {
  64. return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI;
  65. },
  66. /**
  67. * Checks if current environment is NWJS.
  68. * @returns {boolean}
  69. */
  70. isNWJS: function () {
  71. return currentBrowser === RTCBrowserType.RTC_BROWSER_NWJS;
  72. },
  73. /**
  74. * Checks if current environment is React Native.
  75. * @returns {boolean}
  76. */
  77. isReactNative: function () {
  78. return currentBrowser === RTCBrowserType.RTC_BROWSER_REACT_NATIVE;
  79. },
  80. /**
  81. * Checks if Temasys RTC plugin is used.
  82. * @returns {boolean}
  83. */
  84. isTemasysPluginUsed: function () {
  85. return RTCBrowserType.isIExplorer() || RTCBrowserType.isSafari();
  86. },
  87. /**
  88. * Returns Firefox version.
  89. * @returns {number|null}
  90. */
  91. getFirefoxVersion: function () {
  92. return RTCBrowserType.isFirefox() ? browserVersion : null;
  93. },
  94. /**
  95. * Returns Chrome version.
  96. * @returns {number|null}
  97. */
  98. getChromeVersion: function () {
  99. return RTCBrowserType.isChrome() ? browserVersion : null;
  100. },
  101. usesPlanB: function() {
  102. return RTCBrowserType.isChrome() || RTCBrowserType.isOpera() ||
  103. RTCBrowserType.isTemasysPluginUsed();
  104. },
  105. usesUnifiedPlan: function() {
  106. return RTCBrowserType.isFirefox();
  107. },
  108. /**
  109. * Whether the browser is running on an android device.
  110. * @returns {boolean}
  111. */
  112. isAndroid: function() {
  113. return isAndroid;
  114. }
  115. // Add version getters for other browsers when needed
  116. };
  117. // detectOpera() must be called before detectChrome() !!!
  118. // otherwise Opera wil be detected as Chrome
  119. function detectChrome() {
  120. if (navigator.webkitGetUserMedia) {
  121. currentBrowser = RTCBrowserType.RTC_BROWSER_CHROME;
  122. var userAgent = navigator.userAgent.toLowerCase();
  123. // We can assume that user agent is chrome, because it's
  124. // enforced when 'ext' streaming method is set
  125. var ver = parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10);
  126. logger.log("This appears to be Chrome, ver: " + ver);
  127. return ver;
  128. }
  129. return null;
  130. }
  131. function detectOpera() {
  132. var userAgent = navigator.userAgent;
  133. if (userAgent.match(/Opera|OPR/)) {
  134. currentBrowser = RTCBrowserType.RTC_BROWSER_OPERA;
  135. var version = userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2];
  136. logger.info("This appears to be Opera, ver: " + version);
  137. return version;
  138. }
  139. return null;
  140. }
  141. function detectFirefox() {
  142. if (navigator.mozGetUserMedia) {
  143. currentBrowser = RTCBrowserType.RTC_BROWSER_FIREFOX;
  144. var version = parseInt(
  145. navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
  146. logger.log('This appears to be Firefox, ver: ' + version);
  147. return version;
  148. }
  149. return null;
  150. }
  151. function detectSafari() {
  152. if ((/^((?!chrome).)*safari/i.test(navigator.userAgent))) {
  153. currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
  154. logger.info("This appears to be Safari");
  155. // FIXME detect Safari version when needed
  156. return 1;
  157. }
  158. return null;
  159. }
  160. function detectIE() {
  161. var version;
  162. var ua = window.navigator.userAgent;
  163. var msie = ua.indexOf('MSIE ');
  164. if (msie > 0) {
  165. // IE 10 or older => return version number
  166. version = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
  167. }
  168. var trident = ua.indexOf('Trident/');
  169. if (!version && trident > 0) {
  170. // IE 11 => return version number
  171. var rv = ua.indexOf('rv:');
  172. version = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
  173. }
  174. var edge = ua.indexOf('Edge/');
  175. if (!version && edge > 0) {
  176. // IE 12 => return version number
  177. version = parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
  178. }
  179. if (version) {
  180. currentBrowser = RTCBrowserType.RTC_BROWSER_IEXPLORER;
  181. logger.info("This appears to be IExplorer, ver: " + version);
  182. }
  183. return version;
  184. }
  185. function detectNWJS (){
  186. var userAgent = navigator.userAgent;
  187. if (userAgent.match(/JitsiMeetNW/)) {
  188. currentBrowser = RTCBrowserType.RTC_BROWSER_NWJS;
  189. var version = userAgent.match(/JitsiMeetNW\/([\d.]+)/)[1];
  190. logger.info("This appears to be JitsiMeetNW, ver: " + version);
  191. return version;
  192. }
  193. return null;
  194. }
  195. function detectReactNative() {
  196. var match
  197. = navigator.userAgent.match(/\b(react[ \t_-]*native)(?:\/(\S+))?/i);
  198. var version;
  199. // If we're remote debugging a React Native app, it may be treated as
  200. // Chrome. Check navigator.product as well and always return some version
  201. // even if we can't get the real one.
  202. if (match || navigator.product === 'ReactNative') {
  203. currentBrowser = RTCBrowserType.RTC_BROWSER_REACT_NATIVE;
  204. var name;
  205. if (match && match.length > 2) {
  206. name = match[1];
  207. version = match[2];
  208. }
  209. if (!name) {
  210. name = 'react-native';
  211. }
  212. if (!version) {
  213. version = 'unknown';
  214. }
  215. console.info('This appears to be ' + name + ', ver: ' + version);
  216. } else {
  217. // We're not running in a React Native environment.
  218. version = null;
  219. }
  220. return version;
  221. }
  222. function detectBrowser() {
  223. var version;
  224. var detectors = [
  225. detectReactNative,
  226. detectNWJS,
  227. detectOpera,
  228. detectChrome,
  229. detectFirefox,
  230. detectIE,
  231. detectSafari
  232. ];
  233. // Try all browser detectors
  234. for (var i = 0; i < detectors.length; i++) {
  235. version = detectors[i]();
  236. if (version)
  237. return version;
  238. }
  239. logger.warn("Browser type defaults to Safari ver 1");
  240. currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
  241. return 1;
  242. }
  243. browserVersion = detectBrowser();
  244. isAndroid = navigator.userAgent.indexOf('Android') != -1;
  245. module.exports = RTCBrowserType;