diff --git a/js/utils/platform.js b/js/utils/platform.js index 129cdbc1a7e..5af319faef6 100644 --- a/js/utils/platform.js +++ b/js/utils/platform.js @@ -90,6 +90,8 @@ if(this.isWebView()) { this.platforms.push('webview'); this.platforms.push('cordova'); + } else { + this.platforms.push('browser'); } if(this.isIPad()) this.platforms.push('ipad'); @@ -129,7 +131,10 @@ * @returns {boolean} Whether we are running on iPad. */ isIPad: function() { - return this.ua.toLowerCase().indexOf('ipad') >= 0; + if( /iPad/i.test(window.navigator.platform) ) { + return true; + } + return /iPad/i.test(this.ua); }, /** * @ngdoc method @@ -170,7 +175,7 @@ } else if(this.ua.indexOf('iPhone') > -1 || this.ua.indexOf('iPad') > -1 || this.ua.indexOf('iPod') > -1) { platformName = 'ios'; } else { - platformName = ''; + platformName = window.navigator.platform && window.navigator.platform.toLowerCase().split(' ')[0] || ''; } }, diff --git a/js/utils/viewport.js b/js/utils/viewport.js index fe240166d41..3f62d4d21bc 100644 --- a/js/utils/viewport.js +++ b/js/utils/viewport.js @@ -2,6 +2,14 @@ var viewportTag; var viewportProperties = {}; +ionic.viewport = { + orientation: function() { + // 0 = Portrait + // 90 = Landscape + // not using window.orientation because each device has a different implementation + return (window.innerWidth > window.innerHeight ? 90 : 0); + } +}; function viewportLoadTag() { var x; @@ -20,38 +28,96 @@ function viewportLoadTag() { keyValue = props[x].split('='); if(keyValue.length == 2) viewportProperties[ keyValue[0] ] = keyValue[1]; } - viewportInitWebView(); + viewportUpdate(); } } -function viewportInitWebView() { +function viewportUpdate() { + // unit tests in viewport.unit.js + + var initWidth = viewportProperties.width; var initHeight = viewportProperties.height; + var p = ionic.Platform; + var version = p.version(); + var DEVICE_WIDTH = 'device-width'; + var DEVICE_HEIGHT = 'device-height'; + var orientation = ionic.viewport.orientation(); + + // Most times we're removing the height and adding the width + // So this is the default to start with, then modify per platform/version/oreintation + delete viewportProperties.height; + viewportProperties.width = DEVICE_WIDTH; + + if( p.isIPad() ) { + // iPad + + if( version > 7 ) { + // iPad >= 7.1 + // https://issues.apache.org/jira/browse/CB-4323 + delete viewportProperties.width; + + } else { + // iPad <= 7.0 + + if( p.isWebView() ) { + // iPad <= 7.0 WebView + + if( orientation == 90 ) { + // iPad <= 7.0 WebView Landscape + viewportProperties.height = '0'; + + } else if(version == 7) { + // iPad <= 7.0 WebView Portait + viewportProperties.height = DEVICE_HEIGHT; + } + } else { + // iPad <= 6.1 Browser + if(version < 7) { + viewportProperties.height = '0'; + } + } + } + + } else if( p.isIOS() ) { + // iPhone + + if( p.isWebView() ) { + // iPhone WebView - if( ionic.Platform.isWebView() ) { - viewportProperties.height = 'device-height'; + if(version > 7) { + // iPhone >= 7.1 WebView + delete viewportProperties.width; - } else if( ionic.Platform.isIOS() && viewportProperties.height ) { - // if its not a webview, and a viewport height was set, just removing - // the height value doesn't trigger the change, but setting to 0 does the trick - viewportProperties.height = '0'; + } else if(version < 7) { + // iPhone <= 6.1 WebView + // if height was set it needs to get removed with this hack for <= 6.1 + if( initHeight ) viewportProperties.height = '0'; + } + + } else { + // iPhone Browser + + if (version < 7) { + // iPhone <= 6.1 Browser + // if height was set it needs to get removed with this hack for <= 6.1 + if( initHeight ) viewportProperties.height = '0'; + } + } - } else if( viewportProperties.height ) { - delete viewportProperties.height; } // only update the viewport tag if there was a change - if(initHeight !== viewportProperties.height) viewportUpdate(); - console.debug(viewportTag.content) + if(initWidth !== viewportProperties.width || initHeight !== viewportProperties.height) { + viewportTagUpdate(); + } } -function viewportUpdate(updates) { - if(!viewportTag) return; - +function viewportTagUpdate(updates) { ionic.Utils.extend(viewportProperties, updates); var key, props = []; for(key in viewportProperties) { - if(viewportProperties[key]) props.push(key + '=' + viewportProperties[key]); + if( viewportProperties[key] ) props.push(key + '=' + viewportProperties[key]); } viewportTag.content = props.join(', '); @@ -59,4 +125,8 @@ function viewportUpdate(updates) { ionic.DomUtil.ready(function() { viewportLoadTag(); + + window.addEventListener("orientationchange", function(){ + setTimeout(viewportUpdate, 1000); + }, false); }); diff --git a/scss/_platform.scss b/scss/_platform.scss index e8460a0e8c0..ece4c7376dc 100644 --- a/scss/_platform.scss +++ b/scss/_platform.scss @@ -26,7 +26,7 @@ top: $bar-height + $ios7-statusbar-height; } - .has-header, + .has-header, .bar-subheader { top: $bar-height + $ios7-statusbar-height; } @@ -45,3 +45,9 @@ margin-bottom: 20px; } } + +@media (orientation:landscape) { + .platform-ios7.platform-browser.platform-ipad { + position: fixed; // required for iPad 7 Safari + } +} diff --git a/test/html/viewState.html b/test/html/viewState.html index 711b31456ef..a641667b8b8 100644 --- a/test/html/viewState.html +++ b/test/html/viewState.html @@ -258,6 +258,42 @@

{{ auto.year }} {{ auto.make }} {{ auto.model }}

+ + + + + + + + + + + +
diff --git a/test/unit/angular/service/platform.unit.js b/test/unit/angular/service/platform.unit.js index 407cc69f2aa..762bcb9bd07 100644 --- a/test/unit/angular/service/platform.unit.js +++ b/test/unit/angular/service/platform.unit.js @@ -5,6 +5,9 @@ describe('Ionic Platform Service', function() { beforeEach(inject(function($window, $ionicPlatform, $rootScope) { window = $window; + window.navigator = { + platform: '' + }; ionic.Platform.ua = ''; ionicPlatform = $ionicPlatform; rootScope = $rootScope; @@ -84,6 +87,39 @@ describe('Ionic Platform Service', function() { expect(ionic.Platform.version()).toEqual(7.0); }); + it('should not be iPad from none iPad user agent', function() { + ionic.Platform.ua = 'Mozilla/5.0 (iPhone; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53'; + ionic.Platform.setPlatform(undefined); + ionic.Platform.setVersion(undefined); + expect(ionic.Platform.isIPad()).toEqual(false); + }); + + it('should be iPad from user agent', function() { + ionic.Platform.ua = 'Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53'; + ionic.Platform.setPlatform(undefined); + ionic.Platform.setVersion(undefined); + expect(ionic.Platform.isIPad()).toEqual(true); + }); + + it('should be iPad from iPad in window.navigator.platform and webview, but iPhone in user agent', function() { + window.cordova = {}; + ionic.Platform.ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'; + window.navigator = { + platform: 'iPad Simulator' + }; + ionic.Platform.setPlatform(undefined); + ionic.Platform.setVersion(undefined); + expect(ionic.Platform.isIPad()).toEqual(true); + }); + + it('should not be iPad from no in window.navigator.platform, and iPhone in user agent', function() { + ionic.Platform.ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'; + window.navigator = {}; + ionic.Platform.setPlatform(undefined); + ionic.Platform.setVersion(undefined); + expect(ionic.Platform.isIPad()).toEqual(false); + }); + it('is iOS', function() { ionic.Platform.setPlatform('iOS'); expect(ionic.Platform.isIOS()).toEqual(true); @@ -104,6 +140,7 @@ describe('Ionic Platform Service', function() { }); it('is WebView', function() { + window.cordova = undefined; expect(ionic.Platform.isWebView()).toEqual(false); window.cordova = {}; expect(ionic.Platform.isWebView()).toEqual(true); @@ -155,7 +192,7 @@ describe('Ionic Platform Service', function() { expect(ionic.Platform.platforms[1]).toEqual('cordova'); }); - it('should not set any platform', function() { + it('should not set if its not a webview but only a browser', function() { window.cordova = null; window.PhoneGap = null; window.phonegap = null; @@ -164,7 +201,7 @@ describe('Ionic Platform Service', function() { ionic.Platform._checkPlatforms() - expect(ionic.Platform.platforms.length).toEqual(0); + expect(ionic.Platform.platforms[0]).toEqual('browser'); }); it('sets grade a from iOS7', function() { diff --git a/test/unit/utils/viewport.unit.js b/test/unit/utils/viewport.unit.js index d0257455fdb..ff1b417cfcb 100644 --- a/test/unit/utils/viewport.unit.js +++ b/test/unit/utils/viewport.unit.js @@ -29,6 +29,9 @@ -iOS 6.1 Cordova no viewport height, keyboard is over webview -iOS 6.1 Safari no viewport height, keyboard is over webview + http://cordova.apache.org/docs/en/3.3.0/guide_platforms_ios_upgrading.md.html#Upgrading%20iOS + https://issues.apache.org/jira/browse/CB-4323 + */ @@ -42,6 +45,9 @@ describe('Ionic Viewport', function() { _activeElement = null; // the element which has focus window.cordova = undefined; window.device = undefined; + window.navigator = {}; + window.innerWidth = 1; + window.innerHeight = 2; ionic.Platform.ua = ''; ionic.Platform.platforms = null; ionic.Platform.setPlatform(''); @@ -59,79 +65,434 @@ describe('Ionic Viewport', function() { if(vportTag) vportTag.parentNode.removeChild(vportTag); }); - it('Should have height=device-height for iOS 7+ on webview', function(){ - ionic.Platform.setPlatform('iOS'); + + + // iOS 7.1, iPad, WebView + + it('Should remove width and height from viewport for iOS >= 7.1, iPad, WebView', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('7.1'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no'); + }); + + + // iOS 7.1, iPad, Browser + + it('Should remove width and height from viewport for iOS >= 7.1, iPad, Browser', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('7.1'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no'); + }); + + + // iOS 7.0, iPad, WebView + + it('Should keep width and height in viewport for iOS 7.0, iPad, WebView, Portrait', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('7.0'); + window.cordova = {}; + window.innerWidth = 1; + window.innerHeight = 2; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=device-height'); + }); + + it('Should add width and height to viewport for iOS 7.0, iPad, WebView, Portrait', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; ionic.Platform.setVersion('7.0'); - expect( ionic.Platform.isAndroid() ).toEqual(false); - expect( ionic.Platform.isIOS() ).toEqual(true); + window.cordova = {}; + window.innerWidth = 1; + window.innerHeight = 2; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); - //so isWebView() is true + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=device-height'); + }); + + it('Should add width and height=0 to viewport for iOS 7.0, iPad, WebView, Landscape', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('7.0'); window.cordova = {}; + window.innerWidth = 2; + window.innerHeight = 1; + vportTag.content = 'user-scalable=no'; viewportLoadTag(); - expect( viewportProperties.height ).toEqual('device-height'); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); }); - it('Should not have height=device-height for iOS 7+ on browser', function(){ - ionic.Platform.setPlatform('iOS'); + it('Should keep width reset height to 0 in viewport for iOS 7.0, iPad, WebView, Landscape', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('7.0'); + window.cordova = {}; + window.innerWidth = 2; + window.innerHeight = 1; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); + }); + + + // iOS 7.0, iPad, Browser + + it('Should keep width, but remove height from viewport for iOS 7.0, iPad, Browser', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('7.0'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should add width, but not add height to viewport for iOS 7.0, iPad, Browser', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; ionic.Platform.setVersion('7.0'); - expect( ionic.Platform.isAndroid() ).toEqual(false); - expect( ionic.Platform.isIOS() ).toEqual(true); + vportTag.content = 'user-scalable=no'; viewportLoadTag(); - expect( viewportProperties.height ).not.toEqual('device-height'); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); }); - it('Should have height=device-height for Android on webview', function(){ - ionic.Platform.setPlatform('Android'); - expect( ionic.Platform.isAndroid() ).toEqual(true); - expect( ionic.Platform.isIOS() ).toEqual(false); - //so isWebView() is true + // iOS 6.1, iPad, WebView + + it('Should keep width, but remove height from viewport for iOS 6.1, iPad, WebView, Portrait', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('6.1'); window.cordova = {}; + window.innerWidth = 1; + window.innerHeight = 2; + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; viewportLoadTag(); - expect( viewportProperties.height ).toEqual('device-height'); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); }); - it('Should not have height=device-height for Android on browser', function(){ - ionic.Platform.setPlatform('Android'); - expect( ionic.Platform.isAndroid() ).toEqual(true); - expect( ionic.Platform.isIOS() ).toEqual(false); + it('Should add width, but not add height to viewport for iOS 6.1, iPad, WebView, Portrait', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('6.1'); + window.cordova = {}; + window.innerWidth = 1; + window.innerHeight = 2; + vportTag.content = 'user-scalable=no'; viewportLoadTag(); - expect( viewportProperties.height ).not.toEqual('device-height'); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); }); - it('Should not re-add height=device-height for webview if its already there', function(){ + it('Should keep width, but replace height with 0 in viewport for iOS 6.1, iPad, WebView, Landscape', function(){ ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('6.1'); window.cordova = {}; - var originalViewport = ' initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width, height=device-height '; - vportTag.setAttribute('content', originalViewport); + window.innerWidth = 2; + window.innerHeight = 1; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); + }); + + it('Should add width and add height=0 to viewport for iOS 6.1, iPad, WebView, Landscape', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('6.1'); + window.cordova = {}; + window.innerWidth = 2; + window.innerHeight = 1; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); + }); + + + // iOS 6.1, iPad, Browser + + it('Should keep width, and set height=0 for viewport for iOS 6.1, iPad, Browser, Portrait', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('6.1'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; viewportLoadTag(); - // if it was changed the spaces would have been removed - expect( vportTag.content ).toEqual(originalViewport); + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); }); - it('Should not update the viewport if its not a webview and height=device-height wasnt already in', function(){ + it('Should add width, and add height=0 to viewport for iOS 6.1, iPad, Browser', function(){ ionic.Platform.setPlatform('ios'); - var originalViewport = ' initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width '; - vportTag.setAttribute('content', originalViewport); + ionic.Platform.ua = 'ipad'; + ionic.Platform.setVersion('6.1'); + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); + }); + + + // iOS 7.1, iPhone, WebView + + it('Should remove width and height from viewport for iOS 7.1, iPhone, WebView', function(){ + ionic.Platform.setPlatform('ios'); + ionic.Platform.setVersion('7.1'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; viewportLoadTag(); - // if it was changed the spaces would have been removed - expect( vportTag.content ).toEqual(originalViewport); + expect( vportTag.content ).toEqual('user-scalable=no'); }); - it('Should set height=0 if browser and height=device-height was already in', function(){ + it('Should do nothing width and height already in viewport for iOS 7.1, iPhone, WebView', function(){ ionic.Platform.setPlatform('ios'); - var originalViewport = 'initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width, height=device-height'; - vportTag.setAttribute('content', originalViewport); + ionic.Platform.setVersion('7.1'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no'); + }); + + + // iOS 7.1, iPhone, Browser + + it('Should keep width, but remove height from viewport for iOS >= 7.1, iPhone, Browser', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('7.1'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should add width, but not height to viewport for iOS >= 7.1, iPhone, Browser', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('7.1'); + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + + // iOS 7.0, iPhone, WebView + + it('Should keep width, but not height in viewport for iOS 7.0, iPhone, WebView', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('7.0'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should add width, but not height to viewport for iOS 7.0, iPhone, WebView', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('7.0'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + + // iOS 7.0, iPhone, Browser + + it('Should keep width but remove height from viewport for iOS 7.0, iPhone, Browser', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('7.0'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should add width but not height to viewport for iOS 7.0, iPhone, Browser', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('7.0'); + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + + // iOS 6.1, iPhone, WebView + + it('Should add width but not height to viewport for iOS 6.1, iPhone, WebView', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('6.1'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should keep width but replace height=device-height with height=0 in viewport for iOS 6.1, iPhone, WebView', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('6.1'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); + }); + + + // iOS 6.1, iPhone, Browser + + it('Should add width but not height to viewport for iOS 6.1, iPhone, Browser', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('6.1'); + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should keep width but remove height from viewport for iOS 6.1, iPhone, Browser', function(){ + ionic.Platform.setPlatform('iOS'); + ionic.Platform.setVersion('6.1'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width, height=0'); + }); + + + // Android 4.4, WebView + + it('Should add width, but not height to viewport for Android 4.4, WebView', function(){ + ionic.Platform.setPlatform('android'); + ionic.Platform.setVersion('4.4'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should keep width, but remove height from viewport for Android 4.4, WebView', function(){ + ionic.Platform.setPlatform('android'); + ionic.Platform.setVersion('4.4'); + window.cordova = {}; + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + + // Android 4.4, Browser + + it('Should add width, but not height to viewport for Android 4.4, Browser', function(){ + ionic.Platform.setPlatform('android'); + ionic.Platform.setVersion('4.4'); + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should keep width, but remove height from viewport for Android 4.4, Browser', function(){ + ionic.Platform.setPlatform('android'); + ionic.Platform.setVersion('4.4'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; viewportLoadTag(); - // if it was changed the spaces would have been removed - expect( vportTag.content ).toEqual('initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width, height=0'); + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + + // Standard Browser + + it('Should add width, but not height to viewport for Standard Browser', function(){ + ionic.Platform.ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36'; + + vportTag.content = 'user-scalable=no'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + it('Should keep width, but remove height from viewport for Standard Browser', function(){ + ionic.Platform.setPlatform('android'); + ionic.Platform.setVersion('4.4'); + + vportTag.content = 'user-scalable=no, width=device-width, height=device-height'; + viewportLoadTag(); + + expect( vportTag.content ).toEqual('user-scalable=no, width=device-width'); + }); + + + + it('Should get portrait (0) orientation', function(){ + window.innerWidth = 768; + window.innerHeight = 1024; + expect( ionic.viewport.orientation() ).toEqual(0); + + window.innerWidth = 500; + window.innerHeight = 500; + expect( ionic.viewport.orientation() ).toEqual(0); + }); + + it('Should get landscape (90) orientation', function(){ + window.innerWidth = 1024; + window.innerHeight = 768; + expect( ionic.viewport.orientation() ).toEqual(90); }); }); diff --git a/test/unit/views/scrollView.unit.js b/test/unit/views/scrollView.unit.js index a6d77d7d3b5..5c9ebd20142 100644 --- a/test/unit/views/scrollView.unit.js +++ b/test/unit/views/scrollView.unit.js @@ -37,19 +37,20 @@ describe('Scroll View', function() { it('Should resize when the keyboard is showing', function() { var element = document.createElement('textarea'); + ionic.Platform.setPlatform('ios'); s.appendChild(element); document.body.appendChild(sc); var sv = new ionic.views.Scroll({ el: sc, }); - + var scHeight = 500; sc.style.height = scHeight + "px"; sc.style.display = "block"; var keyboardHeight = 200; - details = { + details = { contentHeight: 260, elementBottom: 400, elementTop: 300,