2013-08-28 06:02:55 +00:00
/ * *
2013-10-01 12:54:29 +00:00
* @ author Richard Davey < rich @ photonstorm . com >
2014-02-05 05:54:25 +00:00
* @ copyright 2014 Photon Storm Ltd .
2013-10-01 12:54:29 +00:00
* @ license { @ link https : //github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
* /
/ * *
2013-08-28 06:02:55 +00:00
* Detects device support capabilities . Using some elements from System . js by MrDoob and Modernizr
2013-10-01 12:54:29 +00:00
*
* @ class Phaser . Device
* @ constructor
2013-08-28 06:02:55 +00:00
* /
2014-02-25 21:16:56 +00:00
Phaser . Device = function ( game ) {
/ * *
* @ property { Phaser . Game } game - A reference to the currently running game .
* /
this . game = game ;
2013-08-28 06:02:55 +00:00
// Operating System
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } desktop - Is running desktop ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . desktop = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } iOS - Is running on iOS ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . iOS = false ;
2013-11-26 15:29:03 +00:00
/ * *
* @ property { boolean } cocoonJS - Is the game running under CocoonJS ?
* @ default
* /
this . cocoonJS = false ;
2014-08-11 16:33:06 +00:00
/ * *
* @ property { boolean } cordova - Is the game running under Apache Cordova ?
* @ default
* /
this . cordova = false ;
2014-08-21 21:37:51 +00:00
2014-08-28 02:00:14 +00:00
/ * *
* @ property { boolean } node - Is the game running under Node . js ?
* @ default
* /
this . node = false ;
2014-08-21 21:37:51 +00:00
/ * *
* @ property { boolean } nodeWebkit - Is the game running under Node - Webkit ?
* @ default
2014-08-22 00:37:27 +00:00
* /
2014-08-21 21:37:51 +00:00
this . nodeWebkit = false ;
2013-12-24 03:18:55 +00:00
/ * *
2014-04-14 15:40:14 +00:00
* @ property { boolean } ejecta - Is the game running under Ejecta ?
* @ default
* /
2013-12-24 03:18:55 +00:00
this . ejecta = false ;
2014-04-14 15:40:14 +00:00
/ * *
* @ property { boolean } crosswalk - Is the game running under the Intel Crosswalk XDK ?
* @ default
* /
this . crosswalk = false ;
2013-08-28 06:02:55 +00:00
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } android - Is running on android ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . android = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } chromeOS - Is running on chromeOS ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . chromeOS = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } linux - Is running on linux ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . linux = false ;
/ * *
2013-10-02 07:46:42 +00:00
* @ property { boolean } macOS - Is running on macOS ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . macOS = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } windows - Is running on windows ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . windows = false ;
2014-03-02 10:56:39 +00:00
/ * *
* @ property { boolean } windowsPhone - Is running on a Windows Phone ?
* @ default
* /
this . windowsPhone = false ;
2013-08-28 06:02:55 +00:00
// Features
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } canvas - Is canvas available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . canvas = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } file - Is file available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . file = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } fileSystem - Is fileSystem available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . fileSystem = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } localStorage - Is localStorage available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . localStorage = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } webGL - Is webGL available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . webGL = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } worker - Is worker available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . worker = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } touch - Is touch available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . touch = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } mspointer - Is mspointer available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . mspointer = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } css3D - Is css3D available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . css3D = false ;
2014-03-23 07:59:28 +00:00
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } pointerLock - Is Pointer Lock available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-09-09 18:59:31 +00:00
* /
this . pointerLock = false ;
2013-11-20 02:28:28 +00:00
/ * *
* @ property { boolean } typedArray - Does the browser support TypedArrays ?
* @ default
* /
this . typedArray = false ;
2013-12-13 14:04:14 +00:00
/ * *
* @ property { boolean } vibration - Does the device support the Vibration API ?
* @ default
* /
this . vibration = false ;
2014-03-18 15:11:48 +00:00
/ * *
* @ property { boolean } getUserMedia - Does the device support the getUserMedia API ?
* @ default
* /
this . getUserMedia = false ;
2014-01-08 11:21:30 +00:00
/ * *
* @ property { boolean } quirksMode - Is the browser running in strict mode ( false ) or quirks mode ? ( true )
* @ default
* /
this . quirksMode = false ;
2013-08-28 06:02:55 +00:00
// Browser
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } arora - Set to true if running in Arora .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . arora = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } chrome - Set to true if running in Chrome .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . chrome = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } epiphany - Set to true if running in Epiphany .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . epiphany = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } firefox - Set to true if running in Firefox .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . firefox = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } ie - Set to true if running in Internet Explorer .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . ie = false ;
/ * *
2014-02-10 02:23:45 +00:00
* @ property { number } ieVersion - If running in Internet Explorer this will contain the major version number . Beyond IE10 you should use Device . trident and Device . tridentVersion .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . ieVersion = 0 ;
2013-12-13 14:04:14 +00:00
/ * *
* @ property { boolean } trident - Set to true if running a Trident version of Internet Explorer ( IE11 + )
* @ default
* /
this . trident = false ;
/ * *
* @ property { number } tridentVersion - If running in Internet Explorer 11 this will contain the major version number . See http : //msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx
* @ default
* /
this . tridentVersion = 0 ;
2013-08-28 06:02:55 +00:00
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } mobileSafari - Set to true if running in Mobile Safari .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . mobileSafari = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } midori - Set to true if running in Midori .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . midori = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } opera - Set to true if running in Opera .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . opera = false ;
/ * *
2013-11-20 02:28:28 +00:00
* @ property { boolean } safari - Set to true if running in Safari .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . safari = false ;
2013-11-20 02:28:28 +00:00
/ * *
* @ property { boolean } webApp - Set to true if running as a WebApp , i . e . within a WebView
* @ default
* /
2013-08-28 06:02:55 +00:00
this . webApp = false ;
2013-12-17 05:07:00 +00:00
/ * *
* @ property { boolean } silk - Set to true if running in the Silk browser ( as used on the Amazon Kindle )
* @ default
* /
this . silk = false ;
2013-08-28 06:02:55 +00:00
// Audio
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } audioData - Are Audio tags available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . audioData = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } webAudio - Is the WebAudio API available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . webAudio = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } ogg - Can this device play ogg files ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . ogg = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } opus - Can this device play opus files ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . opus = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } mp3 - Can this device play mp3 files ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . mp3 = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } wav - Can this device play wav files ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . wav = false ;
2013-11-20 02:28:28 +00:00
2013-08-28 06:02:55 +00:00
/ * *
* Can this device play m4a files ?
2013-10-01 15:39:39 +00:00
* @ property { boolean } m4a - True if this device can play m4a files .
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . m4a = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } webm - Can this device play webm files ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . webm = false ;
// Device
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } iPhone - Is running on iPhone ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . iPhone = false ;
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } iPhone4 - Is running on iPhone4 ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . iPhone4 = false ;
2014-03-23 07:59:28 +00:00
/ * *
2013-10-01 15:39:39 +00:00
* @ property { boolean } iPad - Is running on iPad ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . iPad = false ;
/ * *
2013-10-01 12:54:29 +00:00
* @ property { number } pixelRatio - PixelRatio of the host device ?
* @ default
2013-08-28 06:02:55 +00:00
* /
this . pixelRatio = 0 ;
2013-11-18 20:27:40 +00:00
/ * *
* @ property { boolean } littleEndian - Is the device big or little endian ? ( only detected if the browser supports TypedArrays )
* @ default
* /
this . littleEndian = false ;
2014-04-24 02:49:49 +00:00
/ * *
* @ property { boolean } support32bit - Does the device context support 32 bit pixel manipulation using array buffer views ?
* @ default
* /
this . support32bit = false ;
2014-02-25 21:16:56 +00:00
/ * *
* @ property { boolean } fullscreen - Does the browser support the Full Screen API ?
* @ default
* /
this . fullscreen = false ;
/ * *
* @ property { string } requestFullscreen - If the browser supports the Full Screen API this holds the call you need to use to activate it .
* @ default
* /
this . requestFullscreen = '' ;
/ * *
* @ property { string } cancelFullscreen - If the browser supports the Full Screen API this holds the call you need to use to cancel it .
* @ default
* /
this . cancelFullscreen = '' ;
/ * *
* @ property { boolean } fullscreenKeyboard - Does the browser support access to the Keyboard during Full Screen mode ?
* @ default
* /
this . fullscreenKeyboard = false ;
2013-08-28 06:02:55 +00:00
// Run the checks
2014-07-01 18:19:49 +00:00
this . _checkOS ( ) ;
2013-08-28 06:02:55 +00:00
this . _checkAudio ( ) ;
this . _checkBrowser ( ) ;
this . _checkCSS3D ( ) ;
this . _checkDevice ( ) ;
this . _checkFeatures ( ) ;
2014-03-23 07:59:28 +00:00
2013-08-28 06:02:55 +00:00
} ;
2014-04-25 01:45:27 +00:00
Phaser . Device . LITTLE _ENDIAN = false ;
2013-08-28 06:02:55 +00:00
Phaser . Device . prototype = {
/ * *
* Check which OS is game running on .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # _checkOS
2013-08-28 06:02:55 +00:00
* @ private
* /
_checkOS : function ( ) {
var ua = navigator . userAgent ;
2014-07-31 13:40:59 +00:00
if ( /Playstation Vita/ . test ( ua ) )
{
this . vita = true ;
}
else if ( /Kindle/ . test ( ua ) || /\bKF[A-Z][A-Z]+/ . test ( ua ) || /Silk.*Mobile Safari/ . test ( ua ) )
{
this . kindle = true ;
// This will NOT detect early generations of Kindle Fire, I think there is no reliable way...
// E.g. "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true"
}
else if ( /Android/ . test ( ua ) )
2013-12-17 05:07:00 +00:00
{
2013-08-28 06:02:55 +00:00
this . android = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /CrOS/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . chromeOS = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /iP[ao]d|iPhone/i . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . iOS = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Linux/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . linux = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Mac OS/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . macOS = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Windows/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . windows = true ;
2014-03-02 10:56:39 +00:00
if ( /Windows Phone/i . test ( ua ) )
{
this . windowsPhone = true ;
}
2013-08-28 06:02:55 +00:00
}
2014-08-06 12:08:38 +00:00
if ( this . windows || this . macOS || ( this . linux && this . silk === false ) || this . chromeOS )
2013-12-17 05:07:00 +00:00
{
2013-08-28 06:02:55 +00:00
this . desktop = true ;
}
2014-03-02 10:56:39 +00:00
// Windows Phone / Table reset
if ( this . windowsPhone || ( ( /Windows NT/i . test ( ua ) ) && ( /Touch/i . test ( ua ) ) ) )
{
this . desktop = false ;
}
2013-08-28 06:02:55 +00:00
} ,
/ * *
* Check HTML5 features of the host environment .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # _checkFeatures
2013-08-28 06:02:55 +00:00
* @ private
* /
_checkFeatures : function ( ) {
2014-02-28 03:09:04 +00:00
this . canvas = ! ! window [ 'CanvasRenderingContext2D' ] || this . cocoonJS ;
2013-08-28 06:02:55 +00:00
try {
this . localStorage = ! ! localStorage . getItem ;
} catch ( error ) {
this . localStorage = false ;
}
this . file = ! ! window [ 'File' ] && ! ! window [ 'FileReader' ] && ! ! window [ 'FileList' ] && ! ! window [ 'Blob' ] ;
this . fileSystem = ! ! window [ 'requestFileSystem' ] ;
2014-07-23 14:21:06 +00:00
this . webGL = ( function ( ) { try { var canvas = document . createElement ( 'canvas' ) ; /*Force screencanvas to false*/ canvas . screencanvas = false ; return ! ! window . WebGLRenderingContext && ( canvas . getContext ( 'webgl' ) || canvas . getContext ( 'experimental-webgl' ) ) ; } catch ( e ) { return false ; } } ) ( ) ;
2013-10-23 14:13:21 +00:00
2013-10-26 18:14:13 +00:00
if ( this . webGL === null || this . webGL === false )
2013-10-23 14:13:21 +00:00
{
this . webGL = false ;
}
else
{
this . webGL = true ;
}
2013-08-28 06:02:55 +00:00
this . worker = ! ! window [ 'Worker' ] ;
2014-03-23 07:59:28 +00:00
2013-12-17 05:07:00 +00:00
if ( 'ontouchstart' in document . documentElement || ( window . navigator . maxTouchPoints && window . navigator . maxTouchPoints > 1 ) )
{
2013-08-28 06:02:55 +00:00
this . touch = true ;
}
2013-12-17 05:07:00 +00:00
if ( window . navigator . msPointerEnabled || window . navigator . pointerEnabled )
{
2013-08-28 06:02:55 +00:00
this . mspointer = true ;
}
2014-03-23 07:59:28 +00:00
2013-09-09 18:59:31 +00:00
this . pointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document ;
2013-08-28 06:02:55 +00:00
2014-01-08 11:21:30 +00:00
this . quirksMode = ( document . compatMode === 'CSS1Compat' ) ? false : true ;
2014-03-18 15:11:48 +00:00
this . getUserMedia = ! ! ( navigator . getUserMedia || navigator . webkitGetUserMedia || navigator . mozGetUserMedia || navigator . msGetUserMedia ) ;
2014-02-25 21:16:56 +00:00
} ,
/ * *
* Checks for support of the Full Screen API .
*
* @ method Phaser . Device # checkFullScreenSupport
* /
checkFullScreenSupport : function ( ) {
var fs = [
'requestFullscreen' ,
'requestFullScreen' ,
'webkitRequestFullscreen' ,
'webkitRequestFullScreen' ,
'msRequestFullscreen' ,
'msRequestFullScreen' ,
'mozRequestFullScreen' ,
'mozRequestFullscreen'
] ;
for ( var i = 0 ; i < fs . length ; i ++ )
{
if ( this . game . canvas [ fs [ i ] ] )
2014-07-01 15:50:33 +00:00
// if (document[fs[i]])
2014-02-25 21:16:56 +00:00
{
this . fullscreen = true ;
this . requestFullscreen = fs [ i ] ;
2014-07-01 15:50:33 +00:00
break ;
2014-02-25 21:16:56 +00:00
}
}
var cfs = [
'cancelFullScreen' ,
'exitFullscreen' ,
'webkitCancelFullScreen' ,
'webkitExitFullscreen' ,
'msCancelFullScreen' ,
'msExitFullscreen' ,
'mozCancelFullScreen' ,
'mozExitFullscreen'
] ;
if ( this . fullscreen )
{
for ( var i = 0 ; i < cfs . length ; i ++ )
{
2014-07-01 14:45:38 +00:00
if ( document [ cfs [ i ] ] )
2014-02-25 21:16:56 +00:00
{
this . cancelFullscreen = cfs [ i ] ;
2014-07-01 15:50:33 +00:00
break ;
2014-02-25 21:16:56 +00:00
}
}
}
// Keyboard Input?
if ( window [ 'Element' ] && Element [ 'ALLOW_KEYBOARD_INPUT' ] )
{
this . fullscreenKeyboard = true ;
}
2013-08-28 06:02:55 +00:00
} ,
/ * *
* Check what browser is game running in .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # _checkBrowser
2013-08-28 06:02:55 +00:00
* @ private
* /
_checkBrowser : function ( ) {
var ua = navigator . userAgent ;
2013-12-17 05:07:00 +00:00
if ( /Arora/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . arora = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Chrome/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . chrome = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Epiphany/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . epiphany = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Firefox/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . firefox = true ;
2013-12-17 05:07:00 +00:00
}
2014-07-01 18:19:49 +00:00
else if ( /AppleWebKit/ . test ( ua ) && this . iOS )
2013-12-17 05:07:00 +00:00
{
2013-08-28 06:02:55 +00:00
this . mobileSafari = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /MSIE (\d+\.\d+);/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . ie = true ;
2013-11-25 04:40:04 +00:00
this . ieVersion = parseInt ( RegExp . $1 , 10 ) ;
2013-12-17 05:07:00 +00:00
}
else if ( /Midori/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . midori = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Opera/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . opera = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Safari/ . test ( ua ) )
{
2013-08-28 06:02:55 +00:00
this . safari = true ;
2013-12-17 05:07:00 +00:00
}
2014-03-16 00:39:42 +00:00
else if ( /Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/ . test ( ua ) )
2013-12-17 05:07:00 +00:00
{
2013-12-13 14:04:14 +00:00
this . ie = true ;
this . trident = true ;
this . tridentVersion = parseInt ( RegExp . $1 , 10 ) ;
2014-03-16 00:39:42 +00:00
this . ieVersion = parseInt ( RegExp . $3 , 10 ) ;
2013-08-28 06:02:55 +00:00
}
2014-05-08 04:28:27 +00:00
//Silk gets its own if clause because its ua also contains 'Safari'
if ( /Silk/ . test ( ua ) )
{
this . silk = true ;
}
2013-08-28 06:02:55 +00:00
// WebApp mode in iOS
2013-12-17 05:07:00 +00:00
if ( navigator [ 'standalone' ] )
{
2013-08-28 06:02:55 +00:00
this . webApp = true ;
}
2014-08-11 16:33:06 +00:00
if ( typeof window . cordova !== "undefined" )
{
this . cordova = true ;
}
2014-08-21 21:37:51 +00:00
if ( typeof process !== "undefined" && typeof require !== "undefined" )
{
2014-08-28 02:00:14 +00:00
this . node = true ;
}
if ( this . node )
{
try {
this . nodeWebkit = ( typeof require ( 'nw.gui' ) !== "undefined" ) ;
} catch ( error ) {
this . nodeWebkit = false ;
}
2014-08-21 21:37:51 +00:00
}
2013-12-17 05:07:00 +00:00
if ( navigator [ 'isCocoonJS' ] )
{
2013-11-26 15:29:03 +00:00
this . cocoonJS = true ;
}
2013-12-24 03:18:55 +00:00
if ( typeof window . ejecta !== "undefined" )
{
this . ejecta = true ;
}
2014-04-14 15:40:14 +00:00
if ( /Crosswalk/ . test ( ua ) )
{
this . crosswalk = true ;
}
2013-08-28 06:02:55 +00:00
} ,
/ * *
* Check audio support .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # _checkAudio
2013-08-28 06:02:55 +00:00
* @ private
* /
_checkAudio : function ( ) {
this . audioData = ! ! ( window [ 'Audio' ] ) ;
this . webAudio = ! ! ( window [ 'webkitAudioContext' ] || window [ 'AudioContext' ] ) ;
var audioElement = document . createElement ( 'audio' ) ;
var result = false ;
try {
if ( result = ! ! audioElement . canPlayType ) {
2014-03-23 07:59:28 +00:00
2013-08-28 06:02:55 +00:00
if ( audioElement . canPlayType ( 'audio/ogg; codecs="vorbis"' ) . replace ( /^no$/ , '' ) ) {
this . ogg = true ;
}
if ( audioElement . canPlayType ( 'audio/ogg; codecs="opus"' ) . replace ( /^no$/ , '' ) ) {
this . opus = true ;
}
if ( audioElement . canPlayType ( 'audio/mpeg;' ) . replace ( /^no$/ , '' ) ) {
this . mp3 = true ;
}
// Mimetypes accepted:
// developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
// bit.ly/iphoneoscodecs
if ( audioElement . canPlayType ( 'audio/wav; codecs="1"' ) . replace ( /^no$/ , '' ) ) {
this . wav = true ;
}
if ( audioElement . canPlayType ( 'audio/x-m4a;' ) || audioElement . canPlayType ( 'audio/aac;' ) . replace ( /^no$/ , '' ) ) {
this . m4a = true ;
}
if ( audioElement . canPlayType ( 'audio/webm; codecs="vorbis"' ) . replace ( /^no$/ , '' ) ) {
this . webm = true ;
}
}
} catch ( e ) {
}
} ,
/ * *
2014-04-23 22:35:36 +00:00
* Check PixelRatio , iOS device , Vibration API , ArrayBuffers and endianess .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # _checkDevice
2013-08-28 06:02:55 +00:00
* @ private
* /
_checkDevice : function ( ) {
this . pixelRatio = window [ 'devicePixelRatio' ] || 1 ;
this . iPhone = navigator . userAgent . toLowerCase ( ) . indexOf ( 'iphone' ) != - 1 ;
this . iPhone4 = ( this . pixelRatio == 2 && this . iPhone ) ;
this . iPad = navigator . userAgent . toLowerCase ( ) . indexOf ( 'ipad' ) != - 1 ;
2013-11-18 20:27:40 +00:00
if ( typeof Int8Array !== 'undefined' )
{
2013-11-20 02:28:28 +00:00
this . typedArray = true ;
}
else
{
this . typedArray = false ;
2013-11-18 20:27:40 +00:00
}
2014-04-23 22:35:36 +00:00
if ( typeof ArrayBuffer !== 'undefined' && typeof Uint8Array !== 'undefined' && typeof Uint32Array !== 'undefined' )
{
this . littleEndian = this . _checkIsLittleEndian ( ) ;
2014-04-25 01:45:27 +00:00
Phaser . Device . LITTLE _ENDIAN = this . littleEndian ;
2014-04-23 22:35:36 +00:00
}
2014-04-24 02:49:49 +00:00
this . support32bit = ( typeof ArrayBuffer !== "undefined" && typeof Uint8ClampedArray !== "undefined" && typeof Int32Array !== "undefined" && this . littleEndian !== null && this . _checkIsUint8ClampedImageData ( ) ) ;
2013-12-13 14:04:14 +00:00
navigator . vibrate = navigator . vibrate || navigator . webkitVibrate || navigator . mozVibrate || navigator . msVibrate ;
2014-03-23 07:59:28 +00:00
2013-12-13 14:04:14 +00:00
if ( navigator . vibrate )
{
this . vibration = true ;
}
2013-08-28 06:02:55 +00:00
} ,
2014-04-23 22:35:36 +00:00
/ * *
* Check Little or Big Endian system .
* @ author Matt DesLauriers ( @ mattdesl )
* @ method Phaser . Device # _checkIsLittleEndian
* @ private
* /
_checkIsLittleEndian : function ( ) {
var a = new ArrayBuffer ( 4 ) ;
var b = new Uint8Array ( a ) ;
var c = new Uint32Array ( a ) ;
b [ 0 ] = 0xa1 ;
b [ 1 ] = 0xb2 ;
b [ 2 ] = 0xc3 ;
b [ 3 ] = 0xd4 ;
if ( c [ 0 ] == 0xd4c3b2a1 )
{
return true ;
}
if ( c [ 0 ] == 0xa1b2c3d4 )
{
return false ;
}
else
{
// Could not determine endianness
return null ;
}
} ,
2014-04-24 02:49:49 +00:00
/ * *
* Test to see if ImageData uses CanvasPixelArray or Uint8ClampedArray .
* @ author Matt DesLauriers ( @ mattdesl )
* @ method Phaser . Device # _checkIsUint8ClampedImageData
* @ private
* /
_checkIsUint8ClampedImageData : function ( ) {
if ( typeof Uint8ClampedArray === "undefined" )
{
return false ;
}
var elem = document . createElement ( 'canvas' ) ;
var ctx = elem . getContext ( '2d' ) ;
if ( ! ctx )
{
return false ;
}
var image = ctx . createImageData ( 1 , 1 ) ;
2014-07-23 14:21:06 +00:00
2014-04-24 02:49:49 +00:00
return image . data instanceof Uint8ClampedArray ;
} ,
2013-08-28 06:02:55 +00:00
/ * *
* Check whether the host environment support 3 D CSS .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # _checkCSS3D
2013-08-28 06:02:55 +00:00
* @ private
* /
_checkCSS3D : function ( ) {
2013-10-03 00:21:08 +00:00
2013-08-28 06:02:55 +00:00
var el = document . createElement ( 'p' ) ;
var has3d ;
var transforms = {
'webkitTransform' : '-webkit-transform' ,
'OTransform' : '-o-transform' ,
'msTransform' : '-ms-transform' ,
'MozTransform' : '-moz-transform' ,
'transform' : 'transform'
} ;
2013-10-03 00:21:08 +00:00
2013-08-28 06:02:55 +00:00
// Add it to the body to get the computed style.
document . body . insertBefore ( el , null ) ;
2013-12-17 05:07:00 +00:00
for ( var t in transforms )
{
if ( el . style [ t ] !== undefined )
{
2013-08-28 06:02:55 +00:00
el . style [ t ] = "translate3d(1px,1px,1px)" ;
has3d = window . getComputedStyle ( el ) . getPropertyValue ( transforms [ t ] ) ;
}
}
2014-03-23 07:59:28 +00:00
2013-08-28 06:02:55 +00:00
document . body . removeChild ( el ) ;
this . css3D = ( has3d !== undefined && has3d . length > 0 && has3d !== "none" ) ;
} ,
2013-10-01 12:54:29 +00:00
/ * *
* Check whether the host environment can play audio .
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # canPlayAudio
2013-10-01 12:54:29 +00:00
* @ param { string } type - One of 'mp3, ' ogg ', ' m4a ', ' wav ', ' webm ' .
2013-10-03 00:21:08 +00:00
* @ return { boolean } True if the given file type is supported by the browser , otherwise false .
2013-10-01 12:54:29 +00:00
* /
2013-08-28 06:02:55 +00:00
canPlayAudio : function ( type ) {
2013-10-03 00:21:08 +00:00
if ( type == 'mp3' && this . mp3 )
{
2013-08-28 06:02:55 +00:00
return true ;
2013-10-03 00:21:08 +00:00
}
else if ( type == 'ogg' && ( this . ogg || this . opus ) )
{
2013-08-28 06:02:55 +00:00
return true ;
2013-10-03 00:21:08 +00:00
}
else if ( type == 'm4a' && this . m4a )
{
2013-08-28 06:02:55 +00:00
return true ;
2013-10-03 00:21:08 +00:00
}
else if ( type == 'wav' && this . wav )
{
2013-08-28 06:02:55 +00:00
return true ;
2013-10-03 00:21:08 +00:00
}
else if ( type == 'webm' && this . webm )
{
2013-08-28 06:02:55 +00:00
return true ;
}
return false ;
} ,
2013-10-01 12:54:29 +00:00
/ * *
* Check whether the console is open .
2014-03-17 19:39:56 +00:00
* Note that this only works in Firefox with Firebug and earlier versions of Chrome .
* It used to work in Chrome , but then they removed the ability : http : //src.chromium.org/viewvc/blink?view=revision&revision=151136
2014-07-23 14:21:06 +00:00
*
2013-10-03 00:21:08 +00:00
* @ method Phaser . Device # isConsoleOpen
* @ return { boolean } True if the browser dev console is open .
2013-10-01 12:54:29 +00:00
* /
2013-08-28 06:02:55 +00:00
isConsoleOpen : function ( ) {
2013-10-03 00:21:08 +00:00
if ( window . console && window . console [ 'firebug' ] )
{
2013-08-28 06:02:55 +00:00
return true ;
}
2013-10-03 00:21:08 +00:00
if ( window . console )
{
2013-08-28 06:02:55 +00:00
console . profile ( ) ;
console . profileEnd ( ) ;
2013-10-03 00:21:08 +00:00
if ( console . clear )
{
2013-08-28 06:02:55 +00:00
console . clear ( ) ;
}
2014-03-17 19:39:56 +00:00
if ( console [ 'profiles' ] )
{
return console [ 'profiles' ] . length > 0 ;
}
2013-08-28 06:02:55 +00:00
}
return false ;
}
} ;
2013-12-30 16:54:00 +00:00
Phaser . Device . prototype . constructor = Phaser . Device ;
2014-07-10 16:00:29 +00:00
/ * *
* A class - static function to check wether we ’ re running on an Android Stock browser .
* Autors might want to scale down on effects and switch to the CANVAS rendering method on those devices .
* Usage : var defaultRenderingMode = Phaser . Device . isAndroidStockBrowser ( ) ? Phaser . CANVAS : Phaser . AUTO ;
*
* @ function Phaser . Device # isAndroidStockBrowser
* /
Phaser . Device . isAndroidStockBrowser = function ( )
{
var matches = window . navigator . userAgent . match ( /Android.*AppleWebKit\/([\d.]+)/ ) ;
return matches && matches [ 1 ] < 537 ;
} ;