/** * @private * iOS version of viewport. */ Ext.define('Ext.viewport.Ios', { extend: 'Ext.viewport.Default', isFullscreen: function() { return this.isHomeScreen(); }, isHomeScreen: function() { return window.navigator.standalone === true; }, constructor: function() { this.callParent(arguments); if (this.getAutoMaximize() && !this.isFullscreen()) { this.addWindowListener('touchstart', Ext.Function.bind(this.onTouchStart, this)); } }, maximize: function() { if (this.isFullscreen()) { return this.callParent(); } var stretchHeights = this.stretchHeights, orientation = this.orientation, currentHeight = this.getWindowHeight(), height = stretchHeights[orientation]; if (window.scrollY > 0) { this.scrollToTop(); if (!height) { stretchHeights[orientation] = height = this.getWindowHeight(); } this.setHeight(height); this.fireMaximizeEvent(); } else { if (!height) { height = this.getScreenHeight(); } this.setHeight(height); this.waitUntil(function() { this.scrollToTop(); return currentHeight !== this.getWindowHeight(); }, function() { if (!stretchHeights[orientation]) { height = stretchHeights[orientation] = this.getWindowHeight(); this.setHeight(height); } this.fireMaximizeEvent(); }, function() { //<debug error> Ext.Logger.error("Timeout waiting for window.innerHeight to change", this); //</debug> height = stretchHeights[orientation] = this.getWindowHeight(); this.setHeight(height); this.fireMaximizeEvent(); }, 50, 1000); } }, getScreenHeight: function() { return window.screen[this.orientation === this.PORTRAIT ? 'height' : 'width']; }, onElementFocus: function() { if (this.getAutoMaximize() && !this.isFullscreen()) { clearTimeout(this.scrollToTopTimer); } this.callParent(arguments); }, onElementBlur: function() { if (this.getAutoMaximize() && !this.isFullscreen()) { this.scrollToTopTimer = setTimeout(this.scrollToTop, 500); } this.callParent(arguments); }, onTouchStart: function() { if (this.focusedElement === null) { this.scrollToTop(); } }, scrollToTop: function() { window.scrollTo(0, 0); } }, function() { if (!Ext.os.is.iOS) { return; } if (Ext.os.version.lt('3.2')) { this.override({ constructor: function() { var stretchHeights = this.stretchHeights = {}; stretchHeights[this.PORTRAIT] = 416; stretchHeights[this.LANDSCAPE] = 268; return this.callOverridden(arguments); } }); } if (Ext.os.version.lt('5')) { this.override({ fieldMaskClsTest: '-field-mask', doPreventZooming: function(e) { var target = e.target; if (target && target.nodeType === 1 && !this.isInputRegex.test(target.tagName) && target.className.indexOf(this.fieldMaskClsTest) == -1) { e.preventDefault(); } } }); } if (Ext.os.is.iPad) { this.override({ isFullscreen: function() { return true; } }); } });