JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
a0ae46509761b114681c20bb95be00c757ae47dc
[ckeditor.git] / _source / core / env.js
1 /*\r
2 Copyright (c) 2003-2010, 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          * Environment and browser information.\r
15          * @namespace\r
16          * @example\r
17          */\r
18         CKEDITOR.env = (function()\r
19         {\r
20                 var agent = navigator.userAgent.toLowerCase();\r
21                 var opera = window.opera;\r
22 \r
23                 var env =\r
24                 /** @lends CKEDITOR.env */\r
25                 {\r
26                         /**\r
27                          * Indicates that CKEditor is running on Internet Explorer.\r
28                          * @type Boolean\r
29                          * @example\r
30                          * if ( CKEDITOR.env.ie )\r
31                          *     alert( "I'm on IE!" );\r
32                          */\r
33                         ie              : /*@cc_on!@*/false,\r
34 \r
35                         /**\r
36                          * Indicates that CKEditor is running on Opera.\r
37                          * @type Boolean\r
38                          * @example\r
39                          * if ( CKEDITOR.env.opera )\r
40                          *     alert( "I'm on Opera!" );\r
41                          */\r
42                         opera   : ( !!opera && opera.version ),\r
43 \r
44                         /**\r
45                          * Indicates that CKEditor is running on a WebKit based browser, like\r
46                          * Safari.\r
47                          * @type Boolean\r
48                          * @example\r
49                          * if ( CKEDITOR.env.webkit )\r
50                          *     alert( "I'm on WebKit!" );\r
51                          */\r
52                         webkit  : ( agent.indexOf( ' applewebkit/' ) > -1 ),\r
53 \r
54                         /**\r
55                          * Indicates that CKEditor is running on Adobe AIR.\r
56                          * @type Boolean\r
57                          * @example\r
58                          * if ( CKEDITOR.env.air )\r
59                          *     alert( "I'm on AIR!" );\r
60                          */\r
61                         air             : ( agent.indexOf( ' adobeair/' ) > -1 ),\r
62 \r
63                         /**\r
64                          * Indicates that CKEditor is running on Macintosh.\r
65                          * @type Boolean\r
66                          * @example\r
67                          * if ( CKEDITOR.env.mac )\r
68                          *     alert( "I love apples!" );\r
69                          */\r
70                         mac     : ( agent.indexOf( 'macintosh' ) > -1 ),\r
71 \r
72                         quirks : ( document.compatMode == 'BackCompat' ),\r
73 \r
74                         mobile : ( agent.indexOf( 'mobile' ) > -1 ),\r
75 \r
76                         isCustomDomain : function()\r
77                         {\r
78                                 if ( !this.ie )\r
79                                         return false;\r
80 \r
81                                 var domain = document.domain,\r
82                                         hostname = window.location.hostname;\r
83 \r
84                                 return domain != hostname &&\r
85                                         domain != ( '[' + hostname + ']' );     // IPv6 IP support (#5434)\r
86                         }\r
87                 };\r
88 \r
89                 /**\r
90                  * Indicates that CKEditor is running on a Gecko based browser, like\r
91                  * Firefox.\r
92                  * @name CKEDITOR.env.gecko\r
93                  * @type Boolean\r
94                  * @example\r
95                  * if ( CKEDITOR.env.gecko )\r
96                  *     alert( "I'm riding a gecko!" );\r
97                  */\r
98                 env.gecko = ( navigator.product == 'Gecko' && !env.webkit && !env.opera );\r
99 \r
100                 var version = 0;\r
101 \r
102                 // Internet Explorer 6.0+\r
103                 if ( env.ie )\r
104                 {\r
105                         version = parseFloat( agent.match( /msie (\d+)/ )[1] );\r
106 \r
107                         /**\r
108                          *  Indicate IE8 browser.\r
109                          */\r
110                         env.ie8 = !!document.documentMode;\r
111 \r
112                         /**\r
113                          * Indicte IE8 document mode.\r
114                          */\r
115                         env.ie8Compat = document.documentMode == 8;\r
116 \r
117                         /**\r
118                          * Indicates that CKEditor is running on an IE7-like environment, which\r
119                          * includes IE7 itself and IE8's IE7 document mode.\r
120                          * @type Boolean\r
121                          */\r
122                         env.ie7Compat = ( ( version == 7 && !document.documentMode )\r
123                                         || document.documentMode == 7 );\r
124 \r
125                         /**\r
126                          * Indicates that CKEditor is running on an IE6-like environment, which\r
127                          * includes IE6 itself and IE7 and IE8 quirks mode.\r
128                          * @type Boolean\r
129                          * @example\r
130                          * if ( CKEDITOR.env.ie6Compat )\r
131                          *     alert( "I'm on IE6 or quirks mode!" );\r
132                          */\r
133                         env.ie6Compat = ( version < 7 || env.quirks );\r
134 \r
135                 }\r
136 \r
137                 // Gecko.\r
138                 if ( env.gecko )\r
139                 {\r
140                         var geckoRelease = agent.match( /rv:([\d\.]+)/ );\r
141                         if ( geckoRelease )\r
142                         {\r
143                                 geckoRelease = geckoRelease[1].split( '.' );\r
144                                 version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;\r
145                         }\r
146                 }\r
147 \r
148                 // Opera 9.50+\r
149                 if ( env.opera )\r
150                         version = parseFloat( opera.version() );\r
151 \r
152                 // Adobe AIR 1.0+\r
153                 // Checked before Safari because AIR have the WebKit rich text editor\r
154                 // features from Safari 3.0.4, but the version reported is 420.\r
155                 if ( env.air )\r
156                         version = parseFloat( agent.match( / adobeair\/(\d+)/ )[1] );\r
157 \r
158                 // WebKit 522+ (Safari 3+)\r
159                 if ( env.webkit )\r
160                         version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );\r
161 \r
162                 /**\r
163                  * Contains the browser version.\r
164                  *\r
165                  * For gecko based browsers (like Firefox) it contains the revision\r
166                  * number with first three parts concatenated with a padding zero\r
167                  * (e.g. for revision 1.9.0.2 we have 10900).\r
168                  *\r
169                  * For webkit based browser (like Safari and Chrome) it contains the\r
170                  * WebKit build version (e.g. 522).\r
171                  * @name CKEDITOR.env.version\r
172                  * @type Boolean\r
173                  * @example\r
174                  * if ( CKEDITOR.env.ie && <b>CKEDITOR.env.version</b> <= 6 )\r
175                  *     alert( "Ouch!" );\r
176                  */\r
177                 env.version = version;\r
178 \r
179                 /**\r
180                  * Indicates that CKEditor is running on a compatible browser.\r
181                  * @name CKEDITOR.env.isCompatible\r
182                  * @type Boolean\r
183                  * @example\r
184                  * if ( CKEDITOR.env.isCompatible )\r
185                  *     alert( "Your browser is pretty cool!" );\r
186                  */\r
187                 env.isCompatible =\r
188                         !env.mobile && (\r
189                         ( env.ie && version >= 6 ) ||\r
190                         ( env.gecko && version >= 10801 ) ||\r
191                         ( env.opera && version >= 9.5 ) ||\r
192                         ( env.air && version >= 1 ) ||\r
193                         ( env.webkit && version >= 522 ) ||\r
194                         false );\r
195 \r
196                 // The CSS class to be appended on the main UI containers, making it\r
197                 // easy to apply browser specific styles to it.\r
198                 env.cssClass =\r
199                         'cke_browser_' + (\r
200                                 env.ie ? 'ie' :\r
201                                 env.gecko ? 'gecko' :\r
202                                 env.opera ? 'opera' :\r
203                                 env.air ? 'air' :\r
204                                 env.webkit ? 'webkit' :\r
205                                 'unknown' );\r
206 \r
207                 if ( env.quirks )\r
208                         env.cssClass += ' cke_browser_quirks';\r
209 \r
210                 if ( env.ie )\r
211                 {\r
212                         env.cssClass += ' cke_browser_ie' + (\r
213                                 env.version < 7 ? '6' :\r
214                                 env.version >= 8 ? '8' :\r
215                                 '7' );\r
216 \r
217                         if ( env.quirks )\r
218                                 env.cssClass += ' cke_browser_iequirks';\r
219                 }\r
220 \r
221                 if ( env.gecko && version < 10900 )\r
222                         env.cssClass += ' cke_browser_gecko18';\r
223 \r
224                 return env;\r
225         })();\r
226 }\r
227 \r
228 // PACKAGER_RENAME( CKEDITOR.env )\r
229 // PACKAGER_RENAME( CKEDITOR.env.ie )\r