2013-08-28 06:02:55 +00:00
/ * *
2013-10-01 12:54:29 +00:00
* @ author Richard Davey < rich @ photonstorm . com >
2016-04-04 21:15:01 +00:00
* @ copyright 2016 Photon Storm Ltd .
2013-10-01 12:54:29 +00:00
* @ license { @ link https : //github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
* /
/ * *
2014-11-14 02:06:45 +00:00
* @ classdesc
2016-05-11 15:37:01 +00:00
* Detects device support capabilities and is responsible for device initialization - see { @ link Phaser . Device . whenReady whenReady } .
2013-10-01 12:54:29 +00:00
*
2014-11-14 02:06:45 +00:00
* This class represents a singleton object that can be accessed directly as ` game.device `
* ( or , as a fallback , ` Phaser.Device ` when a game instance is not available ) without the need to instantiate it .
*
* Unless otherwise noted the device capabilities are only guaranteed after initialization . Initialization
* occurs automatically and is guaranteed complete before { @ link Phaser . Game } begins its "boot" phase .
* Feature detection can be modified in the { @ link Phaser . Device . onInitialized onInitialized } signal .
*
* When checking features using the exposed properties only the * truth - iness * of the value should be relied upon
* unless the documentation states otherwise : properties may return ` false ` , ` '' ` , ` null ` , or even ` undefined `
* when indicating the lack of a feature .
*
* Uses elements from System . js by MrDoob and Modernizr
*
* @ description
* It is not possible to instantiate the Device class manually .
*
* @ class
* @ protected
2013-08-28 06:02:55 +00:00
* /
2014-11-14 02:06:45 +00:00
Phaser . Device = function ( ) {
2014-02-25 21:16:56 +00:00
/ * *
2014-11-14 02:06:45 +00:00
* The time the device became ready .
* @ property { integer } deviceReadyAt
* @ protected
2014-02-25 21:16:56 +00:00
* /
2014-11-14 02:06:45 +00:00
this . deviceReadyAt = 0 ;
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
/ * *
* The time as which initialization has completed .
* @ property { boolean } initialized
* @ protected
* /
this . initialized = false ;
// Browser / Host / Operating System
2013-08-28 06:02:55 +00:00
/ * *
2014-11-14 02:06:45 +00:00
* @ property { boolean } desktop - Is running on a 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 ;
2015-09-22 10:46:20 +00:00
/ * *
* @ property { number } iOSVersion - If running in iOS this will contain the major version number .
* @ default
* /
this . iOSVersion = 0 ;
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
2014-08-30 00:58:19 +00:00
/ * *
* @ property { boolean } cocoonJSApp - Is this game running with CocoonJS . App ?
* @ default
* /
this . cocoonJSApp = 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 ;
2015-06-12 04:24:06 +00:00
/ * *
* @ property { boolean } electron - Is the game running under GitHub Electron ?
* @ default
* /
this . electron = 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 ;
2014-12-31 17:04:55 +00:00
/ * *
* @ property { ? boolean } canvasBitBltShift - True if canvas supports a 'copy' bitblt onto itself when the source and destination regions overlap .
* @ default
* /
this . canvasBitBltShift = null ;
2016-09-28 12:39:30 +00:00
/ * *
* If the browser isn ' t capable of handling tinting with alpha this will be false .
* @ property { boolean } canHandleAlpha
* @ default
* /
this . canHandleAlpha = false ;
/ * *
* Whether or not the Canvas BlendModes are supported , consequently the ability to tint using the multiply method .
* @ property { boolean } canUseMultiply
* @ default
* /
this . canUseMultiply = false ;
2014-12-31 17:04:55 +00:00
/ * *
* @ property { boolean } webGL - Is webGL available ?
* @ default
* /
this . webGL = false ;
2013-08-28 06:02:55 +00:00
/ * *
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 } worker - Is worker available ?
2013-10-01 12:54:29 +00:00
* @ default
2013-08-28 06:02:55 +00:00
* /
this . worker = 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
* /
2015-05-14 22:20:52 +00:00
this . getUserMedia = true ;
2014-03-18 15:11:48 +00:00
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 ;
2014-11-12 21:24:03 +00:00
// Input
/ * *
* @ property { boolean } touch - Is touch available ?
* @ default
* /
this . touch = false ;
/ * *
* @ property { boolean } mspointer - Is mspointer available ?
* @ default
* /
this . mspointer = false ;
/ * *
2014-12-31 17:04:55 +00:00
* @ property { ? string } wheelType - The newest type of Wheel / Scroll event supported : 'wheel' , 'mousewheel' , 'DOMMouseScroll'
2014-11-12 21:24:03 +00:00
* @ default
* @ protected
* /
this . wheelEvent = null ;
2013-08-28 06:02:55 +00:00
// Browser
/ * *
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 ;
2015-06-16 13:15:48 +00:00
/ * *
* @ property { number } chromeVersion - If running in Chrome this will contain the major version number .
* @ default
* /
this . chromeVersion = 0 ;
2013-08-28 06:02:55 +00:00
/ * *
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 ;
2015-05-18 13:51:25 +00:00
/ * *
* @ property { number } firefoxVersion - If running in Firefox this will contain the major version number .
* @ default
* /
this . firefoxVersion = 0 ;
2013-08-28 06:02:55 +00:00
/ * *
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 ;
/ * *
2014-11-14 02:06:45 +00:00
* @ property { number } tridentVersion - If running in Internet Explorer 11 this will contain the major version number . See { @ link http : //msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx}
2013-12-13 14:04:14 +00:00
* @ default
* /
this . tridentVersion = 0 ;
2016-02-09 13:17:14 +00:00
/ * *
* @ property { boolean } edge - Set to true if running in Microsoft Edge browser .
* @ default
* /
this . edge = false ;
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 } 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
2016-02-09 13:17:14 +00:00
/ * *
* @ property { number } safariVersion - If running in Safari this will contain the major version number .
* @ default
* /
this . safariVersion = 0 ;
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 ;
2016-02-09 13:17:14 +00:00
/ * *
* @ property { boolean } dolby - Can this device play EC - 3 Dolby Digital Plus files ?
* @ default
* /
this . dolby = false ;
2015-05-03 12:30:10 +00:00
// Video
/ * *
* @ property { boolean } oggVideo - Can this device play ogg video files ?
* @ default
* /
this . oggVideo = false ;
/ * *
* @ property { boolean } h264Video - Can this device play h264 mp4 video files ?
* @ default
* /
this . h264Video = false ;
/ * *
* @ property { boolean } mp4Video - Can this device play h264 mp4 video files ?
* @ default
* /
this . mp4Video = false ;
/ * *
* @ property { boolean } webmVideo - Can this device play webm video files ?
* @ default
* /
this . webmVideo = false ;
/ * *
* @ property { boolean } vp9Video - Can this device play vp9 video files ?
* @ default
* /
this . vp9Video = false ;
/ * *
* @ property { boolean } hlsVideo - Can this device play hls video files ?
* @ default
* /
this . hlsVideo = false ;
2013-08-28 06:02:55 +00:00
// 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 ;
2014-12-31 17:04:55 +00:00
// Device features
2013-08-28 06:02:55 +00:00
/ * *
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
/ * *
2016-09-29 02:09:49 +00:00
* @ property { boolean } LITTLE _ENDIAN - Is the device big or little endian ? ( only detected if the browser supports TypedArrays )
2014-11-14 02:06:45 +00:00
* @ default
* /
this . LITTLE _ENDIAN = 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 ;
2014-11-14 02:06:45 +00:00
} ;
// Device is really a singleton/static entity; instantiate it
// and add new methods directly sans-prototype.
Phaser . Device = new Phaser . Device ( ) ;
/ * *
* This signal is dispatched after device initialization occurs but before any of the ready
* callbacks ( see { @ link Phaser . Device . whenReady whenReady } ) have been invoked .
*
* Local "patching" for a particular device can / should be done in this event .
*
* _Note _ : This signal is removed after the device has been readied ; if a handler has not been
* added _before _ ` new Phaser.Game(..) ` it is probably too late .
*
* @ type { ? Phaser . Signal }
* @ static
* /
Phaser . Device . onInitialized = new Phaser . Signal ( ) ;
/ * *
* Add a device - ready handler and ensure the device ready sequence is started .
*
* Phaser . Device will _not _ activate or initialize until at least one ` whenReady ` handler is added ,
* which is normally done automatically be calling ` new Phaser.Game(..) ` .
*
* The handler is invoked when the device is considered "ready" , which may be immediately
* if the device is already "ready" . See { @ link Phaser . Device # deviceReadyAt deviceReadyAt } .
*
* @ method
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
* @ param { function } handler - Callback to invoke when the device is ready . It is invoked with the given context the Phaser . Device object is supplied as the first argument .
2014-11-14 02:06:45 +00:00
* @ param { object } [ context ] - Context in which to invoke the handler
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
* @ param { boolean } [ nonPrimer = false ] - If true the device ready check will not be started .
2014-11-14 02:06:45 +00:00
* /
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
Phaser . Device . whenReady = function ( callback , context , nonPrimer ) {
2014-11-14 02:06:45 +00:00
var readyCheck = this . _readyCheck ;
if ( this . deviceReadyAt || ! readyCheck )
{
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
callback . call ( context , this ) ;
2014-11-14 02:06:45 +00:00
}
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
else if ( readyCheck . _monitor || nonPrimer )
2014-11-14 02:06:45 +00:00
{
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
readyCheck . _queue = readyCheck . _queue || [ ] ;
2014-11-14 02:06:45 +00:00
readyCheck . _queue . push ( [ callback , context ] ) ;
}
else
{
readyCheck . _monitor = readyCheck . bind ( this ) ;
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
readyCheck . _queue = readyCheck . _queue || [ ] ;
2014-11-14 02:06:45 +00:00
readyCheck . _queue . push ( [ callback , context ] ) ;
var cordova = typeof window . cordova !== 'undefined' ;
var cocoonJS = navigator [ 'isCocoonJS' ] ;
if ( document . readyState === 'complete' || document . readyState === 'interactive' )
{
// Why is there an additional timeout here?
window . setTimeout ( readyCheck . _monitor , 0 ) ;
}
else if ( cordova && ! cocoonJS )
{
// Ref. http://docs.phonegap.com/en/3.5.0/cordova_events_events.md.html#deviceready
// Cordova, but NOT Cocoon?
document . addEventListener ( 'deviceready' , readyCheck . _monitor , false ) ;
}
else
{
document . addEventListener ( 'DOMContentLoaded' , readyCheck . _monitor , false ) ;
window . addEventListener ( 'load' , readyCheck . _monitor , false ) ;
}
}
2014-03-23 07:59:28 +00:00
2013-08-28 06:02:55 +00:00
} ;
2014-11-14 02:06:45 +00:00
/ * *
* Internal method used for checking when the device is ready .
* This function is removed from Phaser . Device when the device becomes ready .
*
* @ method
* @ private
* /
Phaser . Device . _readyCheck = function ( ) {
var readyCheck = this . _readyCheck ;
if ( ! document . body )
{
window . setTimeout ( readyCheck . _monitor , 20 ) ;
}
else if ( ! this . deviceReadyAt )
{
this . deviceReadyAt = Date . now ( ) ;
document . removeEventListener ( 'deviceready' , readyCheck . _monitor ) ;
document . removeEventListener ( 'DOMContentLoaded' , readyCheck . _monitor ) ;
window . removeEventListener ( 'load' , readyCheck . _monitor ) ;
this . _initialize ( ) ;
this . initialized = true ;
2014-04-25 01:45:27 +00:00
2014-11-14 02:06:45 +00:00
this . onInitialized . dispatch ( this ) ;
var item ;
while ( ( item = readyCheck . _queue . shift ( ) ) )
{
var callback = item [ 0 ] ;
var context = item [ 1 ] ;
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
callback . call ( context , this ) ;
2014-11-14 02:06:45 +00:00
}
// Remove no longer useful methods and properties.
this . _readyCheck = null ;
this . _initialize = null ;
this . onInitialized = null ;
}
} ;
/ * *
* Internal method to initialize the capability checks .
* This function is removed from Phaser . Device once the device is initialized .
*
* @ method
* @ private
* /
Phaser . Device . _initialize = function ( ) {
var device = this ;
2013-08-28 06:02:55 +00:00
/ * *
* Check which OS is game running on .
* /
2014-11-14 02:06:45 +00:00
function _checkOS ( ) {
2013-08-28 06:02:55 +00:00
var ua = navigator . userAgent ;
2014-07-31 13:40:59 +00:00
if ( /Playstation Vita/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . vita = true ;
2014-07-31 13:40:59 +00:00
}
else if ( /Kindle/ . test ( ua ) || /\bKF[A-Z][A-Z]+/ . test ( ua ) || /Silk.*Mobile Safari/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . kindle = true ;
2014-07-31 13:40:59 +00:00
// 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
{
2014-11-14 02:06:45 +00:00
device . android = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /CrOS/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . chromeOS = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /iP[ao]d|iPhone/i . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . iOS = true ;
2015-09-22 11:07:14 +00:00
( navigator . appVersion ) . match ( /OS (\d+)/ ) ;
2015-09-22 10:46:20 +00:00
device . iOSVersion = parseInt ( RegExp . $1 , 10 ) ;
2013-12-17 05:07:00 +00:00
}
else if ( /Linux/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . linux = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Mac OS/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . macOS = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /Windows/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . windows = true ;
2015-07-08 14:22:32 +00:00
}
2014-03-02 10:56:39 +00:00
2015-07-08 14:22:32 +00:00
if ( /Windows Phone/i . test ( ua ) || /IEMobile/i . test ( ua ) )
{
device . android = false ;
device . iOS = false ;
device . macOS = false ;
device . windows = true ;
device . windowsPhone = true ;
2013-08-28 06:02:55 +00:00
}
ScaleManager + DOM
"Final" changes for a solid 2.2-worthy ScaleManager.
This adds in official support for USER_SCALE, which allows a flexible way
to control the scaling dynamically.
It fixes a visible display bug in desktop browsers (viewport clipping was
off) and mitigates some potential issues all around by using a unified
visualBound calculations in Phaser.DOM.
It applies some protected/deprecated attributes, but does not remove any
behavior of already-established (as in, outside-dev) means.
There are no known [signficant] breaking changes; any known breaks (not
considered fixes) are constrained to dev with no known consumers.
Phaser.DOM
There are no known significant breaking changes; Phaser.DOM was
internal.
- Added visualBounds; this should be the true visual area, minus the
scrollbars. This should be used instead of clientWidth/clientHeight to
detect the visual viewport.
- Expose various viewport sizes as dynamically updated properties on
Rectangle objects. These are visualBounds, layoutBounds,
documentBounds.
- Updated documentation the different bounds; in particular drawing
distinction between viewport/layout bounds and visual bounds.
- Renamed `inViewport` to `inLayoutViewport` to indidcate behavior.
- Minor breaking, but dev-only
- Changed `getAspectRatio` to work on Visual viewport. This will yield
the expected behavior on mobiles.
- Minor breaking, but dev-only
- Removed some quirks-mode and legacy-browser special casing
Phaser.ScaleManager
There are no known significant breaking changes.
- USER_SCALE is 'made public'. It can used to flexibly configure any
custom-yet-dynamic scaling requirements; it should now be able to
replace any sane usage of manual sizing invoking the deprecated
setSize/setScreenSize.
- Added additional usage documentation and links to such
- Added the ability to specify a post-scale trim factor.
- Change the arguments the resize callback and document what is passed
- Minor breaking, but the previous arguments were undocumented
- `compatiblity.showAllCanExpand` renamed to `canExpandParent` and made
generalized over possibly-expanding scaling.
- Minor breaking, dev-only, for coding changing this settin
- Switched from direct usage of of window innerWidth/Heigth to
Phaser.DOM visualViewport - this change correctly accounts for
scrollbars in desktop environments
- Although it does slightly alter the behavior, this is a fix.
- Removed usage of window outerWidth/outerHeight which didn't make much
sense where it was used for desktops and was catostrophic for mobile
browser
- Although it may slightly alter the behavior, this is a fix.
- Removed `aspect` and `elementBounds` because they are duplicative of
Phaser.DOM (which can not be accessed as `scale.dom`).
- Minor breaking, but internal methods on dev-only
- Marked the minWidth/maxWidth/minHeight/maxHeight properties as
protected. They are not removed/obsoleted, but should be revised later
for more flexibility.
- Orientation handling; non-breaking forward deprecations
- Added `onOrientationChange` and deprecated the 4 separate leave,
enter, landscape and portrait signals. They are not removed, so this
is a future-migration change.
- Fixed issue where state not updated prior to callback
- Fixed issue where orientation callbacks were not always delayed
- Fullscreen events: non-breaking forward deprecations
- Added `onFullScreenChange` and deprecated `enterFullScreen` and
`leaveFullScreen`.
- Renamed (with proxy) `fullScreenFailed` to `onFullScreenError`.
Phaser.Device
- Improved `whenReady` to support Phaser.DOM better
- Allows a ready handler to be added without starting the
device-detection proccess. This allows it to be registered to
internally (eg. from System.DOM) without affecting current behavior.
- Passes the device object as the first parameter to the callback
function.
- Fixed code where Silk detection not applied to `desktop` detection.
Manifest: System.Device moved before System.DOM
2014-11-16 09:00:54 +00:00
var silk = /Silk/ . test ( ua ) ; // detected in browsers
if ( device . windows || device . macOS || ( device . linux && ! silk ) || device . chromeOS )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . desktop = true ;
2013-08-28 06:02:55 +00:00
}
2014-03-02 10:56:39 +00:00
// Windows Phone / Table reset
2014-11-14 02:06:45 +00:00
if ( device . windowsPhone || ( ( /Windows NT/i . test ( ua ) ) && ( /Touch/i . test ( ua ) ) ) )
2014-03-02 10:56:39 +00:00
{
2014-11-14 02:06:45 +00:00
device . desktop = false ;
2014-03-02 10:56:39 +00:00
}
2014-11-14 02:06:45 +00:00
}
2013-08-28 06:02:55 +00:00
2016-09-28 12:39:30 +00:00
/ * *
* Checks if the browser correctly supports putImageData alpha channels .
* If the browser isn ' t capable of handling tinting with alpha , ` Device.canHandleAlpha ` will be false .
* Also checks whether the Canvas BlendModes are supported by the current browser for drawImage .
* /
function _checkCanvasFeatures ( ) {
var canvas = Phaser . CanvasPool . create ( this , 6 , 1 ) ;
var context = canvas . getContext ( '2d' ) ;
context . fillStyle = 'rgba(10, 20, 30, 0.5)' ;
// Draw a single pixel
context . fillRect ( 0 , 0 , 1 , 1 ) ;
// Get the color values
var s1 = context . getImageData ( 0 , 0 , 1 , 1 ) ;
if ( s1 )
{
// Plot them to x2
context . putImageData ( s1 , 1 , 0 ) ;
// Get those values
var s2 = context . getImageData ( 1 , 0 , 1 , 1 ) ;
// Compare and set
device . canHandleAlpha = (
s2 . data [ 0 ] === s1 . data [ 0 ] &&
s2 . data [ 1 ] === s1 . data [ 1 ] &&
s2 . data [ 2 ] === s1 . data [ 2 ] &&
s2 . data [ 3 ] === s1 . data [ 3 ]
) ;
}
// Checks whether the Canvas BlendModes are supported by the current browser for drawImage.
var pngHead = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/' ;
var pngEnd = 'AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==' ;
var magenta = new Image ( ) ;
magenta . src = pngHead + 'AP804Oa6' + pngEnd ;
var yellow = new Image ( ) ;
yellow . src = pngHead + '/wCKxvRF' + pngEnd ;
context . clearRect ( 0 , 0 , 6 , 1 ) ;
context . globalCompositeOperation = 'multiply' ;
context . drawImage ( magenta , 0 , 0 ) ;
context . drawImage ( yellow , 2 , 0 ) ;
if ( context . getImageData ( 2 , 0 , 1 , 1 ) )
{
var data = context . getImageData ( 2 , 0 , 1 , 1 ) . data ;
device . canUseMultiply = ( data [ 0 ] === 255 && data [ 1 ] === 0 && data [ 2 ] === 0 ) ;
}
Phaser . CanvasPool . removeByCanvas ( canvas ) ;
}
2013-08-28 06:02:55 +00:00
/ * *
* Check HTML5 features of the host environment .
* /
2014-11-14 02:06:45 +00:00
function _checkFeatures ( ) {
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
device . canvas = ! ! window [ 'CanvasRenderingContext2D' ] || device . cocoonJS ;
2013-08-28 06:02:55 +00:00
try {
2014-11-14 02:06:45 +00:00
device . localStorage = ! ! localStorage . getItem ;
2013-08-28 06:02:55 +00:00
} catch ( error ) {
2014-11-14 02:06:45 +00:00
device . localStorage = false ;
2013-08-28 06:02:55 +00:00
}
2014-11-14 02:06:45 +00:00
device . file = ! ! window [ 'File' ] && ! ! window [ 'FileReader' ] && ! ! window [ 'FileList' ] && ! ! window [ 'Blob' ] ;
device . fileSystem = ! ! window [ 'requestFileSystem' ] ;
2013-10-23 14:13:21 +00:00
2014-12-31 17:04:55 +00:00
device . 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 ; } } ) ( ) ;
device . webGL = ! ! device . webGL ;
2013-10-23 14:13:21 +00:00
2014-11-14 02:06:45 +00:00
device . worker = ! ! window [ 'Worker' ] ;
2014-03-23 07:59:28 +00:00
2014-11-14 02:06:45 +00:00
device . pointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document ;
2014-11-12 21:24:03 +00:00
2014-11-14 02:06:45 +00:00
device . quirksMode = ( document . compatMode === 'CSS1Compat' ) ? false : true ;
2014-11-12 21:24:03 +00:00
2015-06-11 05:01:40 +00:00
navigator . getUserMedia = navigator . getUserMedia || navigator . webkitGetUserMedia || navigator . mozGetUserMedia || navigator . msGetUserMedia || navigator . oGetUserMedia ;
2015-05-14 22:20:52 +00:00
window . URL = window . URL || window . webkitURL || window . mozURL || window . msURL ;
device . getUserMedia = device . getUserMedia && ! ! navigator . getUserMedia && ! ! window . URL ;
// Older versions of firefox (< 21) apparently claim support but user media does not actually work
2015-07-22 14:31:30 +00:00
if ( device . firefox && device . firefoxVersion < 21 )
2015-05-14 22:20:52 +00:00
{
2015-06-16 13:15:48 +00:00
device . getUserMedia = false ;
2015-05-14 22:20:52 +00:00
}
2014-11-12 21:24:03 +00:00
2015-01-02 01:37:14 +00:00
// TODO: replace canvasBitBltShift detection with actual feature check
// Excludes iOS versions as they generally wrap UIWebView (eg. Safari WebKit) and it
// is safer to not try and use the fast copy-over method.
2015-07-22 14:31:30 +00:00
if ( ! device . iOS && ( device . ie || device . firefox || device . chrome ) )
2014-12-31 17:04:55 +00:00
{
device . canvasBitBltShift = true ;
}
2015-01-02 01:37:14 +00:00
// Known not to work
if ( device . safari || device . mobileSafari )
2014-12-31 17:04:55 +00:00
{
device . canvasBitBltShift = false ;
}
2014-11-14 02:06:45 +00:00
}
2014-11-12 21:24:03 +00:00
/ * *
* Checks / configures various input .
* /
2014-11-14 02:06:45 +00:00
function _checkInput ( ) {
2014-11-12 21:24:03 +00:00
2015-02-05 06:12:20 +00:00
if ( 'ontouchstart' in document . documentElement || ( window . navigator . maxTouchPoints && window . navigator . maxTouchPoints >= 1 ) )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . touch = true ;
2013-08-28 06:02:55 +00:00
}
2016-09-19 22:10:42 +00:00
if ( window . PointerEvent || window . MSPointerEvent || window . navigator . msPointerEnabled || window . navigator . pointerEnabled )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . mspointer = true ;
2013-08-28 06:02:55 +00:00
}
2014-03-23 07:59:28 +00:00
2014-11-14 02:06:45 +00:00
if ( ! device . cocoonJS )
2014-11-12 21:24:03 +00:00
{
// See https://developer.mozilla.org/en-US/docs/Web/Events/wheel
2014-11-14 02:06:45 +00:00
if ( 'onwheel' in window || ( device . ie && 'WheelEvent' in window ) )
2014-11-12 21:24:03 +00:00
{
// DOM3 Wheel Event: FF 17+, IE 9+, Chrome 31+, Safari 7+
2014-11-14 02:06:45 +00:00
device . wheelEvent = 'wheel' ;
2014-11-12 21:24:03 +00:00
}
else if ( 'onmousewheel' in window )
{
// Non-FF legacy: IE 6-9, Chrome 1-31, Safari 5-7.
2014-11-14 02:06:45 +00:00
device . wheelEvent = 'mousewheel' ;
2014-11-12 21:24:03 +00:00
}
2014-11-14 02:06:45 +00:00
else if ( device . firefox && 'MouseScrollEvent' in window )
2014-11-12 21:24:03 +00:00
{
// FF prior to 17. This should probably be scrubbed.
2014-11-14 02:06:45 +00:00
device . wheelEvent = 'DOMMouseScroll' ;
2014-11-12 21:24:03 +00:00
}
}
2014-02-25 21:16:56 +00:00
2014-11-14 02:06:45 +00:00
}
2014-02-25 21:16:56 +00:00
/ * *
* Checks for support of the Full Screen API .
* /
2014-11-14 02:06:45 +00:00
function _checkFullScreenSupport ( ) {
2014-02-25 21:16:56 +00:00
var fs = [
'requestFullscreen' ,
'requestFullScreen' ,
'webkitRequestFullscreen' ,
'webkitRequestFullScreen' ,
'msRequestFullscreen' ,
'msRequestFullScreen' ,
'mozRequestFullScreen' ,
'mozRequestFullscreen'
] ;
2014-11-14 02:06:45 +00:00
var element = document . createElement ( 'div' ) ;
2014-02-25 21:16:56 +00:00
for ( var i = 0 ; i < fs . length ; i ++ )
{
2014-11-14 02:06:45 +00:00
if ( element [ fs [ i ] ] )
2014-02-25 21:16:56 +00:00
{
2014-11-14 02:06:45 +00:00
device . fullscreen = true ;
device . 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'
] ;
2014-11-14 02:06:45 +00:00
if ( device . fullscreen )
2014-02-25 21:16:56 +00:00
{
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
{
2014-11-14 02:06:45 +00:00
device . 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' ] )
{
2014-11-14 02:06:45 +00:00
device . fullscreenKeyboard = true ;
2014-02-25 21:16:56 +00:00
}
2014-11-14 02:06:45 +00:00
}
2013-08-28 06:02:55 +00:00
/ * *
* Check what browser is game running in .
* /
2014-11-14 02:06:45 +00:00
function _checkBrowser ( ) {
2013-08-28 06:02:55 +00:00
var ua = navigator . userAgent ;
2016-09-29 02:09:49 +00:00
if ( /Edge\/\d+/ . test ( ua ) )
2016-02-17 13:37:32 +00:00
{
device . edge = true ;
}
2015-07-08 14:22:32 +00:00
else if ( /Chrome\/(\d+)/ . test ( ua ) && ! device . windowsPhone )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . chrome = true ;
2015-06-16 13:15:48 +00:00
device . chromeVersion = parseInt ( RegExp . $1 , 10 ) ;
2013-12-17 05:07:00 +00:00
}
2015-05-18 13:51:25 +00:00
else if ( /Firefox\D+(\d+)/ . test ( ua ) )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . firefox = true ;
2015-05-18 13:51:25 +00:00
device . firefoxVersion = parseInt ( RegExp . $1 , 10 ) ;
2013-12-17 05:07:00 +00:00
}
2014-11-14 02:06:45 +00:00
else if ( /AppleWebKit/ . test ( ua ) && device . iOS )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . mobileSafari = true ;
2013-12-17 05:07:00 +00:00
}
else if ( /MSIE (\d+\.\d+);/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . ie = true ;
device . ieVersion = parseInt ( RegExp . $1 , 10 ) ;
2013-12-17 05:07:00 +00:00
}
else if ( /Opera/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . opera = true ;
2013-12-17 05:07:00 +00:00
}
2016-02-09 13:17:14 +00:00
else if ( /Safari\/(\d+)/ . test ( ua ) && ! device . windowsPhone )
2013-12-17 05:07:00 +00:00
{
2014-11-14 02:06:45 +00:00
device . safari = true ;
2016-02-09 13:17:14 +00:00
if ( /Version\/(\d+)\./ . test ( ua ) )
{
device . safariVersion = parseInt ( RegExp . $1 , 10 ) ;
}
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
{
2014-11-14 02:06:45 +00:00
device . ie = true ;
device . trident = true ;
device . tridentVersion = parseInt ( RegExp . $1 , 10 ) ;
device . ieVersion = parseInt ( RegExp . $3 , 10 ) ;
2013-08-28 06:02:55 +00:00
}
2015-07-08 14:22:32 +00:00
// Silk gets its own if clause because its ua also contains 'Safari'
2014-05-08 04:28:27 +00:00
if ( /Silk/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . silk = true ;
2014-05-08 04:28:27 +00:00
}
2015-07-08 14:22:32 +00:00
// WebApp mode in iOS
2013-12-17 05:07:00 +00:00
if ( navigator [ 'standalone' ] )
{
2014-11-14 02:06:45 +00:00
device . webApp = true ;
2013-08-28 06:02:55 +00:00
}
2014-08-11 16:33:06 +00:00
2016-08-25 12:03:41 +00:00
if ( typeof window . cordova !== 'undefined' )
2014-08-11 16:33:06 +00:00
{
2014-11-14 02:06:45 +00:00
device . cordova = true ;
2014-08-11 16:33:06 +00:00
}
2014-08-21 21:37:51 +00:00
2016-08-25 12:03:41 +00:00
if ( typeof process !== 'undefined' && typeof require !== 'undefined' )
2014-08-21 21:37:51 +00:00
{
2014-11-14 02:06:45 +00:00
device . node = true ;
2014-08-28 02:00:14 +00:00
}
2015-07-21 09:04:54 +00:00
if ( device . node && typeof process . versions === 'object' )
2014-08-28 02:00:14 +00:00
{
2015-07-21 09:04:54 +00:00
device . nodeWebkit = ! ! process . versions [ 'node-webkit' ] ;
2015-06-12 04:24:06 +00:00
2015-07-21 09:04:54 +00:00
device . electron = ! ! process . versions . electron ;
2014-08-21 21:37:51 +00:00
}
2013-12-17 05:07:00 +00:00
if ( navigator [ 'isCocoonJS' ] )
{
2014-11-14 02:06:45 +00:00
device . cocoonJS = true ;
2013-11-26 15:29:03 +00:00
}
2014-08-30 00:58:19 +00:00
2014-11-14 02:06:45 +00:00
if ( device . cocoonJS )
2014-08-30 00:58:19 +00:00
{
try {
2016-08-25 12:03:41 +00:00
device . cocoonJSApp = ( typeof CocoonJS !== 'undefined' ) ;
2014-08-31 09:16:53 +00:00
}
catch ( error )
{
2014-11-14 02:06:45 +00:00
device . cocoonJSApp = false ;
2014-08-30 00:58:19 +00:00
}
}
2013-11-26 15:29:03 +00:00
2016-08-25 12:03:41 +00:00
if ( typeof window . ejecta !== 'undefined' )
2013-12-24 03:18:55 +00:00
{
2014-11-14 02:06:45 +00:00
device . ejecta = true ;
2013-12-24 03:18:55 +00:00
}
2014-04-14 15:40:14 +00:00
if ( /Crosswalk/ . test ( ua ) )
{
2014-11-14 02:06:45 +00:00
device . crosswalk = true ;
2014-04-14 15:40:14 +00:00
}
2014-11-14 02:06:45 +00:00
}
2013-08-28 06:02:55 +00:00
2015-05-03 12:30:10 +00:00
/ * *
* Check video support .
* /
function _checkVideo ( ) {
var videoElement = document . createElement ( "video" ) ;
var result = false ;
try {
if ( result = ! ! videoElement . canPlayType )
{
if ( videoElement . canPlayType ( 'video/ogg; codecs="theora"' ) . replace ( /^no$/ , '' ) )
{
device . oggVideo = true ;
}
if ( videoElement . canPlayType ( 'video/mp4; codecs="avc1.42E01E"' ) . replace ( /^no$/ , '' ) )
{
// Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
device . h264Video = true ;
device . mp4Video = true ;
}
if ( videoElement . canPlayType ( 'video/webm; codecs="vp8, vorbis"' ) . replace ( /^no$/ , '' ) )
{
device . webmVideo = true ;
}
if ( videoElement . canPlayType ( 'video/webm; codecs="vp9"' ) . replace ( /^no$/ , '' ) )
{
device . vp9Video = true ;
}
if ( videoElement . canPlayType ( 'application/x-mpegURL; codecs="avc1.42E01E"' ) . replace ( /^no$/ , '' ) )
{
device . hlsVideo = true ;
}
}
} catch ( e ) { }
}
2013-08-28 06:02:55 +00:00
/ * *
* Check audio support .
* /
2014-11-14 02:06:45 +00:00
function _checkAudio ( ) {
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
device . audioData = ! ! ( window [ 'Audio' ] ) ;
2015-01-01 21:38:02 +00:00
device . webAudio = ! ! ( window [ 'AudioContext' ] || window [ 'webkitAudioContext' ] ) ;
2013-08-28 06:02:55 +00:00
var audioElement = document . createElement ( 'audio' ) ;
var result = false ;
try {
2015-06-16 19:38:18 +00:00
if ( result = ! ! audioElement . canPlayType )
{
if ( audioElement . canPlayType ( 'audio/ogg; codecs="vorbis"' ) . replace ( /^no$/ , '' ) )
{
2014-11-14 02:06:45 +00:00
device . ogg = true ;
2013-08-28 06:02:55 +00:00
}
2015-06-16 19:38:18 +00:00
if ( audioElement . canPlayType ( 'audio/ogg; codecs="opus"' ) . replace ( /^no$/ , '' ) || audioElement . canPlayType ( 'audio/opus;' ) . replace ( /^no$/ , '' ) )
{
2014-11-14 02:06:45 +00:00
device . opus = true ;
2013-08-28 06:02:55 +00:00
}
2015-06-16 19:38:18 +00:00
if ( audioElement . canPlayType ( 'audio/mpeg;' ) . replace ( /^no$/ , '' ) )
{
2014-11-14 02:06:45 +00:00
device . mp3 = true ;
2013-08-28 06:02:55 +00:00
}
// Mimetypes accepted:
// developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
// bit.ly/iphoneoscodecs
2015-06-16 19:38:18 +00:00
if ( audioElement . canPlayType ( 'audio/wav; codecs="1"' ) . replace ( /^no$/ , '' ) )
{
2014-11-14 02:06:45 +00:00
device . wav = true ;
2013-08-28 06:02:55 +00:00
}
2015-06-16 19:38:18 +00:00
if ( audioElement . canPlayType ( 'audio/x-m4a;' ) || audioElement . canPlayType ( 'audio/aac;' ) . replace ( /^no$/ , '' ) )
{
2014-11-14 02:06:45 +00:00
device . m4a = true ;
2013-08-28 06:02:55 +00:00
}
2015-06-16 19:38:18 +00:00
if ( audioElement . canPlayType ( 'audio/webm; codecs="vorbis"' ) . replace ( /^no$/ , '' ) )
{
2014-11-14 02:06:45 +00:00
device . webm = true ;
2013-08-28 06:02:55 +00:00
}
2016-02-09 13:17:14 +00:00
if ( audioElement . canPlayType ( 'audio/mp4;codecs="ec-3"' ) !== '' )
{
if ( device . edge )
{
device . dolby = true ;
}
else if ( device . safari && device . safariVersion >= 9 )
{
if ( /Mac OS X (\d+)_(\d+)/ . test ( navigator . userAgent ) )
{
var major = parseInt ( RegExp . $1 , 10 ) ;
var minor = parseInt ( RegExp . $2 , 10 ) ;
if ( ( major === 10 && minor >= 11 ) || major > 10 )
{
device . dolby = true ;
}
}
}
}
2013-08-28 06:02:55 +00:00
}
} catch ( e ) {
}
2014-11-14 02:06:45 +00:00
}
2013-08-28 06:02:55 +00:00
2014-04-23 22:35:36 +00:00
/ * *
* Check Little or Big Endian system .
2014-11-14 02:06:45 +00:00
*
2014-04-23 22:35:36 +00:00
* @ author Matt DesLauriers ( @ mattdesl )
* /
2014-11-14 02:06:45 +00:00
function _checkIsLittleEndian ( ) {
2014-04-23 22:35:36 +00:00
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 ;
2016-08-25 12:03:41 +00:00
if ( c [ 0 ] === 0xd4c3b2a1 )
2014-04-23 22:35:36 +00:00
{
return true ;
}
2016-08-25 12:03:41 +00:00
if ( c [ 0 ] === 0xa1b2c3d4 )
2014-04-23 22:35:36 +00:00
{
return false ;
}
else
{
// Could not determine endianness
return null ;
}
2014-11-14 02:06:45 +00:00
}
2014-04-23 22:35:36 +00:00
2014-04-24 02:49:49 +00:00
/ * *
* Test to see if ImageData uses CanvasPixelArray or Uint8ClampedArray .
2014-11-14 02:06:45 +00:00
*
2014-04-24 02:49:49 +00:00
* @ author Matt DesLauriers ( @ mattdesl )
* /
2014-11-14 02:06:45 +00:00
function _checkIsUint8ClampedImageData ( ) {
2014-04-24 02:49:49 +00:00
2015-07-22 09:37:15 +00:00
if ( Uint8ClampedArray === undefined )
2014-04-24 02:49:49 +00:00
{
return false ;
}
2016-09-28 11:53:04 +00:00
var elem = Phaser . CanvasPool . create ( this , 1 , 1 ) ;
2014-04-24 02:49:49 +00:00
var ctx = elem . getContext ( '2d' ) ;
if ( ! ctx )
{
return false ;
}
var image = ctx . createImageData ( 1 , 1 ) ;
2014-07-23 14:21:06 +00:00
2016-09-28 11:53:04 +00:00
Phaser . CanvasPool . remove ( this ) ;
2015-08-03 13:33:12 +00:00
2014-04-24 02:49:49 +00:00
return image . data instanceof Uint8ClampedArray ;
2014-11-14 02:06:45 +00:00
}
2014-04-24 02:49:49 +00:00
2016-08-25 12:03:41 +00:00
/ * *
* Check PixelRatio , iOS device , Vibration API , ArrayBuffers and endianess .
* /
function _checkDevice ( ) {
device . pixelRatio = window [ 'devicePixelRatio' ] || 1 ;
device . iPhone = navigator . userAgent . toLowerCase ( ) . indexOf ( 'iphone' ) !== - 1 ;
device . iPhone4 = ( device . pixelRatio === 2 && device . iPhone ) ;
device . iPad = navigator . userAgent . toLowerCase ( ) . indexOf ( 'ipad' ) !== - 1 ;
if ( typeof Int8Array !== 'undefined' )
{
device . typedArray = true ;
}
else
{
device . typedArray = false ;
}
if ( typeof ArrayBuffer !== 'undefined' && typeof Uint8Array !== 'undefined' && typeof Uint32Array !== 'undefined' )
{
2016-09-29 02:09:49 +00:00
device . LITTLE _ENDIAN = _checkIsLittleEndian ( ) ;
2016-08-25 12:03:41 +00:00
}
2016-09-29 02:09:49 +00:00
device . support32bit = ( typeof ArrayBuffer !== 'undefined' && typeof Uint8ClampedArray !== 'undefined' && typeof Int32Array !== 'undefined' && device . LITTLE _ENDIAN !== null && _checkIsUint8ClampedImageData ( ) ) ;
2016-08-25 12:03:41 +00:00
navigator . vibrate = navigator . vibrate || navigator . webkitVibrate || navigator . mozVibrate || navigator . msVibrate ;
if ( navigator . vibrate )
{
device . vibration = true ;
}
}
2014-11-14 02:06:45 +00:00
// Run the checks
2014-11-14 03:31:35 +00:00
_checkOS ( ) ;
2016-02-09 13:17:14 +00:00
_checkBrowser ( ) ;
2014-11-14 03:31:35 +00:00
_checkAudio ( ) ;
2015-05-03 12:30:10 +00:00
_checkVideo ( ) ;
2014-11-14 03:31:35 +00:00
_checkDevice ( ) ;
_checkFeatures ( ) ;
2016-09-28 12:39:30 +00:00
_checkCanvasFeatures ( ) ;
2014-11-14 03:31:35 +00:00
_checkFullScreenSupport ( ) ;
_checkInput ( ) ;
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
} ;
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
/ * *
* Check whether the host environment can play audio .
*
* @ method canPlayAudio
* @ memberof Phaser . Device . prototype
* @ param { string } type - One of 'mp3, ' ogg ', ' m4a ', ' wav ', ' webm ' or ' opus ' .
* @ return { boolean } True if the given file type is supported by the browser , otherwise false .
* /
Phaser . Device . canPlayAudio = function ( type ) {
2013-08-28 06:02:55 +00:00
2015-05-03 12:30:10 +00:00
if ( type === 'mp3' && this . mp3 )
{
return true ;
}
else if ( type === 'ogg' && ( this . ogg || this . opus ) )
{
return true ;
}
else if ( type === 'm4a' && this . m4a )
2014-11-14 02:06:45 +00:00
{
return true ;
}
2015-05-03 12:30:10 +00:00
else if ( type === 'opus' && this . opus )
2014-11-14 02:06:45 +00:00
{
return true ;
}
2015-05-03 12:30:10 +00:00
else if ( type === 'wav' && this . wav )
{
return true ;
}
else if ( type === 'webm' && this . webm )
{
return true ;
}
2016-02-09 13:17:14 +00:00
else if ( type === 'mp4' && this . dolby )
{
return true ;
}
2015-05-03 12:30:10 +00:00
return false ;
} ;
/ * *
* Check whether the host environment can play video files .
*
* @ method canPlayVideo
* @ memberof Phaser . Device . prototype
* @ param { string } type - One of 'mp4, ' ogg ', ' webm ' or ' mpeg ' .
* @ return { boolean } True if the given file type is supported by the browser , otherwise false .
* /
Phaser . Device . canPlayVideo = function ( type ) {
if ( type === 'webm' && ( this . webmVideo || this . vp9Video ) )
2014-11-14 02:06:45 +00:00
{
return true ;
}
2015-05-19 13:18:57 +00:00
else if ( type === 'mp4' && ( this . mp4Video || this . h264Video ) )
2014-11-14 02:06:45 +00:00
{
return true ;
}
2015-07-26 12:19:05 +00:00
else if ( ( type === 'ogg' || type === 'ogv' ) && this . oggVideo )
2014-11-14 02:06:45 +00:00
{
return true ;
}
2015-05-03 12:30:10 +00:00
else if ( type === 'mpeg' && this . hlsVideo )
2014-11-14 02:06:45 +00:00
{
return true ;
}
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
return false ;
2013-08-28 06:02:55 +00:00
2014-11-14 02:06:45 +00:00
} ;
2013-08-28 06:02:55 +00:00
2014-07-10 16:00:29 +00:00
/ * *
2014-11-14 02:06:45 +00:00
* Detect if the host is a an Android Stock browser .
* This is available before the device "ready" event .
*
* Authors might want to scale down on effects and switch to the CANVAS rendering method on those devices .
*
* @ example
* var defaultRenderingMode = Phaser . Device . isAndroidStockBrowser ( ) ? Phaser . CANVAS : Phaser . AUTO ;
2014-07-10 16:00:29 +00:00
*
2014-11-14 02:06:45 +00:00
* @ method isAndroidStockBrowser
* @ memberof Phaser . Device . prototype
2014-07-10 16:00:29 +00:00
* /
2014-11-14 03:31:35 +00:00
Phaser . Device . isAndroidStockBrowser = function ( ) {
2014-07-10 16:00:29 +00:00
var matches = window . navigator . userAgent . match ( /Android.*AppleWebKit\/([\d.]+)/ ) ;
2016-09-29 02:09:49 +00:00
2014-07-10 16:00:29 +00:00
return matches && matches [ 1 ] < 537 ;
2014-11-14 03:31:35 +00:00
2014-07-10 16:00:29 +00:00
} ;