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