From 018609fa3204fc18ec9e8e0082de3d71270e33bf Mon Sep 17 00:00:00 2001 From: John Bender Date: Tue, 22 Mar 2011 00:26:24 -0700 Subject: [PATCH] removed mass of duplication from core of functionality that was moved to init, fixed init tests --- js/jquery.mobile.core.js | 140 ++++++----------------------------- tests/unit/core/core.js | 116 +---------------------------- tests/unit/core/index.html | 1 - tests/unit/init/index.html | 2 +- tests/unit/init/init_core.js | 18 +++-- 5 files changed, 35 insertions(+), 242 deletions(-) diff --git a/js/jquery.mobile.core.js b/js/jquery.mobile.core.js index ff71365a..757f6485 100644 --- a/js/jquery.mobile.core.js +++ b/js/jquery.mobile.core.js @@ -11,7 +11,7 @@ //jQuery.mobile configurable options $.extend( $.mobile, { - + //namespace used framework-wide for data-attrs. Default is no namespace ns: "", @@ -52,13 +52,13 @@ loadingMessage: "loading", //configure meta viewport tag's content attr: - //note: this feature is deprecated in A4 in favor of adding + //note: this feature is deprecated in A4 in favor of adding //the meta viewport element directly in the markup metaViewportContent: "width=device-width, minimum-scale=1, maximum-scale=1", //support conditions that must be met in order to proceed //default enhanced qualifications are media query support OR IE 7+ - gradeA: function(){ + gradeA: function(){ return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7; }, @@ -96,28 +96,31 @@ TAB: 9, UP: 38, WINDOWS: 91 // COMMAND + }, + + //scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value + silentScroll: function( ypos ) { + ypos = ypos || 0; + // prevent scrollstart and scrollstop events + $.event.special.scrollstart.enabled = false; + + setTimeout(function() { + window.scrollTo( 0, ypos ); + $(document).trigger( "silentscroll", { x: 0, y: ypos }); + },20); + + setTimeout(function() { + $.event.special.scrollstart.enabled = true; + }, 150 ); } }); - - //trigger mobileinit event - useful hook for configuring $.mobile settings before they're used - $( window.document ).trigger( "mobileinit" ); - - - //support conditions - //if device support condition(s) aren't met, leave things as they are -> a basic, usable experience, - //otherwise, proceed with the enhancements - if ( !$.mobile.gradeA() ) { - return; - } - //mobile version of data() method //treats namespaced data-attrs the same as non-namespaced ones - $.fn.mobileData = function( prop, value ){ var pUndef = prop === undefined, vUndef = value === undefined; - + if( pUndef || vUndef ){ var ret, nsret; @@ -142,102 +145,8 @@ } } return ret; - } + } }; - - - //define vars for interal use - var $window = $(window), - $html = $( "html" ), - $head = $( "head" ), - - //loading div which appears during Ajax requests - //will not appear if $.mobile.loadingMessage is false - $loader = $.mobile.loadingMessage ? - $( "
" + - "" + - "

" + $.mobile.loadingMessage + "

