JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.3
[ckeditor.git] / _source / core / env.js
1 /*\r
2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 /**\r
7  * @fileOverview Defines the {@link CKEDITOR.env} object, which constains\r
8  *              environment and browser information.\r
9  */\r
10 \r
11 if ( !CKEDITOR.env )\r
12 {\r
13         /**\r
14          * @namespace Environment and browser information.\r
15          */\r
16         CKEDITOR.env = (function()\r
17         {\r
18                 var agent = navigator.userAgent.toLowerCase();\r
19                 var opera = window.opera;\r
20 \r
21                 var env =\r
22                 /** @lends CKEDITOR.env */\r
23                 {\r
24                         /**\r
25                          * Indicates that CKEditor is running on Internet Explorer.\r
26                          * @type Boolean\r
27                          * @example\r
28                          * if ( CKEDITOR.env.ie )\r
29                          *     alert( "I'm on IE!" );\r
30                          */\r
31                         ie              : /*@cc_on!@*/false,\r
32 \r
33                         /**\r
34                          * Indicates that CKEditor is running on Opera.\r
35                          * @type Boolean\r
36                          * @example\r
37                          * if ( CKEDITOR.env.opera )\r
38                          *     alert( "I'm on Opera!" );\r
39                          */\r
40                         opera   : ( !!opera && opera.version ),\r
41 \r
42                         /**\r
43                          * Indicates that CKEditor is running on a WebKit based browser, like\r
44                          * Safari.\r
45                          * @type Boolean\r
46                          * @example\r
47                          * if ( CKEDITOR.env.webkit )\r
48                          *     alert( "I'm on WebKit!" );\r
49                          */\r
50                         webkit  : ( agent.indexOf( ' applewebkit/' ) > -1 ),\r
51 \r
52                         /**\r
53                          * Indicates that CKEditor is running on Adobe AIR.\r
54                          * @type Boolean\r
55                          * @example\r
56                          * if ( CKEDITOR.env.air )\r
57                          *     alert( "I'm on AIR!" );\r
58                          */\r
59                         air             : ( agent.indexOf( ' adobeair/' ) > -1 ),\r
60 \r
61                         /**\r
62                          * Indicates that CKEditor is running on Macintosh.\r
63                          * @type Boolean\r
64                          * @example\r
65                          * if ( CKEDITOR.env.mac )\r
66                          *     alert( "I love apples!" );\r
67                          */\r
68                         mac     : ( agent.indexOf( 'macintosh' ) > -1 ),\r
69 \r
70                         /**\r
71                          * Indicates that CKEditor is running on a quirks mode environemnt.\r
72                          * @type Boolean\r
73                          * @example\r
74                          * if ( CKEDITOR.env.quirks )\r
75                          *     alert( "Nooooo!" );\r
76                          */\r
77                         quirks : ( document.compatMode == 'BackCompat' ),\r
78 \r
79                         /**\r
80                          * Indicates that CKEditor is running on a mobile like environemnt.\r
81                          * @type Boolean\r
82                          * @example\r
83                          * if ( CKEDITOR.env.mobile )\r
84                          *     alert( "I'm running with CKEditor today!" );\r
85                          */\r
86                         mobile : ( agent.indexOf( 'mobile' ) > -1 ),\r
87 \r
88                         /**\r
89                          * Indicates that CKEditor is running on Apple iPhone/iPad/iPod devices.\r
90                          * @type Boolean\r
91                          * @example\r
92                          * if ( CKEDITOR.env.iOS )\r
93                          *     alert( "I like little apples!" );\r
94                          */\r
95                         iOS : /(ipad|iphone|ipod)/.test(agent),\r
96 \r
97                         /**\r
98                          * Indicates that the browser has a custom domain enabled. This has\r
99                          * been set with "document.domain".\r
100                          * @returns {Boolean} "true" if a custom domain is enabled.\r
101                          * @example\r
102                          * if ( CKEDITOR.env.isCustomDomain() )\r
103                          *     alert( "I'm in a custom domain!" );\r
104                          */\r
105                         isCustomDomain : function()\r
106                         {\r
107                                 if ( !this.ie )\r
108                                         return false;\r
109 \r
110                                 var domain = document.domain,\r
111                                         hostname = window.location.hostname;\r
112 \r
113                                 return domain != hostname &&\r
114                                         domain != ( '[' + hostname + ']' );     // IPv6 IP support (#5434)\r
115                         },\r
116 \r
117                         /**\r
118                          * Indicates that page is running under an encrypted connection.\r
119                          * @returns {Boolean} "true" if the page has an encrypted connection.\r
120                          * @example\r
121                          * if ( CKEDITOR.env.secure )\r
122                          *     alert( "I'm in SSL!" );\r
123                          */\r
124                         secure : location.protocol == 'https:'\r
125                 };\r
126 \r
127                 /**\r
128                  * Indicates that CKEditor is running on a Gecko based browser, like\r
129                  * Firefox.\r
130                  * @name CKEDITOR.env.gecko\r
131                  * @type Boolean\r
132                  * @example\r
133                  * if ( CKEDITOR.env.gecko )\r
134                  *     alert( "I'm riding a gecko!" );\r
135                  */\r
136                 env.gecko = ( navigator.product == 'Gecko' && !env.webkit && !env.opera );\r
137 \r
138                 var version = 0;\r
139 \r
140                 // Internet Explorer 6.0+\r
141                 if ( env.ie )\r
142                 {\r
143                         version = parseFloat( agent.match( /msie (\d+)/ )[1] );\r
144 \r
145                         /**\r
146                          * Indicates that CKEditor is running on Internet Explorer 8.\r
147                          * @name CKEDITOR.env.ie8\r
148                          * @type Boolean\r
149                          * @example\r
150                          * if ( CKEDITOR.env.ie8 )\r
151                          *     alert( "I'm on IE8!" );\r
152                          */\r
153                         env.ie8 = !!document.documentMode;\r
154 \r
155                         /**\r
156                          * Indicates that CKEditor is running on Internet Explorer 8 on\r
157                          * standards mode.\r
158                          * @name CKEDITOR.env.ie8Compat\r
159                          * @type Boolean\r
160                          * @example\r
161                          * if ( CKEDITOR.env.ie8Compat )\r
162                          *     alert( "Now I'm on IE8, for real!" );\r
163                          */\r
164                         env.ie8Compat = document.documentMode == 8;\r
165 \r
166                         /**\r
167                          * Indicates that CKEditor is running on Internet Explorer 9's standards mode.\r
168                          * @name CKEDITOR.env.ie9Compat\r
169                          * @type Boolean\r
170                          * @example\r
171                          * if ( CKEDITOR.env.ie9Compat )\r
172                          *     alert( "IE9, the beauty of the web!" );\r
173                          */\r
174                         env.ie9Compat = document.documentMode == 9;\r
175 \r
176                         /**\r
177                          * Indicates that CKEditor is running on an IE7-like environment, which\r
178                          * includes IE7 itself and IE8's IE7 document mode.\r
179                          * @name CKEDITOR.env.ie7Compat\r
180                          * @type Boolean\r
181                          * @example\r
182                          * if ( CKEDITOR.env.ie8Compat )\r
183                          *     alert( "I'm on IE7 or on an IE7 like IE8!" );\r
184                          */\r
185                         env.ie7Compat = ( ( version == 7 && !document.documentMode )\r
186                                         || document.documentMode == 7 );\r
187 \r
188                         /**\r
189                          * Indicates that CKEditor is running on an IE6-like environment, which\r
190                          * includes IE6 itself and IE7 and IE8 quirks mode.\r
191                          * @name CKEDITOR.env.ie6Compat\r
192                          * @type Boolean\r
193                          * @example\r
194                          * if ( CKEDITOR.env.ie6Compat )\r
195                          *     alert( "I'm on IE6 or quirks mode!" );\r
196                          */\r
197                         env.ie6Compat = ( version < 7 || env.quirks );\r
198                 }\r
199 \r
200                 // Gecko.\r
201                 if ( env.gecko )\r
202                 {\r
203                         var geckoRelease = agent.match( /rv:([\d\.]+)/ );\r
204                         if ( geckoRelease )\r
205                         {\r
206                                 geckoRelease = geckoRelease[1].split( '.' );\r
207                                 version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;\r
208                         }\r
209                 }\r
210 \r
211                 // Opera 9.50+\r
212                 if ( env.opera )\r
213                         version = parseFloat( opera.version() );\r
214 \r
215                 // Adobe AIR 1.0+\r
216                 // Checked before Safari because AIR have the WebKit rich text editor\r
217                 // features from Safari 3.0.4, but the version reported is 420.\r
218                 if ( env.air )\r
219                         version = parseFloat( agent.match( / adobeair\/(\d+)/ )[1] );\r
220 \r
221                 // WebKit 522+ (Safari 3+)\r
222                 if ( env.webkit )\r
223                         version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );\r
224 \r
225                 /**\r
226                  * Contains the browser version.<br />\r
227                  * <br />\r
228                  * For gecko based browsers (like Firefox) it contains the revision\r
229                  * number with first three parts concatenated with a padding zero\r
230                  * (e.g. for revision 1.9.0.2 we have 10900).<br />\r
231                  * <br />\r
232                  * For webkit based browser (like Safari and Chrome) it contains the\r
233                  * WebKit build version (e.g. 522).\r
234                  * @name CKEDITOR.env.version\r
235                  * @type Boolean\r
236                  * @example\r
237                  * if ( CKEDITOR.env.ie && <b>CKEDITOR.env.version</b> <= 6 )\r
238                  *     alert( "Ouch!" );\r
239                  */\r
240                 env.version = version;\r
241 \r
242                 /**\r
243                  * Indicates that CKEditor is running on a compatible browser.\r
244                  * @name CKEDITOR.env.isCompatible\r
245                  * @type Boolean\r
246                  * @example\r
247                  * if ( CKEDITOR.env.isCompatible )\r
248                  *     alert( "Your browser is pretty cool!" );\r
249                  */\r
250                 env.isCompatible =\r
251 \r
252                         // White list of mobile devices that supports.\r
253                         env.iOS && version >= 534 ||\r
254 \r
255                         !env.mobile && (\r
256 \r
257                         ( env.ie && version >= 6 ) ||\r
258                         ( env.gecko && version >= 10801 ) ||\r
259                         ( env.opera && version >= 9.5 ) ||\r
260                         ( env.air && version >= 1 ) ||\r
261                         ( env.webkit && version >= 522 ) ||\r
262                         false );\r
263 \r
264                 /**\r
265                  * The CSS class to be appended on the main UI containers, making it\r
266                  * easy to apply browser specific styles to it.\r
267                  * @name CKEDITOR.env.cssClass\r
268                  * @type String\r
269                  * @example\r
270                  * myDiv.className = CKEDITOR.env.cssClass;\r
271                  */\r
272                 env.cssClass =\r
273                         'cke_browser_' + (\r
274                                 env.ie ? 'ie' :\r
275                                 env.gecko ? 'gecko' :\r
276                                 env.opera ? 'opera' :\r
277                                 env.webkit ? 'webkit' :\r
278                                 'unknown' );\r
279 \r
280                 if ( env.quirks )\r
281                         env.cssClass += ' cke_browser_quirks';\r
282 \r
283                 if ( env.ie )\r
284                 {\r
285                         env.cssClass += ' cke_browser_ie' + (\r
286                                 env.version < 7 ? '6' :\r
287                                 env.version >= 8 ? document.documentMode:\r
288                                 '7' );\r
289 \r
290                         if ( env.quirks )\r
291                                 env.cssClass += ' cke_browser_iequirks';\r
292                 }\r
293 \r
294                 if ( env.gecko && version < 10900 )\r
295                         env.cssClass += ' cke_browser_gecko18';\r
296 \r
297                 if ( env.air )\r
298                         env.cssClass += ' cke_browser_air';\r
299 \r
300                 return env;\r
301         })();\r
302 }\r
303 \r
304 // PACKAGER_RENAME( CKEDITOR.env )\r
305 // PACKAGER_RENAME( CKEDITOR.env.ie )\r