Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

RTCBrowserType.js 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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. * Checks if the current browser triggers 'onmute'/'onunmute' events when
  89. * user's connection is interrupted and the video stops playback.
  90. * @returns {*|boolean} 'true' if the event is supported or 'false'
  91. * otherwise.
  92. */
  93. isVideoMuteOnConnInterruptedSupported: function () {
  94. return RTCBrowserType.isChrome();
  95. },
  96. /**
  97. * Returns Firefox version.
  98. * @returns {number|null}
  99. */
  100. getFirefoxVersion: function () {
  101. return RTCBrowserType.isFirefox() ? browserVersion : null;
  102. },
  103. /**
  104. * Returns Chrome version.
  105. * @returns {number|null}
  106. */
  107. getChromeVersion: function () {
  108. return RTCBrowserType.isChrome() ? browserVersion : null;
  109. },
  110. usesPlanB: function() {
  111. return RTCBrowserType.isChrome() || RTCBrowserType.isOpera() ||
  112. RTCBrowserType.isTemasysPluginUsed();
  113. },
  114. usesUnifiedPlan: function() {
  115. return RTCBrowserType.isFirefox();
  116. },
  117. /**
  118. * Whether the browser is running on an android device.
  119. * @returns {boolean}
  120. */
  121. isAndroid: function() {
  122. return isAndroid;
  123. }
  124. // Add version getters for other browsers when needed
  125. };
  126. // detectOpera() must be called before detectChrome() !!!
  127. // otherwise Opera wil be detected as Chrome
  128. function detectChrome() {
  129. if (navigator.webkitGetUserMedia) {
  130. currentBrowser = RTCBrowserType.RTC_BROWSER_CHROME;
  131. var userAgent = navigator.userAgent.toLowerCase();
  132. // We can assume that user agent is chrome, because it's
  133. // enforced when 'ext' streaming method is set
  134. var ver = parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10);
  135. logger.log("This appears to be Chrome, ver: " + ver);
  136. return ver;
  137. }
  138. return null;
  139. }
  140. function detectOpera() {
  141. var userAgent = navigator.userAgent;
  142. if (userAgent.match(/Opera|OPR/)) {
  143. currentBrowser = RTCBrowserType.RTC_BROWSER_OPERA;
  144. var version = userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2];
  145. logger.info("This appears to be Opera, ver: " + version);
  146. return version;
  147. }
  148. return null;
  149. }
  150. function detectFirefox() {
  151. if (navigator.mozGetUserMedia) {
  152. currentBrowser = RTCBrowserType.RTC_BROWSER_FIREFOX;
  153. var version = parseInt(
  154. navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
  155. logger.log('This appears to be Firefox, ver: ' + version);
  156. return version;
  157. }
  158. return null;
  159. }
  160. function detectSafari() {
  161. if ((/^((?!chrome).)*safari/i.test(navigator.userAgent))) {
  162. currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
  163. logger.info("This appears to be Safari");
  164. // FIXME detect Safari version when needed
  165. return 1;
  166. }
  167. return null;
  168. }
  169. function detectIE() {
  170. var version;
  171. var ua = window.navigator.userAgent;
  172. var msie = ua.indexOf('MSIE ');
  173. if (msie > 0) {
  174. // IE 10 or older => return version number
  175. version = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
  176. }
  177. var trident = ua.indexOf('Trident/');
  178. if (!version && trident > 0) {
  179. // IE 11 => return version number
  180. var rv = ua.indexOf('rv:');
  181. version = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
  182. }
  183. var edge = ua.indexOf('Edge/');
  184. if (!version && edge > 0) {
  185. // IE 12 => return version number
  186. version = parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
  187. }
  188. if (version) {
  189. currentBrowser = RTCBrowserType.RTC_BROWSER_IEXPLORER;
  190. logger.info("This appears to be IExplorer, ver: " + version);
  191. }
  192. return version;
  193. }
  194. function detectNWJS (){
  195. var userAgent = navigator.userAgent;
  196. if (userAgent.match(/JitsiMeetNW/)) {
  197. currentBrowser = RTCBrowserType.RTC_BROWSER_NWJS;
  198. var version = userAgent.match(/JitsiMeetNW\/([\d.]+)/)[1];
  199. logger.info("This appears to be JitsiMeetNW, ver: " + version);
  200. return version;
  201. }
  202. return null;
  203. }
  204. function detectReactNative() {
  205. var match
  206. = navigator.userAgent.match(/\b(react[ \t_-]*native)(?:\/(\S+))?/i);
  207. var version;
  208. // If we're remote debugging a React Native app, it may be treated as
  209. // Chrome. Check navigator.product as well and always return some version
  210. // even if we can't get the real one.
  211. if (match || navigator.product === 'ReactNative') {
  212. currentBrowser = RTCBrowserType.RTC_BROWSER_REACT_NATIVE;
  213. var name;
  214. if (match && match.length > 2) {
  215. name = match[1];
  216. version = match[2];
  217. }
  218. if (!name) {
  219. name = 'react-native';
  220. }
  221. if (!version) {
  222. version = 'unknown';
  223. }
  224. console.info('This appears to be ' + name + ', ver: ' + version);
  225. } else {
  226. // We're not running in a React Native environment.
  227. version = null;
  228. }
  229. return version;
  230. }
  231. function detectBrowser() {
  232. var version;
  233. var detectors = [
  234. detectReactNative,
  235. detectNWJS,
  236. detectOpera,
  237. detectChrome,
  238. detectFirefox,
  239. detectIE,
  240. detectSafari
  241. ];
  242. // Try all browser detectors
  243. for (var i = 0; i < detectors.length; i++) {
  244. version = detectors[i]();
  245. if (version)
  246. return version;
  247. }
  248. logger.warn("Browser type defaults to Safari ver 1");
  249. currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
  250. return 1;
  251. }
  252. browserVersion = detectBrowser();
  253. isAndroid = navigator.userAgent.indexOf('Android') != -1;
  254. module.exports = RTCBrowserType;