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