messengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscord
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.
663 lines
17 KiB
663 lines
17 KiB
/** |
|
* @class Ext.env.Browser |
|
* Provides information about browser. |
|
* |
|
* Should not be manually instantiated unless for unit-testing. |
|
* Access the global instance stored in {@link Ext.browser} instead. |
|
* @private |
|
*/ |
|
(Ext.env || (Ext.env = {})).Browser = function (userAgent, publish) { |
|
// @define Ext.env.Browser |
|
// @define Ext.browser |
|
// @require Ext.Object |
|
// @require Ext.Version |
|
|
|
var me = this, |
|
browserPrefixes = me.browserPrefixes, |
|
enginePrefixes = me.enginePrefixes, |
|
browserMatch = userAgent.match(new RegExp('((?:' + |
|
Ext.Object.getValues(browserPrefixes).join(')|(?:') + '))([\\w\\._]+)')), |
|
engineMatch = userAgent.match(new RegExp('((?:' + |
|
Ext.Object.getValues(enginePrefixes).join(')|(?:') + '))([\\w\\._]+)')), |
|
browserNames = me.browserNames, |
|
browserName = browserNames.other, |
|
engineNames = me.engineNames, |
|
engineName = engineNames.other, |
|
browserVersion = '', |
|
engineVersion = '', |
|
majorVer = '', |
|
isWebView = false, |
|
i, prefix, mode, name, maxIEVersion; |
|
|
|
/** |
|
* @property {String} |
|
* Browser User Agent string. |
|
*/ |
|
me.userAgent = userAgent; |
|
|
|
if (browserMatch) { |
|
browserName = browserNames[Ext.Object.getKey(browserPrefixes, browserMatch[1])]; |
|
//<feature legacyBrowser> |
|
if (browserName === 'Safari' && /^Opera/.test(userAgent)) { |
|
// Prevent Opera 12 and earlier from being incorrectly reported as Safari |
|
browserName = 'Opera'; |
|
} |
|
//</feature> |
|
browserVersion = new Ext.Version(browserMatch[2]); |
|
} |
|
|
|
if (engineMatch) { |
|
engineName = engineNames[Ext.Object.getKey(enginePrefixes, engineMatch[1])]; |
|
engineVersion = new Ext.Version(engineMatch[2]); |
|
} |
|
|
|
if (engineName === 'Trident' && browserName !== 'IE') { |
|
browserName = 'IE'; |
|
var version = userAgent.match(/.*rv:(\d+.\d+)/); |
|
if (version && version.length) { |
|
version = version[1]; |
|
browserVersion = new Ext.Version(version); |
|
} |
|
} |
|
|
|
/** |
|
* @property chromeVersion |
|
* The current version of Chrome (0 if the browser is not Chrome). |
|
* @readonly |
|
* @type Number |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property firefoxVersion |
|
* The current version of Firefox (0 if the browser is not Firefox). |
|
* @readonly |
|
* @type Number |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property ieVersion |
|
* The current version of IE (0 if the browser is not IE). This does not account |
|
* for the documentMode of the current page, which is factored into {@link #isIE8} |
|
* and {@link #isIE9}. Thus this is not always true: |
|
* |
|
* Ext.isIE8 == (Ext.ieVersion == 8) |
|
* |
|
* @readonly |
|
* @type Number |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isChrome |
|
* True if the detected browser is Chrome. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isGecko |
|
* True if the detected browser uses the Gecko layout engine (e.g. Mozilla, Firefox). |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE |
|
* True if the detected browser is Internet Explorer. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE8 |
|
* True if the detected browser is Internet Explorer 8.x. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE8m |
|
* True if the detected browser is Internet Explorer 8.x or lower. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE8p |
|
* True if the detected browser is Internet Explorer 8.x or higher. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE9 |
|
* True if the detected browser is Internet Explorer 9.x. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE9m |
|
* True if the detected browser is Internet Explorer 9.x or lower. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE9p |
|
* True if the detected browser is Internet Explorer 9.x or higher. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE10 |
|
* True if the detected browser is Internet Explorer 10.x. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE10m |
|
* True if the detected browser is Internet Explorer 10.x or lower. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE10p |
|
* True if the detected browser is Internet Explorer 10.x or higher. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE11 |
|
* True if the detected browser is Internet Explorer 11.x. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE11m |
|
* True if the detected browser is Internet Explorer 11.x or lower. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isIE11p |
|
* True if the detected browser is Internet Explorer 11.x or higher. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isLinux |
|
* True if the detected platform is Linux. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isMac |
|
* True if the detected platform is Mac OS. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isOpera |
|
* True if the detected browser is Opera. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isSafari |
|
* True if the detected browser is Safari. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isWebKit |
|
* True if the detected browser uses WebKit. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property isWindows |
|
* True if the detected platform is Windows. |
|
* @readonly |
|
* @type Boolean |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property operaVersion |
|
* The current version of Opera (0 if the browser is not Opera). |
|
* @readonly |
|
* @type Number |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property safariVersion |
|
* The current version of Safari (0 if the browser is not Safari). |
|
* @readonly |
|
* @type Number |
|
* @member Ext |
|
*/ |
|
|
|
/** |
|
* @property webKitVersion |
|
* The current version of WebKit (0 if the browser does not use WebKit). |
|
* @readonly |
|
* @type Number |
|
* @member Ext |
|
*/ |
|
|
|
// Facebook changes the userAgent when you view a website within their iOS app. For some reason, the strip out information |
|
// about the browser, so we have to detect that and fake it... |
|
if (userAgent.match(/FB/) && browserName === "Other") { |
|
browserName = browserNames.safari; |
|
engineName = engineNames.webkit; |
|
} |
|
|
|
if (userAgent.match(/Android.*Chrome/g)) { |
|
browserName = 'ChromeMobile'; |
|
} |
|
|
|
if (userAgent.match(/OPR/)) { |
|
browserName = 'Opera'; |
|
browserMatch = userAgent.match(/OPR\/(\d+.\d+)/); |
|
browserVersion = new Ext.Version(browserMatch[1]); |
|
} |
|
|
|
Ext.apply(this, { |
|
engineName: engineName, |
|
engineVersion: engineVersion, |
|
name: browserName, |
|
version: browserVersion |
|
}); |
|
|
|
this.setFlag(browserName, true, publish); // e.g., Ext.isIE |
|
|
|
if (browserVersion) { |
|
majorVer = browserVersion.getMajor() || ''; |
|
//<feature legacyBrowser> |
|
if (me.is.IE) { |
|
majorVer = parseInt(majorVer, 10); |
|
mode = document.documentMode; |
|
|
|
// IE's Developer Tools allows switching of Browser Mode (userAgent) and |
|
// Document Mode (actual behavior) independently. While this makes no real |
|
// sense, the bottom line is that document.documentMode holds the key to |
|
// getting the proper "version" determined. That value is always 5 when in |
|
// Quirks Mode. |
|
|
|
if (mode === 7 || (majorVer === 7 && mode !== 8 && mode !== 9 && mode !== 10)) { |
|
majorVer = 7; |
|
} else if (mode === 8 || (majorVer === 8 && mode !== 8 && mode !== 9 && mode !== 10)) { |
|
majorVer = 8; |
|
} else if (mode === 9 || (majorVer === 9 && mode !== 7 && mode !== 8 && mode !== 10)) { |
|
majorVer = 9; |
|
} else if (mode === 10 || (majorVer === 10 && mode !== 7 && mode !== 8 && mode !== 9)) { |
|
majorVer = 10; |
|
} else if (mode === 11 || (majorVer === 11 && mode !== 7 && mode !== 8 && mode !== 9 && mode !== 10)) { |
|
majorVer = 11; |
|
} |
|
|
|
maxIEVersion = Math.max(majorVer, 11); |
|
for (i = 7; i <= maxIEVersion; ++i) { |
|
prefix = 'isIE' + i; |
|
if (majorVer <= i) { |
|
Ext[prefix + 'm'] = true; |
|
} |
|
|
|
if (majorVer === i) { |
|
Ext[prefix] = true; |
|
} |
|
|
|
if (majorVer >= i) { |
|
Ext[prefix + 'p'] = true; |
|
} |
|
} |
|
} |
|
|
|
if (me.is.Opera && parseInt(majorVer, 10) <= 12) { |
|
Ext.isOpera12m = true; |
|
} |
|
//</feature> |
|
|
|
Ext.chromeVersion = Ext.isChrome ? majorVer : 0; |
|
Ext.firefoxVersion = Ext.isFirefox ? majorVer : 0; |
|
Ext.ieVersion = Ext.isIE ? majorVer : 0; |
|
Ext.operaVersion = Ext.isOpera ? majorVer : 0; |
|
Ext.safariVersion = Ext.isSafari ? majorVer : 0; |
|
Ext.webKitVersion = Ext.isWebKit ? majorVer : 0; |
|
|
|
this.setFlag(browserName + majorVer, true, publish); // Ext.isIE10 |
|
this.setFlag(browserName + browserVersion.getShortVersion()); |
|
} |
|
|
|
for (i in browserNames) { |
|
if (browserNames.hasOwnProperty(i)) { |
|
name = browserNames[i]; |
|
|
|
this.setFlag(name, browserName === name); |
|
} |
|
} |
|
|
|
this.setFlag(name); |
|
|
|
if (engineVersion) { |
|
this.setFlag(engineName + (engineVersion.getMajor() || '')); |
|
this.setFlag(engineName + engineVersion.getShortVersion()); |
|
} |
|
|
|
for (i in engineNames) { |
|
if (engineNames.hasOwnProperty(i)) { |
|
name = engineNames[i]; |
|
|
|
this.setFlag(name, engineName === name, publish); |
|
} |
|
} |
|
|
|
this.setFlag('Standalone', !!navigator.standalone); |
|
|
|
this.setFlag('Ripple', !!document.getElementById("tinyhippos-injected") && !Ext.isEmpty(window.top.ripple)); |
|
this.setFlag('WebWorks', !!window.blackberry); |
|
|
|
if (window.PhoneGap !== undefined || window.Cordova !== undefined || window.cordova !== undefined) { |
|
isWebView = true; |
|
this.setFlag('PhoneGap'); |
|
this.setFlag('Cordova'); |
|
} |
|
else if (!!window.isNK) { |
|
isWebView = true; |
|
this.setFlag('Sencha'); |
|
} |
|
|
|
if (/(Glass)/i.test(userAgent)) { |
|
this.setFlag('GoogleGlass'); |
|
} |
|
|
|
// Check if running in UIWebView |
|
if (/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)(?!.*FBAN)/i.test(userAgent)) { |
|
isWebView = true; |
|
} |
|
|
|
// Flag to check if it we are in the WebView |
|
this.setFlag('WebView', isWebView); |
|
|
|
/** |
|
* @property {Boolean} |
|
* `true` if browser is using strict mode. |
|
*/ |
|
this.isStrict = Ext.isStrict = document.compatMode === "CSS1Compat"; |
|
|
|
/** |
|
* @property {Boolean} |
|
* `true` if page is running over SSL. |
|
*/ |
|
this.isSecure = Ext.isSecure; |
|
|
|
// IE10Quirks, Chrome26Strict, etc. |
|
this.identity = browserName + majorVer + (this.isStrict ? 'Strict' : 'Quirks'); |
|
}; |
|
|
|
Ext.env.Browser.prototype = { |
|
constructor: Ext.env.Browser, |
|
|
|
browserNames: { |
|
ie: 'IE', |
|
firefox: 'Firefox', |
|
safari: 'Safari', |
|
chrome: 'Chrome', |
|
opera: 'Opera', |
|
dolfin: 'Dolfin', |
|
webosbrowser: 'webOSBrowser', |
|
chromeMobile: 'ChromeMobile', |
|
chromeiOS: 'ChromeiOS', |
|
silk: 'Silk', |
|
other: 'Other' |
|
}, |
|
engineNames: { |
|
webkit: 'WebKit', |
|
gecko: 'Gecko', |
|
presto: 'Presto', |
|
trident: 'Trident', |
|
other: 'Other' |
|
}, |
|
enginePrefixes: { |
|
webkit: 'AppleWebKit/', |
|
gecko: 'Gecko/', |
|
presto: 'Presto/', |
|
trident: 'Trident/' |
|
}, |
|
browserPrefixes: { |
|
ie: 'MSIE ', |
|
firefox: 'Firefox/', |
|
chrome: 'Chrome/', |
|
safari: 'Version/', |
|
opera: 'OPR/', |
|
dolfin: 'Dolfin/', |
|
webosbrowser: 'wOSBrowser/', |
|
chromeMobile: 'CrMo/', |
|
chromeiOS: 'CriOS/', |
|
silk: 'Silk/' |
|
}, |
|
|
|
styleDashPrefixes: { |
|
WebKit: '-webkit-', |
|
Gecko: '-moz-', |
|
Trident: '-ms-', |
|
Presto: '-o-', |
|
Other: '' |
|
}, |
|
|
|
stylePrefixes: { |
|
WebKit: 'Webkit', |
|
Gecko: 'Moz', |
|
Trident: 'ms', |
|
Presto: 'O', |
|
Other: '' |
|
}, |
|
|
|
propertyPrefixes: { |
|
WebKit: 'webkit', |
|
Gecko: 'moz', |
|
Trident: 'ms', |
|
Presto: 'o', |
|
Other: '' |
|
}, |
|
|
|
// scope: Ext.env.Browser.prototype |
|
|
|
/** |
|
* A "hybrid" property, can be either accessed as a method call, for example: |
|
* |
|
* if (Ext.browser.is('IE')) { |
|
* // ... |
|
* } |
|
* |
|
* Or as an object with Boolean properties, for example: |
|
* |
|
* if (Ext.browser.is.IE) { |
|
* // ... |
|
* } |
|
* |
|
* Versions can be conveniently checked as well. For example: |
|
* |
|
* if (Ext.browser.is.IE10) { |
|
* // Equivalent to (Ext.browser.is.IE && Ext.browser.version.equals(10)) |
|
* } |
|
* |
|
* __Note:__ Only {@link Ext.Version#getMajor major component} and {@link Ext.Version#getShortVersion simplified} |
|
* value of the version are available via direct property checking. |
|
* |
|
* Supported values are: |
|
* |
|
* - IE |
|
* - Firefox |
|
* - Safari |
|
* - Chrome |
|
* - Opera |
|
* - WebKit |
|
* - Gecko |
|
* - Presto |
|
* - Trident |
|
* - WebView |
|
* - Other |
|
* |
|
* @param {String} name The OS name to check. |
|
* @return {Boolean} |
|
*/ |
|
is: function (name) { |
|
return !!this.is[name]; |
|
}, |
|
|
|
/** |
|
* The full name of the current browser. |
|
* Possible values are: |
|
* |
|
* - IE |
|
* - Firefox |
|
* - Safari |
|
* - Chrome |
|
* - Opera |
|
* - Other |
|
* @type String |
|
* @readonly |
|
*/ |
|
name: null, |
|
|
|
/** |
|
* Refer to {@link Ext.Version}. |
|
* @type Ext.Version |
|
* @readonly |
|
*/ |
|
version: null, |
|
|
|
/** |
|
* The full name of the current browser's engine. |
|
* Possible values are: |
|
* |
|
* - WebKit |
|
* - Gecko |
|
* - Presto |
|
* - Trident |
|
* - Other |
|
* @type String |
|
* @readonly |
|
*/ |
|
engineName: null, |
|
|
|
/** |
|
* Refer to {@link Ext.Version}. |
|
* @type Ext.Version |
|
* @readonly |
|
*/ |
|
engineVersion: null, |
|
|
|
setFlag: function(name, value, publish) { |
|
if (value === undefined) { |
|
value = true; |
|
} |
|
|
|
this.is[name] = value; |
|
this.is[name.toLowerCase()] = value; |
|
if (publish) { |
|
Ext['is' + name] = value; |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
getStyleDashPrefix: function() { |
|
return this.styleDashPrefixes[this.engineName]; |
|
}, |
|
|
|
getStylePrefix: function() { |
|
return this.stylePrefixes[this.engineName]; |
|
}, |
|
|
|
getVendorProperyName: function(name) { |
|
var prefix = this.propertyPrefixes[this.engineName]; |
|
|
|
if (prefix.length > 0) { |
|
return prefix + Ext.String.capitalize(name); |
|
} |
|
|
|
return name; |
|
}, |
|
|
|
getPreferredTranslationMethod: function(config) { |
|
if (typeof config === 'object' && 'translationMethod' in config && config.translationMethod !== 'auto') { |
|
return config.translationMethod; |
|
} else { |
|
return 'csstransform'; |
|
} |
|
} |
|
|
|
}; |
|
|
|
/** |
|
* @class Ext.browser |
|
* @extends Ext.env.Browser |
|
* @singleton |
|
* Provides useful information about the current browser. |
|
* |
|
* Example: |
|
* |
|
* if (Ext.browser.is.IE) { |
|
* // IE specific code here |
|
* } |
|
* |
|
* if (Ext.browser.is.WebKit) { |
|
* // WebKit specific code here |
|
* } |
|
* |
|
* console.log("Version " + Ext.browser.version); |
|
* |
|
* For a full list of supported values, refer to {@link #is} property/method. |
|
* |
|
*/ |
|
(function (userAgent) { |
|
Ext.browser = new Ext.env.Browser(userAgent, true); |
|
Ext.userAgent = userAgent.toLowerCase(); |
|
|
|
/** |
|
* @property {String} SSL_SECURE_URL |
|
* URL to a blank file used by Ext when in secure mode for iframe src and onReady src |
|
* to prevent the IE insecure content warning (`'about:blank'`, except for IE |
|
* in secure mode, which is `'javascript:""'`). |
|
* @member Ext |
|
*/ |
|
Ext.SSL_SECURE_URL = Ext.isSecure && Ext.isIE ? 'javascript:\'\'' : 'about:blank'; // jshint ignore:line |
|
}(Ext.global.navigator.userAgent));
|
|
|