4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <title>The source code</title>
6 <link href="../prettify/prettify.css" type="text/css" rel="stylesheet" />
7 <script type="text/javascript" src="../prettify/prettify.js"></script>
8 <style type="text/css">
9 .highlight { display: block; background-color: #ddd; }
11 <script type="text/javascript">
12 function highlight() {
13 document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
17 <body onload="prettyPrint(); highlight();">
18 <pre class="prettyprint lang-js"><span id='Ext-env-FeatureDetector'>/**
19 </span> * @class Ext.env.FeatureDetector
21 Ext.define('Ext.env.FeatureDetector', {
26 var element = this.getTestElement('canvas');
27 return !!(element && element.getContext && element.getContext('2d'));
30 var doc = Ext.global.document;
32 return !!(doc.createElementNS && !!doc.createElementNS("http:/" + "/www.w3.org/2000/svg", "svg").createSVGRect);
35 var element = this.getTestElement(),
38 element.innerHTML = "<!--[if vml]><br><br><![endif]-->";
39 ret = (element.childNodes.length === 2);
40 element.innerHTML = "";
45 return ('ontouchstart' in Ext.global) && !(Ext.platform && Ext.platform.name.match(/Windows|MacOSX|Linux/));
47 Orientation: function() {
48 return ('orientation' in Ext.global);
50 Geolocation: function() {
51 return !!Ext.global.navigator.geolocation;
53 SqlDatabase: function() {
54 return !!Ext.global.openDatabase;
56 Websockets: function() {
57 return 'WebSocket' in Ext.global;
60 return !!(Ext.global.history && Ext.global.history.pushState);
62 CSSTransforms: function() {
63 return this.isStyleSupported('transform');
65 CSS3DTransforms: function() {
66 return this.has('csstransforms') && this.isStyleSupported('perspective');
68 CSSAnimations: function() {
69 return this.isStyleSupported('animationName');
71 CSSTransitions: function() {
72 return this.isStyleSupported('transitionProperty');
75 return !!this.getTestElement('audio').canPlayType;
78 return !!this.getTestElement('video').canPlayType;
82 stylePrefixes: ['Webkit', 'Moz', 'O', 'ms']
85 constructor: function() {
88 this.testElements = {};
90 this.registerTests(this.self.defaultTests, true);
96 if (!this.hasTest(name)) {
99 else if (this.has.hasOwnProperty(name)) {
100 return this.has[name];
103 return this.getTestResult(name);
107 getTestResult: function(name) {
108 return !!this.getTest(name).call(this);
111 getTestElement: function(tag) {
116 if (!this.testElements[tag]) {
117 this.testElements[tag] = Ext.global.document.createElement(tag);
120 return this.testElements[tag];
123 registerTest: function(name, fn, isDefault) {
125 if (this.hasTest(name)) {
127 sourceClass: "Ext.env.FeatureDetector",
128 sourceMethod: "registerTest",
129 msg: "Test name " + name + " has already been registered"
134 this.tests[name] = fn;
137 this.has[name] = this.getTestResult(name);
143 registerTests: function(tests, isDefault) {
144 Ext.Object.each(tests, function(name, fn) {
145 this.registerTest(name, fn, isDefault);
151 hasTest: function(name) {
152 return this.tests.hasOwnProperty(name);
155 getTest: function(name) {
157 if (!this.hasTest(name)) {
159 sourceClass: "Ext.env.FeatureDetector",
160 sourceMethod: "getTest",
161 msg: "Test name " + name + " does not exist"
166 return this.tests[name];
169 getTests: function() {
173 isStyleSupported: function(name, tag) {
174 var elementStyle = this.getTestElement(tag).style,
175 cName = Ext.String.capitalize(name),
176 i = this.self.stylePrefixes.length;
178 if (elementStyle[name] !== undefined) {
183 if (elementStyle[this.self.stylePrefixes[i] + cName] !== undefined) {
191 isEventSupported: function(name, tag) {
192 var element = this.getTestElement(tag),
193 eventName = 'on' + name,
196 // When using `setAttribute`, IE skips "unload", WebKit skips
197 // "unload" and "resize", whereas `in` "catches" those
198 isSupported = (eventName in element);
201 if (element.setAttribute && element.removeAttribute) {
202 element.setAttribute(eventName, '');
203 isSupported = typeof element[eventName] === 'function';
205 // If property was created, "remove it" (by setting value to `undefined`)
206 if (typeof element[eventName] !== 'undefined') {
207 element[eventName] = undefined;
210 element.removeAttribute(eventName);
220 * Global convenient instance of {@link Ext.env.FeatureDetector Ext.env.FeatureDetector}
221 * @member Ext features
223 Ext.features = new Ext.env.FeatureDetector();