2 * mobile navigation unit tests
6 transitioning = "ui-mobile-viewport-transitioning",
7 animationCompleteFn = $.fn.animationComplete,
8 defaultMaxTrans = $.mobile.maxTransitionWidth,
10 //TODO centralize class names?
11 transitionTypes = "in out fade slide flip reverse pop",
13 isTransitioning = function(page){
14 return $.grep(transitionTypes.split(" "), function(className, i){
15 return page.hasClass(className);
19 isTransitioningIn = function(page){
20 return page.hasClass("in") && isTransitioning(page);
23 disableMaxTransWidth = function(){
24 $.mobile.maxTransitionWidth = false;
27 enableMaxTransWidth = function(){
28 $.mobile.maxTransitionWidth = defaultMaxTrans;
31 //animationComplete callback queue
35 resetQueues = function(){
40 onFromComplete = function( f ){
44 onToComplete = function( f ){
50 clearUrlHistory = function(){
51 $.mobile.urlHistory.stack = [];
52 $.mobile.urlHistory.activeIndex = 0;
56 if( !$.support.cssTransform3d ) {
57 perspective = "viewport-fade";
59 perspective = "viewport-flip";
62 module('jquery.mobile.navigation.js', {
66 // disable this option so we can test transitions regardless of window width
67 disableMaxTransWidth();
69 //stub to allow callback before function is returned to transition handler
70 $.fn.animationComplete = function( callback ){
71 animationCompleteFn.call( this, function(){
72 var queue = $(this).is(".out") ? fromQueue : toQueue;
73 for( var i = 0, il = queue.length; i < il; i++ ){
85 if ( location.hash !== "#harmless-default-page" ) {
88 $(document).one("pagechange", function() {
92 location.hash = "#harmless-default-page";
97 // unmock animation complete
98 $.fn.animationComplete = animationCompleteFn;
99 enableMaxTransWidth();
105 Our default transition handler now has either one or two animationComplete calls - two if there are two pages in play (from and to)
106 To is required, so each async function must call start() onToComplete, not onFromComplete.
108 asyncTest( "changePage applies perspective class to mobile viewport for flip", function(){
111 $.testHelper.pageSequence([
113 $.mobile.changePage("#foo");
117 onToComplete( function( el ) {
118 ok($("body").hasClass(perspective), "has viewport-flip or viewport-fade based on 3d transform");
122 $("#foo > a").first().click();
127 asyncTest( "changePage applies transition class to mobile viewport for default transition", function(){
129 $.testHelper.pageSequence([
131 $.mobile.changePage("#baz");
135 onToComplete( function( el ){
136 ok($("body").hasClass(transitioning), "has transitioning class");
140 $("#baz > a").click();
145 asyncTest( "explicit transition preferred for page navigation reversal (ie back)", function(){
148 onToComplete(function(){
149 $("#flip-trans > a").click();
150 onToComplete(function(){
151 $("#fade-trans > a").click();
152 onToComplete(function(){
153 ok($("#flip-trans").hasClass("fade"), "has fade class");
159 $("#fade-trans > a").click();
162 asyncTest( "default transition is fade", function(){
163 onToComplete(function(){
164 ok($("#no-trans").hasClass("fade"), "has fade class");
168 $("#default-trans > a").click();
171 asyncTest( "changePage queues requests", function(){
173 var firstPage = $("#foo"),
174 secondPage = $("#bar");
176 $.mobile.changePage(firstPage);
177 $.mobile.changePage(secondPage);
179 onToComplete(function(){
180 ok(isTransitioningIn(firstPage), "first page begins transition");
181 ok(!isTransitioningIn(secondPage), "second page doesn't transition yet");
182 onToComplete(function(){
183 ok(!isTransitioningIn(firstPage), "first page transition should be complete");
184 ok(isTransitioningIn(secondPage), "second page should begin transitioning");
191 asyncTest( "default transition is pop for a dialog", function(){
192 var defaultTransition = "pop";
194 if( !$.support.cssTransform3d ){
195 defaultTransition = "fade";
199 onToComplete(function(){
200 ok( $("#no-trans-dialog").hasClass(defaultTransition), "has pop class" );
204 $("#default-trans-dialog > a").click();
207 test( "animationComplete return value", function(){
208 $.fn.animationComplete = animationCompleteFn;
209 equal($("#foo").animationComplete(function(){})[0], $("#foo")[0]);
213 // reusable function for a few tests below
214 function testTransitionMaxWidth( val, expected ){
217 $.mobile.maxTransitionWidth = val;
219 var transitionOccurred = false;
221 onToComplete(function(){
222 transitionOccurred = true;
226 return setTimeout(function(){
227 ok( transitionOccurred === expected, (expected ? "" : "no ") + "transition occurred" );
231 $.mobile.changePage( $(".ui-page:not(.ui-page-active)").first() );
235 asyncTest( "maxTransitionWidth property disables transitions when value is less than browser width", function(){
236 testTransitionMaxWidth( $( window ).width() - 1, false );
239 asyncTest( "maxTransitionWidth property disables transitions when value is false", function(){
240 testTransitionMaxWidth( false, false );