@qooxdoo/framework
Version:
The JS Framework for Coders
176 lines (149 loc) • 5.85 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Carsten Lergenmueller (carstenl)
* Fabian Jakobs (fbjakobs)
* Martin Wittemann (martinwittemann)
************************************************************************ */
/**
* Determines browser-dependent information about the transport layer.
*
* This class is used by {@link qx.core.Environment} and should not be used
* directly. Please check its class comment for details how to use it.
*
* @internal
*/
qx.Bootstrap.define("qx.bom.client.Transport",
{
/*
*****************************************************************************
STATICS
*****************************************************************************
*/
statics :
{
/**
* Returns the maximum number of parallel requests the current browser
* supports per host addressed.
*
* Note that this assumes one connection can support one request at a time
* only. Technically, this is not correct when pipelining is enabled (which
* it currently is only for IE 8 and Opera). In this case, the number
* returned will be too low, as one connection supports multiple pipelined
* requests. This is accepted for now because pipelining cannot be
* detected from JavaScript and because modern browsers have enough
* parallel connections already - it's unlikely an app will require more
* than 4 parallel XMLHttpRequests to one server at a time.
*
* @internal
* @return {Integer} Maximum number of parallel requests
*/
getMaxConcurrentRequestCount: function()
{
var maxConcurrentRequestCount;
// Parse version numbers.
var versionParts = qx.bom.client.Engine.getVersion().split(".");
var versionMain = 0;
var versionMajor = 0;
var versionMinor = 0;
// Main number
if (versionParts[0]) {
versionMain = versionParts[0];
}
// Major number
if (versionParts[1]) {
versionMajor = versionParts[1];
}
// Minor number
if (versionParts[2]) {
versionMinor = versionParts[2];
}
// IE 8 gives the max number of connections in a property
// see http://msdn.microsoft.com/en-us/library/cc197013(VS.85).aspx
if (window.maxConnectionsPerServer){
maxConcurrentRequestCount = window.maxConnectionsPerServer;
} else if (qx.bom.client.Engine.getName() == "opera") {
// Opera: 8 total
// see http://operawiki.info/HttpProtocol
maxConcurrentRequestCount = 8;
} else if (qx.bom.client.Engine.getName() == "webkit") {
// Safari: 4
// http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/
// Bug #6917: Distinguish Chrome from Safari, Chrome has 6 connections
// according to
// http://stackoverflow.com/questions/561046/how-many-concurrent-ajax-xmlhttprequest-requests-are-allowed-in-popular-browser
maxConcurrentRequestCount = 4;
} else if (qx.bom.client.Engine.getName() == "gecko"
&& ( (versionMain >1)
|| ((versionMain == 1) && (versionMajor > 9))
|| ((versionMain == 1) && (versionMajor == 9) && (versionMinor >= 1)))){
// FF 3.5 (== Gecko 1.9.1): 6 Connections.
// see http://gemal.dk/blog/2008/03/18/firefox_3_beta_5_will_have_improved_connection_parallelism/
maxConcurrentRequestCount = 6;
} else {
// Default is 2, as demanded by RFC 2616
// see http://blogs.msdn.com/ie/archive/2005/04/11/407189.aspx
maxConcurrentRequestCount = 2;
}
return maxConcurrentRequestCount;
},
/**
* Checks whether the app is loaded with SSL enabled which means via https.
*
* @internal
* @return {Boolean} <code>true</code>, if the app runs on https
*/
getSsl : function() {
return window.location.protocol === "https:";
},
/**
* Checks what kind of XMLHttpRequest object the browser supports
* for the current protocol, if any.
*
* The standard XMLHttpRequest is preferred over ActiveX XMLHTTP.
*
* @internal
* @return {String}
* <code>"xhr"</code>, if the browser provides standard XMLHttpRequest.<br/>
* <code>"activex"</code>, if the browser provides ActiveX XMLHTTP.<br/>
* <code>""</code>, if there is not XHR support at all.
*/
getXmlHttpRequest : function() {
// Standard XHR can be disabled in IE's security settings,
// therefore provide ActiveX as fallback. Additionally,
// standard XHR in IE7 is broken for file protocol.
var supports = window.ActiveXObject ?
(function() {
if ( window.location.protocol !== "file:" ) {
try {
new window.XMLHttpRequest();
return "xhr";
} catch(noXhr) {}
}
try {
new window.ActiveXObject("Microsoft.XMLHTTP");
return "activex";
} catch(noActiveX) {}
})()
:
(function() {
try {
new window.XMLHttpRequest();
return "xhr";
} catch(noXhr) {}
})();
return supports || "";
}
},
defer : function(statics) {
qx.core.Environment.add("io.maxrequests", statics.getMaxConcurrentRequestCount);
qx.core.Environment.add("io.ssl", statics.getSsl);
qx.core.Environment.add("io.xhr", statics.getXmlHttpRequest);
}
});