/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org License: LGPL 2.1: http://www.gnu.org/licenses/lgpl.html Authors: * Sebastian Werner (wpbasti) * Andreas Ecker (ecker) ************************************************************************ */ /* ************************************************************************ #module(core) ************************************************************************ */ /*! Basic client detection implementation Version shemes following wikipedia: major.minor[.revision[.build]] http://en.wikipedia.org/wiki/Software_version */ qx.OO.defineClass("qx.sys.Client", Object, function() { var vRunsLocally = window.location.protocol === "file:"; var vBrowserUserAgent = navigator.userAgent; var vBrowserVendor = navigator.vendor; var vBrowserProduct = navigator.product; var vBrowserPlatform = navigator.platform; var vBrowserModeHta = false; var vBrowser; var vEngine = null; var vEngineVersion = null; var vEngineVersionMajor = 0; var vEngineVersionMinor = 0; var vEngineVersionRevision = 0; var vEngineVersionBuild = 0; var vEngineEmulation = null; var vVersionHelper; if (window.opera && /Opera[\s\/]([0-9\.]*)/.test(vBrowserUserAgent)) { vEngine = "opera"; vEngineVersion = RegExp.$1; // Fix Opera version to match wikipedia style vEngineVersion = vEngineVersion.substring(0, 3) + "." + vEngineVersion.substring(3); vEngineEmulation = vBrowserUserAgent.indexOf("MSIE") !== -1 ? "mshtml" : vBrowserUserAgent.indexOf("Mozilla") !== -1 ? "gecko" : null; } else if (typeof vBrowserVendor==="string" && vBrowserVendor==="KDE" && /KHTML\/([0-9-\.]*)/.test(vBrowserUserAgent)) { vEngine = "khtml"; vBrowser = "konqueror"; vEngineVersion = RegExp.$1; } else if (vBrowserUserAgent.indexOf("AppleWebKit") != -1 && /AppleWebKit\/([0-9-\.]*)/.test(vBrowserUserAgent)) { vEngine = "webkit"; vEngineVersion = RegExp.$1; if(vBrowserUserAgent.indexOf("Safari") != -1) { vBrowser = "safari"; } else if(vBrowserUserAgent.indexOf("Omni") != -1) { vBrowser = "omniweb"; } else { vBrowser = "other webkit"; } } else if (window.controllers && typeof vBrowserProduct==="string" && vBrowserProduct==="Gecko" && /rv\:([^\);]+)(\)|;)/.test(vBrowserUserAgent)) { // http://www.mozilla.org/docs/dom/domref/dom_window_ref13.html vEngine = "gecko"; vEngineVersion = RegExp.$1; if(vBrowserUserAgent.indexOf("Firefox") != -1) { vBrowser = "firefox"; } else if(vBrowserUserAgent.indexOf("Camino") != -1) { vBrowser = "camino"; } else if(vBrowserUserAgent.indexOf("Galeon") != -1) { vBrowser = "galeon"; } else { vBrowser = "other gecko"; } } else if (/MSIE\s+([^\);]+)(\)|;)/.test(vBrowserUserAgent)) { vEngine = "mshtml"; vEngineVersion = RegExp.$1; vBrowserModeHta = !window.external; } if (vEngineVersion) { vVersionHelper = vEngineVersion.split("."); vEngineVersionMajor = vVersionHelper[0] || 0; vEngineVersionMinor = vVersionHelper[1] || 0; vEngineVersionRevision = vVersionHelper[2] || 0; vEngineVersionBuild = vVersionHelper[3] || 0; } var vEngineBoxSizingAttr = vEngine == "gecko" ? "-moz-box-sizing" : vEngine == "mshtml" ? null : "box-sizing"; var vEngineQuirksMode = document.compatMode !== "CSS1Compat"; var vDefaultLocale = "en"; var vBrowserLocale = (vEngine == "mshtml" ? navigator.userLanguage : navigator.language).toLowerCase(); var vBrowserLocaleVariant = null; var vBrowserLocaleVariantIndex = vBrowserLocale.indexOf("-"); if (vBrowserLocaleVariantIndex != -1) { vBrowserLocaleVariant = vBrowserLocale.substr(vBrowserLocaleVariantIndex+1); vBrowserLocale = vBrowserLocale.substr(0, vBrowserLocaleVariantIndex); } var vPlatform = "none"; var vPlatformWindows = false; var vPlatformMacintosh = false; var vPlatformUnix = false; var vPlatformOther = false; if (vBrowserPlatform.indexOf("Windows") != -1 || vBrowserPlatform.indexOf("Win32") != -1 || vBrowserPlatform.indexOf("Win64") != -1) { vPlatformWindows = true; vPlatform = "win"; } else if (vBrowserPlatform.indexOf("Macintosh") != -1 || vBrowserPlatform.indexOf("MacIntel") != -1) { vPlatformMacintosh = true; vPlatform = "mac"; } else if (vBrowserPlatform.indexOf("X11") != -1 || vBrowserPlatform.indexOf("Linux") != -1 || vBrowserPlatform.indexOf("BSD") != -1) { vPlatformUnix = true; vPlatform = "unix"; } else { vPlatformOther = true; vPlatform = "other"; } var vGfxVml = false; var vGfxSvg = false; var vGfxSvgBuiltin = false; var vGfxSvgPlugin = false; if (vEngine == "mshtml") { vGfxVml = true; // TODO: Namespace for VML: // document.write(''); // document.write(''); } if (document.implementation && document.implementation.hasFeature) { if (document.implementation.hasFeature("org.w3c.dom.svg", "1.0")) { vGfxSvg = vGfxSvgBuiltin = true; } } this._runsLocally = vRunsLocally; this._engineName = vEngine; this._engineNameMshtml = vEngine === "mshtml"; this._engineNameGecko = vEngine === "gecko"; this._engineNameOpera = vEngine === "opera"; this._engineNameKhtml = vEngine === "khtml"; this._engineNameWebkit = vEngine === "webkit"; this._engineVersion = parseFloat(vEngineVersion); this._engineVersionMajor = parseInt(vEngineVersionMajor); this._engineVersionMinor = parseInt(vEngineVersionMinor); this._engineVersionRevision = parseInt(vEngineVersionRevision); this._engineVersionBuild = parseInt(vEngineVersionBuild); this._engineQuirksMode = vEngineQuirksMode; this._engineBoxSizingAttribute = vEngineBoxSizingAttr; this._engineEmulation = vEngineEmulation; this._defaultLocale = vDefaultLocale; this._browserPlatform = vPlatform; this._browserPlatformWindows = vPlatformWindows; this._browserPlatformMacintosh = vPlatformMacintosh; this._browserPlatformUnix = vPlatformUnix; this._browserPlatformOther = vPlatformOther; this._browserModeHta = vBrowserModeHta; this._browserLocale = vBrowserLocale; this._browserLocaleVariant = vBrowserLocaleVariant; this._gfxVml = vGfxVml; this._gfxSvg = vGfxSvg; this._gfxSvgBuiltin = vGfxSvgBuiltin; this._gfxSvgPlugin = vGfxSvgPlugin; this._supportsTextContent = (document.documentElement.textContent !== undefined); this._supportsInnerText = (document.documentElement.innerText !== undefined); }); /* --------------------------------------------------------------------------- METHODS --------------------------------------------------------------------------- */ qx.Proto.getRunsLocally = function() { return this._runsLocally; } qx.Proto.getEngine = function() { return this._engineName; } qx.Proto.getVersion = function() { return this._engineVersion; } qx.Proto.getMajor = function() { return this._engineVersionMajor; } qx.Proto.getMinor = function() { return this._engineVersionMinor; } qx.Proto.getRevision = function() { return this._engineVersionRevision; } qx.Proto.getBuild = function() { return this._engineVersionBuild; } qx.Proto.getEmulation = function() { return this._engineEmulation; } qx.Proto.isMshtml = function() { return this._engineNameMshtml; } qx.Proto.isGecko = function() { return this._engineNameGecko; } qx.Proto.isOpera = function() { return this._engineNameOpera; } qx.Proto.isKhtml = function() { return this._engineNameKhtml; } qx.Proto.isWebkit = function() { return this._engineNameWebkit; } qx.Proto.isSafari2 = function() { return this._engineNameWebkit && (this._engineVersion < 420); } qx.Proto.isInQuirksMode = function() { return this._engineQuirksMode; } qx.Proto.getLocale = function() { return this._browserLocale; } qx.Proto.getLocaleVariant = function() { return this._browserLocaleVariant; } qx.Proto.getDefaultLocale = function() { return this._defaultLocale; } qx.Proto.usesDefaultLocale = function() { return this._browserLocale === this._defaultLocale; } /** * Returns the CSS attribute name for box-sizing if supported. * * @return {string} the attribute name. */ qx.Proto.getEngineBoxSizingAttribute = function() { return this._engineBoxSizingAttribute; } qx.Proto.getPlatform = function() { return this._browserPlatform; } /** * Returns whether the client platform is a Windows machine. * * @return {boolean} whether the client platform is a Windows. */ qx.Proto.runsOnWindows = function() { return this._browserPlatformWindows; } /** * Returns whether the client platform is a Macintosh machine. * * @return {boolean} whether the client platform is a Macintosh. */ qx.Proto.runsOnMacintosh = function() { return this._browserPlatformMacintosh; } /** * Returns whether the client platform is a X11 powered machine. * * @return {boolean} whether the client platform is a X11 powered machine. */ qx.Proto.runsOnUnix = function() { return this._browserPlatformUnix; } qx.Proto.supportsVml = function() { return this._gfxVml; } qx.Proto.supportsSvg = function() { return this._gfxSvg; } qx.Proto.usesSvgBuiltin = function() { return this._gfxSvgBuiltin; } qx.Proto.usesSvgPlugin = function() { return this._gfxSvgPlugin; } /** * Returns whether the client supports the W3C property textContent of DOM element nodes. * * @return {boolean} whether the client supports textContent. */ qx.Proto.supportsTextContent = function() { return this._supportsTextContent; } /** * Returns whether the client supports the W3C property innerText of DOM element nodes. * * @return {boolean} whether the client supports innerText. */ qx.Proto.supportsInnerText = function() { return this._supportsInnerText; } /* --------------------------------------------------------------------------- DEFER SINGLETON INSTANCE --------------------------------------------------------------------------- */ /** * Singleton Instance Getter */ qx.Class.getInstance = qx.util.Return.returnInstance;