123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- /**
- * Copyright 2004-present Facebook. All Rights Reserved.
- *
- * @providesModule UserAgent_DEPRECATED
- */
- /**
- * Provides entirely client-side User Agent and OS detection. You should prefer
- * the non-deprecated UserAgent module when possible, which exposes our
- * authoritative server-side PHP-based detection to the client.
- *
- * Usage is straightforward:
- *
- * if (UserAgent_DEPRECATED.ie()) {
- * // IE
- * }
- *
- * You can also do version checks:
- *
- * if (UserAgent_DEPRECATED.ie() >= 7) {
- * // IE7 or better
- * }
- *
- * The browser functions will return NaN if the browser does not match, so
- * you can also do version compares the other way:
- *
- * if (UserAgent_DEPRECATED.ie() < 7) {
- * // IE6 or worse
- * }
- *
- * Note that the version is a float and may include a minor version number,
- * so you should always use range operators to perform comparisons, not
- * strict equality.
- *
- * **Note:** You should **strongly** prefer capability detection to browser
- * version detection where it's reasonable:
- *
- * http://www.quirksmode.org/js/support.html
- *
- * Further, we have a large number of mature wrapper functions and classes
- * which abstract away many browser irregularities. Check the documentation,
- * grep for things, or ask on javascript@lists.facebook.com before writing yet
- * another copy of "event || window.event".
- *
- */
- var _populated = false;
- // Browsers
- var _ie, _firefox, _opera, _webkit, _chrome;
- // Actual IE browser for compatibility mode
- var _ie_real_version;
- // Platforms
- var _osx, _windows, _linux, _android;
- // Architectures
- var _win64;
- // Devices
- var _iphone, _ipad, _native;
- var _mobile;
- function _populate() {
- if (_populated) {
- return;
- }
- _populated = true;
- // To work around buggy JS libraries that can't handle multi-digit
- // version numbers, Opera 10's user agent string claims it's Opera
- // 9, then later includes a Version/X.Y field:
- //
- // Opera/9.80 (foo) Presto/2.2.15 Version/10.10
- var uas = navigator.userAgent;
- var agent = /(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(uas);
- var os = /(Mac OS X)|(Windows)|(Linux)/.exec(uas);
- _iphone = /\b(iPhone|iP[ao]d)/.exec(uas);
- _ipad = /\b(iP[ao]d)/.exec(uas);
- _android = /Android/i.exec(uas);
- _native = /FBAN\/\w+;/i.exec(uas);
- _mobile = /Mobile/i.exec(uas);
- // Note that the IE team blog would have you believe you should be checking
- // for 'Win64; x64'. But MSDN then reveals that you can actually be coming
- // from either x64 or ia64; so ultimately, you should just check for Win64
- // as in indicator of whether you're in 64-bit IE. 32-bit IE on 64-bit
- // Windows will send 'WOW64' instead.
- _win64 = !!(/Win64/.exec(uas));
- if (agent) {
- _ie = agent[1] ? parseFloat(agent[1]) : (
- agent[5] ? parseFloat(agent[5]) : NaN);
- // IE compatibility mode
- if (_ie && document && document.documentMode) {
- _ie = document.documentMode;
- }
- // grab the "true" ie version from the trident token if available
- var trident = /(?:Trident\/(\d+.\d+))/.exec(uas);
- _ie_real_version = trident ? parseFloat(trident[1]) + 4 : _ie;
- _firefox = agent[2] ? parseFloat(agent[2]) : NaN;
- _opera = agent[3] ? parseFloat(agent[3]) : NaN;
- _webkit = agent[4] ? parseFloat(agent[4]) : NaN;
- if (_webkit) {
- // We do not add the regexp to the above test, because it will always
- // match 'safari' only since 'AppleWebKit' appears before 'Chrome' in
- // the userAgent string.
- agent = /(?:Chrome\/(\d+\.\d+))/.exec(uas);
- _chrome = agent && agent[1] ? parseFloat(agent[1]) : NaN;
- } else {
- _chrome = NaN;
- }
- } else {
- _ie = _firefox = _opera = _chrome = _webkit = NaN;
- }
- if (os) {
- if (os[1]) {
- // Detect OS X version. If no version number matches, set _osx to true.
- // Version examples: 10, 10_6_1, 10.7
- // Parses version number as a float, taking only first two sets of
- // digits. If only one set of digits is found, returns just the major
- // version number.
- var ver = /(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(uas);
- _osx = ver ? parseFloat(ver[1].replace('_', '.')) : true;
- } else {
- _osx = false;
- }
- _windows = !!os[2];
- _linux = !!os[3];
- } else {
- _osx = _windows = _linux = false;
- }
- }
- var UserAgent_DEPRECATED = {
- /**
- * Check if the UA is Internet Explorer.
- *
- *
- * @return float|NaN Version number (if match) or NaN.
- */
- ie: function() {
- return _populate() || _ie;
- },
- /**
- * Check if we're in Internet Explorer compatibility mode.
- *
- * @return bool true if in compatibility mode, false if
- * not compatibility mode or not ie
- */
- ieCompatibilityMode: function() {
- return _populate() || (_ie_real_version > _ie);
- },
- /**
- * Whether the browser is 64-bit IE. Really, this is kind of weak sauce; we
- * only need this because Skype can't handle 64-bit IE yet. We need to remove
- * this when we don't need it -- tracked by #601957.
- */
- ie64: function() {
- return UserAgent_DEPRECATED.ie() && _win64;
- },
- /**
- * Check if the UA is Firefox.
- *
- *
- * @return float|NaN Version number (if match) or NaN.
- */
- firefox: function() {
- return _populate() || _firefox;
- },
- /**
- * Check if the UA is Opera.
- *
- *
- * @return float|NaN Version number (if match) or NaN.
- */
- opera: function() {
- return _populate() || _opera;
- },
- /**
- * Check if the UA is WebKit.
- *
- *
- * @return float|NaN Version number (if match) or NaN.
- */
- webkit: function() {
- return _populate() || _webkit;
- },
- /**
- * For Push
- * WILL BE REMOVED VERY SOON. Use UserAgent_DEPRECATED.webkit
- */
- safari: function() {
- return UserAgent_DEPRECATED.webkit();
- },
- /**
- * Check if the UA is a Chrome browser.
- *
- *
- * @return float|NaN Version number (if match) or NaN.
- */
- chrome : function() {
- return _populate() || _chrome;
- },
- /**
- * Check if the user is running Windows.
- *
- * @return bool `true' if the user's OS is Windows.
- */
- windows: function() {
- return _populate() || _windows;
- },
- /**
- * Check if the user is running Mac OS X.
- *
- * @return float|bool Returns a float if a version number is detected,
- * otherwise true/false.
- */
- osx: function() {
- return _populate() || _osx;
- },
- /**
- * Check if the user is running Linux.
- *
- * @return bool `true' if the user's OS is some flavor of Linux.
- */
- linux: function() {
- return _populate() || _linux;
- },
- /**
- * Check if the user is running on an iPhone or iPod platform.
- *
- * @return bool `true' if the user is running some flavor of the
- * iPhone OS.
- */
- iphone: function() {
- return _populate() || _iphone;
- },
- mobile: function() {
- return _populate() || (_iphone || _ipad || _android || _mobile);
- },
- nativeApp: function() {
- // webviews inside of the native apps
- return _populate() || _native;
- },
- android: function() {
- return _populate() || _android;
- },
- ipad: function() {
- return _populate() || _ipad;
- }
- };
- module.exports = UserAgent_DEPRECATED;
|