1 /** 2 * The MIT License (MIT) 3 * 4 * Copyright (c) 2016 DeNA Co., Ltd. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 25 /// <reference path="base.js"/> 26 27 /** 28 * A class that parses a user-agent string. 29 * @param {string} userAgent 30 * @param {string} platform 31 * @constructor 32 */ 33 createjs.UserAgent = function(userAgent, platform) { 34 /// <param type="string" name="userAgent"/> 35 /// <param type="string" name="platform"/> 36 37 /** 38 * The user-agent string. 39 * @type {string} 40 * @private 41 */ 42 this.userAgent_ = userAgent; 43 44 /** 45 * Whether this user-agent uses WebKit (or Blink). 46 * @const {boolean} 47 * @private 48 */ 49 this.isWebKit_ = userAgent.indexOf('WebKit') >= 0; 50 51 /** 52 * The platform ID. 53 * @const {number} 54 * @private 55 */ 56 this.platform_ = createjs.UserAgent.getPlatform_(userAgent, platform); 57 58 /** 59 * The user-agent ID. 60 * @const {number} 61 * @private 62 */ 63 this.agent_ = 64 createjs.UserAgent.getAgent_(userAgent, this.isWebKit_, this.platform_); 65 }; 66 67 /** 68 * Known user-agent IDs. 69 * @enum {number} 70 * @private 71 */ 72 createjs.UserAgent.Type = { 73 OPERA: 0, 74 MSIE: 1, 75 CHROME: 2, 76 SAFARI: 3, 77 FIREFOX: 4, 78 ANDROID: 5, 79 EDGE: 6, 80 UNKNOWN: 7 81 }; 82 83 /** 84 * Known platform IDs. 85 * @enum {number} 86 * @private 87 */ 88 createjs.UserAgent.Platform = { 89 WINDOWS: 0, 90 MAC: 1, 91 LINUX: 2, 92 ANDROID: 3, 93 IPHONE: 4, 94 UNKNOWN: 5 95 }; 96 97 /** 98 * The instance of the createjs.UserAgent object. 99 * @type {createjs.UserAgent} 100 * @private 101 */ 102 createjs.UserAgent.instance_ = null; 103 104 /** 105 * Parses a user-agent string and returns the most possible user-agent ID. 106 * @param {string} userAgent 107 * @param {boolean} isWebKit 108 * @param {number} platform 109 * @return {number} 110 * @private 111 */ 112 createjs.UserAgent.getAgent_ = function(userAgent, isWebKit, platform) { 113 /// <param type="string" name="userAgent"/> 114 /// <param type="boolean" name="isWebKit"/> 115 /// <param type="number" name="platform"/> 116 /// <returns type="number"/> 117 var AGENTS = { 118 'Opera': createjs.UserAgent.Type.OPERA, 119 'MSIE': createjs.UserAgent.Type.MSIE, 120 'Trident': createjs.UserAgent.Type.MSIE, 121 'Edge': createjs.UserAgent.Type.EDGE 122 }; 123 for (var key in AGENTS) { 124 if (userAgent.indexOf(key) >= 0) { 125 return AGENTS[key]; 126 } 127 } 128 var WEBKIT_AGENTS = { 129 'Chrome': createjs.UserAgent.Type.CHROME, 130 'Safari': createjs.UserAgent.Type.SAFARI 131 }; 132 var GECKO_AGENTS = { 133 'Gecko': createjs.UserAgent.Type.FIREFOX, 134 'Firefox': createjs.UserAgent.Type.FIREFOX 135 }; 136 var agents = isWebKit ? WEBKIT_AGENTS : GECKO_AGENTS; 137 for (var key in agents) { 138 if (userAgent.indexOf(key) >= 0) { 139 var agent = agents[key]; 140 // Assign a pseudo user-agent ID (which represents the stock browsers of 141 // Android devices prior to 4.4) when this user agent is not either Chrome 142 // for Android or Chromium WebView. (These stock browsers need many 143 // browser-specific workarounds.) 144 if (platform == createjs.UserAgent.Platform.ANDROID && 145 agent == createjs.UserAgent.Type.SAFARI) { 146 return createjs.UserAgent.Type.ANDROID; 147 } 148 return agent; 149 } 150 } 151 return createjs.UserAgent.Type.UNKNOWN; 152 }; 153 154 /** 155 * Parses a platform string and returns the most possible platform ID. 156 * @param {string} userAgent 157 * @param {string} platform 158 * @return {number} 159 * @private 160 */ 161 createjs.UserAgent.getPlatform_ = function(userAgent, platform) { 162 /// <param type="string" name="userAgent"/> 163 /// <param type="string" name="platform"/> 164 /// <returns type="number"/> 165 var PLATFORMS = { 166 'Win': createjs.UserAgent.Platform.WINDOWS, 167 'Mac': createjs.UserAgent.Platform.MAC, 168 'Linux': createjs.UserAgent.Platform.LINUX, 169 'iPhone': createjs.UserAgent.Platform.IPHONE, 170 'iPad': createjs.UserAgent.Platform.IPHONE 171 }; 172 for (var key in PLATFORMS) { 173 if (platform.indexOf(key) >= 0) { 174 var value = PLATFORMS[key]; 175 if (value == createjs.UserAgent.Platform.LINUX) { 176 // Check the user-agent string to distinguish Android from Linux. 177 if (userAgent.indexOf('Android') >= 0) { 178 return createjs.UserAgent.Platform.ANDROID; 179 } 180 } 181 return value; 182 } 183 } 184 return createjs.UserAgent.Platform.UNKNOWN; 185 }; 186 187 /** 188 * Returns the instance of the createjs.userAgent object. 189 * @return {createjs.UserAgent} 190 * @private 191 */ 192 createjs.UserAgent.getInstance_ = function() { 193 /// <returns type="createjs.UserAgent"/> 194 if (!createjs.UserAgent.instance_) { 195 var navigator = createjs.global['navigator']; 196 var userAgent = navigator ? navigator['userAgent'] : ''; 197 var platform = navigator ? navigator['platform'] : ''; 198 createjs.UserAgent.instance_ = new createjs.UserAgent(userAgent, platform); 199 } 200 return createjs.UserAgent.instance_; 201 }; 202 203 /** 204 * Returns whether the detected user-agent ID is equal to the specified one. 205 * @param {number} agent 206 * @return {boolean} 207 * @private 208 */ 209 createjs.UserAgent.compareAgent_ = function(agent) { 210 /// <param type="number" name="agent"/> 211 /// <returns type="boolean"/> 212 return createjs.UserAgent.getInstance_().agent_ == agent; 213 }; 214 215 /** 216 * Returns whether the detected platform ID is equal to the specified one. 217 * @param {number} platform 218 * @return {boolean} 219 * @private 220 */ 221 createjs.UserAgent.comparePlatform_ = function(platform) { 222 /// <param type="number" name="platform"/> 223 /// <returns type="boolean"/> 224 return createjs.UserAgent.getInstance_().platform_ == platform; 225 }; 226 227 /** 228 * Returns the user-agent string. 229 * @return {string} 230 */ 231 createjs.UserAgent.getUserAgent = function() { 232 /// <returns type="string"/> 233 return createjs.UserAgent.getInstance_().userAgent_; 234 }; 235 236 /** 237 * Returns whether the hosting browser is Opera (Presto). (Newer versions of 238 * Opera use Blink and they are treated as Chrome.) 239 * @return {boolean} 240 */ 241 createjs.UserAgent.isOpera = function() { 242 /// <returns type="boolean"/> 243 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.OPERA); 244 }; 245 246 /** 247 * Returns whether the hosting browser is Internet Explorer (Trident). 248 * @return {boolean} 249 */ 250 createjs.UserAgent.isMSIE = function() { 251 /// <returns type="boolean"/> 252 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.MSIE); 253 }; 254 255 /** 256 * Returns whether the hosting browser is Firefox (Gecko). 257 * @return {boolean} 258 */ 259 createjs.UserAgent.isFirefox = function() { 260 /// <returns type="boolean"/> 261 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.FIREFOX); 262 }; 263 264 /** 265 * Returns whether the hosting browser is Chrome (WebKit or Blink). 266 * @return {boolean} 267 */ 268 createjs.UserAgent.isChrome = function() { 269 /// <returns type="boolean"/> 270 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.CHROME); 271 }; 272 273 /** 274 * Returns whether the hosting browser is Safari (WebKit). 275 * @return {boolean} 276 */ 277 createjs.UserAgent.isSafari = function() { 278 /// <returns type="boolean"/> 279 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.SAFARI); 280 }; 281 282 /** 283 * Returns whether the hosting browser is a stock browser or a WebView of 284 * Android (prior to 4.4). 285 * @return {boolean} 286 */ 287 createjs.UserAgent.isAndroidBrowser = function() { 288 /// <returns type="boolean"/> 289 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.ANDROID); 290 }; 291 292 /** 293 * Returns whether the hosting browser is Microsoft Edge. 294 * @return {boolean} 295 */ 296 createjs.UserAgent.isEdge = function () { 297 /// <returns type="boolean"/> 298 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.EDGE); 299 }; 300 301 /** 302 * Returns whether the hosting browser is an unknown browser. 303 * @return {boolean} 304 */ 305 createjs.UserAgent.isUnknown = function() { 306 /// <returns type="boolean"/> 307 return createjs.UserAgent.compareAgent_(createjs.UserAgent.Type.UNKNOWN); 308 }; 309 310 /** 311 * Returns whether the host platform is Windows. 312 * @return {boolean} 313 */ 314 createjs.UserAgent.isWindows = function() { 315 /// <returns type="boolean"/> 316 return createjs.UserAgent.comparePlatform_( 317 createjs.UserAgent.Platform.WINDOWS); 318 }; 319 320 /** 321 * Returns whether the host platform is Mac OS X. 322 * @return {boolean} 323 */ 324 createjs.UserAgent.isMac = function() { 325 /// <returns type="boolean"/> 326 return createjs.UserAgent.comparePlatform_(createjs.UserAgent.Platform.MAC); 327 }; 328 329 /** 330 * Returns whether the host platform is Linux. 331 * @return {boolean} 332 */ 333 createjs.UserAgent.isLinux = function() { 334 /// <returns type="boolean"/> 335 return createjs.UserAgent.comparePlatform_(createjs.UserAgent.Platform.LINUX); 336 }; 337 338 /** 339 * Returns whether the host platform is Android. 340 * @return {boolean} 341 */ 342 createjs.UserAgent.isAndroid = function() { 343 /// <returns type="boolean"/> 344 return createjs.UserAgent.comparePlatform_( 345 createjs.UserAgent.Platform.ANDROID); 346 }; 347 348 /** 349 * Returns whether the host platform is iPhone or iPad. 350 * @return {boolean} 351 */ 352 createjs.UserAgent.isIPhone = function() { 353 /// <returns type="boolean"/> 354 return createjs.UserAgent.comparePlatform_( 355 createjs.UserAgent.Platform.IPHONE); 356 }; 357 358 /** 359 * Returns whether the host platform uses WebKit (or blink). 360 * @return {boolean} 361 */ 362 createjs.UserAgent.isWebKit = function() { 363 /// <returns type="boolean"/> 364 return createjs.UserAgent.getInstance_().isWebKit_; 365 }; 366