" + - "
" ) - : undefined; - - - //add mobile, initial load "rendering" classes to docEl - $html.addClass( "ui-mobile ui-mobile-rendering" ); - - - //define & prepend meta viewport tag, if content is defined - $.mobile.metaViewportContent ? $( "", { name: "viewport", content: $.mobile.metaViewportContent}).prependTo( $head ) : undefined; - - - //expose some core utilities - $.extend($.mobile, { - - // turn on/off page loading message. - pageLoading: function ( done ) { - if ( done ) { - $html.removeClass( "ui-loading" ); - } else { - if( $.mobile.loadingMessage ){ - var activeBtn =$( "." + $.mobile.activeBtnClass ).first(); - - $loader - .appendTo( $.mobile.pageContainer ) - //position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top - .css( { - top: $.support.scrollTop && $(window).scrollTop() + $(window).height() / 2 || - activeBtn.length && activeBtn.offset().top || 100 - } ); - } - - $html.addClass( "ui-loading" ); - } - }, - - //scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value - silentScroll: function( ypos ) { - ypos = ypos || 0; - // prevent scrollstart and scrollstop events - $.event.special.scrollstart.enabled = false; - - setTimeout(function() { - window.scrollTo( 0, ypos ); - $(document).trigger( "silentscroll", { x: 0, y: ypos }); - },20); - - setTimeout(function() { - $.event.special.scrollstart.enabled = true; - }, 150 ); - }, - - // find and enhance the pages in the dom and transition to the first page. - initializePage: function(){ - //find present pages - var $pages = $( "[data-" + $.mobile.ns + "role='page']" ); - - //add dialogs, set data-url attrs - $pages.add( "[data-" + $.mobile.ns + "role='dialog']" ).each(function(){ - $(this).attr( "data-" + $.mobile.ns + "url", $(this).attr( "id" )); - }); - - //define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback) - $.mobile.firstPage = $pages.first(); - - //define page container - $.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" ); - - //cue page loading message - $.mobile.pageLoading(); - - // if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM - if( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ){ - $.mobile.changePage( $.mobile.firstPage, false, true, false, true ); - } - // otherwise, trigger a hashchange to load a deeplink - else { - $window.trigger( "hashchange", [ true ] ); - } - } - }); // Monkey-patching Sizzle to filter the :jqdata selector var oldFind = jQuery.find; @@ -249,11 +158,4 @@ }; jQuery.extend( jQuery.find, oldFind ); - - //dom-ready inits - $($.mobile.initializePage); - - //window load event - //hide iOS browser chrome on load - $window.load( $.mobile.silentScroll ); })( jQuery, this ); diff --git a/tests/unit/core/core.js b/tests/unit/core/core.js index 3cd67161..93b6a993 100644 --- a/tests/unit/core/core.js +++ b/tests/unit/core/core.js @@ -4,7 +4,7 @@ (function($){ var libName = "jquery.mobile.core.js", - setGradeA = function(value, version) { + setGradeA = function(value, version) { $.support.mediaquery = value; $.mobile.browser.ie = version; }, @@ -33,119 +33,5 @@ $.testHelper.reloadLib(libName); ok($.mobile.gradeA()); }); - - test( "loading the core library triggers mobilinit on the document", function(){ - expect( 1 ); - - $(window.document).bind('mobileinit', function(event){ - ok(true); - }); - - $.testHelper.reloadLib(libName); - }); - - test( "enhancments are skipped when the browser is not grade A", function(){ - setGradeA(false); - $.testHelper.reloadLib(libName); - - //NOTE easiest way to check for enhancements, not the most obvious - ok(!$("html").hasClass("ui-mobile")); - }); - - test( "enhancments are added when the browser is grade A", function(){ - setGradeA(true); - $.testHelper.reloadLib(libName); - - ok($("html").hasClass("ui-mobile")); - }); - - //TODO lots of duplication - test( "pageLoading doesn't add the dialog to the page when loading message is false", function(){ - $.testHelper.alterExtend({loadingMessage: false}); - $.testHelper.reloadLib(libName); - $.mobile.pageLoading(false); - ok(!$(".ui-loader").length); - }); - - test( "pageLoading doesn't add the dialog to the page when done is passed as true", function(){ - $.testHelper.alterExtend({loadingMessage: true}); - $.testHelper.reloadLib(libName); - - // TODO add post reload callback - $('.ui-loader').remove(); - - $.mobile.pageLoading(true); - ok(!$(".ui-loader").length); - }); - - test( "pageLoading adds the dialog to the page when done is true", function(){ - $.testHelper.alterExtend({loadingMessage: true}); - $.testHelper.reloadLib(libName); - $.mobile.pageLoading(false); - ok($(".ui-loader").length); - }); - - var metaViewportSelector = "head meta[name=viewport]", - setViewPortContent = function(value){ - $(metaViewportSelector).remove(); - $.testHelper.alterExtend({metaViewportContent: value}); - $.testHelper.reloadLib(libName); - }; - - test( "meta view port element is added to head when defined on mobile", function(){ - setViewPortContent("width=device-width"); - same($(metaViewportSelector).length, 1); - }); - - test( "meta view port element not added to head when not defined on mobile", function(){ - setViewPortContent(false); - same($(metaViewportSelector).length, 0); - }); - - var findFirstPage = function() { - return $("[ data-"+ $.mobile.ns + "role='page']").first(); - }; - - test( "active page and start page should be set to the fist page in the selected set", function(){ - $.testHelper.reloadLib(libName); - var firstPage = findFirstPage(); - - same($.mobile.firstPage[0], firstPage[0]); - same($.mobile.activePage[0], firstPage[0]); - }); - - test( "mobile viewport class is defined on the first page's parent", function(){ - var firstPage = findFirstPage(); - $.testHelper.reloadLib(libName); - - ok(firstPage.parent().hasClass('ui-mobile-viewport')); - }); - - test( "mobile page container is the first page's parent", function(){ - var firstPage = findFirstPage(); - $.testHelper.reloadLib(libName); - - same($.mobile.pageContainer[0], firstPage.parent()[0]); - }); - - test( "page loading is called on document ready", function(){ - $.testHelper.alterExtend({ pageLoading: function(){ - start(); - ok("called"); - }}); - - stop(); - $.testHelper.reloadLib(libName); - }); - - test( "hashchange triggered on document ready with single argument: true", function(){ - $(window).bind("hashchange", function(ev, arg){ - same(arg, true); - start(); - }); - - stop(); - $.testHelper.reloadLib(libName); - }); }); })(jQuery); \ No newline at end of file diff --git a/tests/unit/core/index.html b/tests/unit/core/index.html index 5043cd05..016ca35a 100644 --- a/tests/unit/core/index.html +++ b/tests/unit/core/index.html @@ -10,7 +10,6 @@ - diff --git a/tests/unit/init/index.html b/tests/unit/init/index.html index a4b9763e..d59eea85 100644 --- a/tests/unit/init/index.html +++ b/tests/unit/init/index.html @@ -11,8 +11,8 @@ - + diff --git a/tests/unit/init/init_core.js b/tests/unit/init/init_core.js index b5e1af3b..b3e843c3 100644 --- a/tests/unit/init/init_core.js +++ b/tests/unit/init/init_core.js @@ -6,8 +6,15 @@ mobileSelect = undefined, metaViewportContentDefault = $.mobile.metaViewportContent, libName = 'jquery.mobile.init.js', + coreLib = 'jquery.mobile.core.js', + extendFn = $.extend, setGradeA = function(value) { $.mobile.gradeA = function(){ return value; }; }, - extendFn = $.extend; + reloadCoreNSandInit = function(){ + $.testHelper.reloadLib(coreLib); + $.testHelper.reloadLib("jquery.setNamespace.js"); + $.testHelper.reloadLib(libName); + }; + module(libName, { setup: function(){ @@ -35,6 +42,7 @@ mobileSelect = $.mobile.selectmenu; }); + // NOTE for the following two tests see index html for the binding test( "mobile.page is available when mobile init is fired", function(){ ok(mobilePage !== undefined, "$.mobile.page is defined"); }); @@ -172,11 +180,9 @@ }, 500); }); - var coreLib = 'jquery.mobile.core.js'; - asyncTest( "pageLoading adds the loading class to the page when done is false", function(){ $.testHelper.alterExtend({loadingMessage: true}); - $.testHelper.reloadLib(coreLib); + reloadCoreNSandInit(); $.mobile.pageLoading(false); setTimeout(function(){ @@ -186,7 +192,7 @@ }); asyncTest( "page loading should contain default loading message", function(){ - $.testHelper.reloadLib(coreLib); + reloadCoreNSandInit(); $.mobile.pageLoading(false); setTimeout(function(){ @@ -200,7 +206,7 @@ $.mobile.loadingMessage = "foo"; }); - $.testHelper.reloadLib(coreLib); + reloadCoreNSandInit(); $.mobile.pageLoading(false); setTimeout(function(){