Merge branch 'setterargs'
authorjeresig <jeresig@gmail.com>
Thu, 7 Jan 2010 19:26:06 +0000 (14:26 -0500)
committerjeresig <jeresig@gmail.com>
Thu, 7 Jan 2010 19:26:06 +0000 (14:26 -0500)
src/attributes.js
src/core.js
src/manipulation.js
src/offset.js
test/unit/attributes.js
test/unit/css.js
test/unit/manipulation.js
test/unit/offset.js

index a2108fe..004c6b3 100644 (file)
@@ -12,10 +12,20 @@ jQuery.fn.extend({
                return access( this, name, value, true, jQuery.attr );
        },
 
+       removeAttr: function( name, fn ) {
+               return this.each(function(){
+                       jQuery.attr( this, name, "" );
+                       if ( this.nodeType === 1 ) {
+                               this.removeAttribute( name );
+                       }
+               });
+       },
+
        addClass: function( value ) {
                if ( jQuery.isFunction(value) ) {
-                       return this.each(function() {
-                               jQuery(this).addClass( value.call(this) );
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.addClass( value.call(this, i, self.attr("class")) );
                        });
                }
 
@@ -46,8 +56,9 @@ jQuery.fn.extend({
 
        removeClass: function( value ) {
                if ( jQuery.isFunction(value) ) {
-                       return this.each(function() {
-                               jQuery(this).removeClass( value.call(this) );
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.removeClass( value.call(this, i, self.attr("class")) );
                        });
                }
 
@@ -75,6 +86,41 @@ jQuery.fn.extend({
                return this;
        },
 
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value, isBool = typeof stateVal === "boolean";
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className, i = 0, self = jQuery(this),
+                                       state = stateVal,
+                                       classNames = value.split( rspace );
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space seperated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               }
+
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery.data( this, "__className__", this.className );
+                               }
+
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
        hasClass: function( selector ) {
                var className = " " + selector + " ";
                for ( var i = 0, l = this.length; i < l; i++ ) {
@@ -142,30 +188,27 @@ jQuery.fn.extend({
                        return undefined;
                }
 
-               // Typecast once if the value is a number
-               if ( typeof value === "number" ) {
-                       value += "";
-               }
+               var isFunction = jQuery.isFunction(value);
 
-               var val = value;
+               return this.each(function(i) {
+                       var self = jQuery(this), val = value;
 
-               return this.each(function() {
-                       if ( jQuery.isFunction(value) ) {
-                               val = value.call(this);
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
 
-                               // Typecast each time if the value is a Function and the appended
-                               // value is therefore different each time.
-                               if ( typeof val === "number" ) {
-                                       val += "";
-                               }
+                       if ( isFunction ) {
+                               val = value.call(this, i, self.val());
                        }
 
-                       if ( this.nodeType !== 1 ) {
-                               return;
+                       // Typecast each time if the value is a Function and the appended
+                       // value is therefore different each time.
+                       if ( typeof val === "number" ) {
+                               val += "";
                        }
 
                        if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
-                               this.checked = jQuery.inArray( jQuery(this).val(), val ) >= 0;
+                               this.checked = jQuery.inArray( self.val(), val ) >= 0;
 
                        } else if ( jQuery.nodeName( this, "select" ) ) {
                                var values = jQuery.makeArray(val);
@@ -185,50 +228,6 @@ jQuery.fn.extend({
        }
 });
 
-jQuery.each({
-       removeAttr: function( name ) {
-               jQuery.attr( this, name, "" );
-               if ( this.nodeType === 1 ) {
-                       this.removeAttribute( name );
-               }
-       },
-
-       toggleClass: function( classNames, state ) {
-               var type = typeof classNames;
-
-               if ( type === "string" ) {
-                       // toggle individual class names
-                       var isBool = typeof state === "boolean", className, i = 0,
-                               classNames = classNames.split( rspace );
-
-                       while ( (className = classNames[ i++ ]) ) {
-                               // check each className given, space seperated list
-                               state = isBool ? state : !jQuery(this).hasClass( className );
-                               jQuery(this)[ state ? "addClass" : "removeClass" ]( className );
-                       }
-
-               } else if ( type === "undefined" || type === "boolean" ) {
-                       if ( this.className ) {
-                               // store className if set
-                               jQuery.data( this, "__className__", this.className );
-                       }
-
-                       // toggle whole className
-                       this.className = this.className || classNames === false ? "" : jQuery.data( this, "__className__" ) || "";
-               }
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function( val, state ) {
-               if ( jQuery.isFunction( val ) ) {
-                       return this.each(function() {
-                               jQuery(this)[ name ]( val.call(this), state );
-                       });
-               }
-
-               return this.each( fn, arguments );
-       };
-});
-
 jQuery.extend({
        attrFn: {
                val: true,
index 58cbbc7..831570e 100644 (file)
@@ -775,7 +775,7 @@ function access( elems, key, value, exec, fn, pass ) {
                exec = exec && jQuery.isFunction(value);
                
                for ( var i = 0; i < length; i++ ) {
-                       fn( elems[i], key, exec ? value.call( elems[i], i ) : value, pass );
+                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
                }
                
                return elems;
index 2af2d7e..9ed22ba 100644 (file)
@@ -33,8 +33,9 @@ if ( !jQuery.support.htmlSerialize ) {
 jQuery.fn.extend({
        text: function( text ) {
                if ( jQuery.isFunction(text) ) {
-                       return this.each(function() {
-                               return jQuery(this).text( text.call(this) );
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               return self.text( text.call(this, i, self.text()) );
                        });
                }
 
@@ -47,8 +48,8 @@ jQuery.fn.extend({
 
        wrapAll: function( html ) {
                if ( jQuery.isFunction( html ) ) {
-                       return this.each(function() {
-                               jQuery(this).wrapAll( html.apply(this, arguments) );
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
                        });
                }
 
@@ -172,7 +173,7 @@ jQuery.fn.extend({
 
        html: function( value ) {
                if ( value === undefined ) {
-                       return this[0] ?
+                       return this[0] && this[0].nodeType === 1 ?
                                this[0].innerHTML.replace(rinlinejQuery, "") :
                                null;
 
@@ -195,6 +196,14 @@ jQuery.fn.extend({
                                this.empty().append( value );
                        }
 
+               } else if ( jQuery.isFunction( value ) ) {
+                       this.each(function(i){
+                               var self = jQuery(this), old = self.html();
+                               self.empty().append(function(){
+                                       return value.call( this, i, old );
+                               });
+                       });
+
                } else {
                        this.empty().append( value );
                }
@@ -228,9 +237,10 @@ jQuery.fn.extend({
                var results, first, value = args[0], scripts = [];
 
                if ( jQuery.isFunction(value) ) {
-                       return this.each(function() {
-                               args[0] = value.call(this);
-                               return jQuery(this).domManip( args, table, callback );
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call(this, i, table ? self.html() : undefined);
+                               return self.domManip( args, table, callback );
                        });
                }
 
index d12921d..c318374 100644 (file)
@@ -7,8 +7,8 @@ if ( "getBoundingClientRect" in document.documentElement ) {
                }
 
                if ( options ) { 
-                       return this.each(function() {
-                               jQuery.offset.setOffset( this, options );
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
                        });
                }
 
@@ -33,8 +33,8 @@ if ( "getBoundingClientRect" in document.documentElement ) {
                }
 
                if ( options ) { 
-                       return this.each(function() {
-                               jQuery.offset.setOffset( this, options );
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
                        });
                }
 
@@ -137,7 +137,7 @@ jQuery.offset = {
                return { top: top, left: left };
        },
        
-       setOffset: function( elem, options ) {
+       setOffset: function( elem, options, i ) {
                // set position first, in-case top/left are set even on static elem
                if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
                        elem.style.position = "relative";
@@ -145,11 +145,16 @@ jQuery.offset = {
                var curElem   = jQuery( elem ),
                        curOffset = curElem.offset(),
                        curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
-                       curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10)  || 0,
-                       props     = {
-                               top:  (options.top  - curOffset.top)  + curTop,
-                               left: (options.left - curOffset.left) + curLeft
-                       };
+                       curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               var props = {
+                       top:  (options.top  - curOffset.top)  + curTop,
+                       left: (options.left - curOffset.left) + curLeft
+               };
                
                if ( "using" in options ) {
                        options.using.call( elem, props );
index 0692076..fd5b203 100644 (file)
@@ -292,6 +292,148 @@ test("attr('tabindex', value)", function() {
        equals(element.attr('tabindex'), -1, 'set negative tabindex');
 });
 
+test("removeAttr(String)", function() {
+       expect(1);
+       equals( jQuery('#mark').removeAttr( "class" )[0].className, "", "remove class" );
+});
+
+test("val()", function() {
+       expect(17);
+
+       document.getElementById('text1').value = "bla";
+       equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" );
+
+       reset();
+
+       equals( jQuery("#text1").val(), "Test", "Check for value of input element" );
+       // ticket #1714 this caused a JS error in IE
+       equals( jQuery("#first").val(), "", "Check a paragraph element to see if it has a value" );
+       ok( jQuery([]).val() === undefined, "Check an empty jQuery object will return undefined from val" );
+
+       equals( jQuery('#select2').val(), '3', 'Call val() on a single="single" select' );
+
+       same( jQuery('#select3').val(), ['1', '2'], 'Call val() on a multiple="multiple" select' );
+
+       equals( jQuery('#option3c').val(), '2', 'Call val() on a option element with value' );
+
+       equals( jQuery('#option3a').val(), '', 'Call val() on a option element with empty value' );
+
+       equals( jQuery('#option3e').val(), 'no value', 'Call val() on a option element with no value attribute' );
+
+       equals( jQuery('#option3a').val(), '', 'Call val() on a option element with no value attribute' );
+
+       jQuery('#select3').val("");
+       same( jQuery('#select3').val(), [''], 'Call val() on a multiple="multiple" select' );
+
+       var checks = jQuery("<input type='checkbox' name='test' value='1'/>").appendTo("#form")
+               .add( jQuery("<input type='checkbox' name='test' value='2'/>").appendTo("#form") )
+               .add( jQuery("<input type='checkbox' name='test' value=''/>").appendTo("#form") )
+               .add( jQuery("<input type='checkbox' name='test'/>").appendTo("#form") );
+
+       same( checks.serialize(), "", "Get unchecked values." );
+
+       equals( checks.eq(3).val(), "on", "Make sure a value of 'on' is provided if none is specified." );
+
+       checks.val([ "2" ]);
+       same( checks.serialize(), "test=2", "Get a single checked value." );
+
+       checks.val([ "1", "" ]);
+       same( checks.serialize(), "test=1&test=", "Get multiple checked values." );
+
+       checks.val([ "", "2" ]);
+       same( checks.serialize(), "test=2&test=", "Get multiple checked values." );
+
+       checks.val([ "1", "on" ]);
+       same( checks.serialize(), "test=1&test=on", "Get multiple checked values." );
+
+       checks.remove();
+});
+
+var testVal = function(valueObj) {
+       expect(6);
+
+       jQuery("#text1").val(valueObj( 'test' ));
+       equals( document.getElementById('text1').value, "test", "Check for modified (via val(String)) value of input element" );
+
+       jQuery("#text1").val(valueObj( 67 ));
+       equals( document.getElementById('text1').value, "67", "Check for modified (via val(Number)) value of input element" );
+
+       jQuery("#select1").val(valueObj( "3" ));
+       equals( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" );
+
+       jQuery("#select1").val(valueObj( 2 ));
+       equals( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" );
+
+       jQuery("#select1").append("<option value='4'>four</option>");
+       jQuery("#select1").val(valueObj( 4 ));
+       equals( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" );
+
+       // using contents will get comments regular, text, and comment nodes
+       var j = jQuery("#nonnodes").contents();
+       j.val(valueObj( "asdf" ));
+       equals( j.val(), "asdf", "Check node,textnode,comment with val()" );
+       j.removeAttr("value");
+}
+
+test("val(String/Number)", function() {
+       testVal(bareObj);
+});
+
+test("val(Function)", function() {
+       testVal(functionReturningObj);
+})
+
+test("val(Function) with incoming value", function() {
+       expect(10);
+
+       var oldVal = jQuery("#text1").val();
+
+       jQuery("#text1").val(function(i, val) {
+               equals( val, oldVal, "Make sure the incoming value is correct." );
+               return "test";
+       });
+
+       equals( document.getElementById('text1').value, "test", "Check for modified (via val(String)) value of input element" );
+
+       oldVal = jQuery("#text1").val();
+
+       jQuery("#text1").val(function(i, val) {
+               equals( val, oldVal, "Make sure the incoming value is correct." );
+               return 67;
+       });
+
+       equals( document.getElementById('text1').value, "67", "Check for modified (via val(Number)) value of input element" );
+
+       oldVal = jQuery("#select1").val();
+
+       jQuery("#select1").val(function(i, val) {
+               equals( val, oldVal, "Make sure the incoming value is correct." );
+               return "3";
+       });
+
+       equals( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" );
+
+       oldVal = jQuery("#select1").val();
+
+       jQuery("#select1").val(function(i, val) {
+               equals( val, oldVal, "Make sure the incoming value is correct." );
+               return 2;
+       });
+
+       equals( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" );
+
+       jQuery("#select1").append("<option value='4'>four</option>");
+
+       oldVal = jQuery("#select1").val();
+
+       jQuery("#select1").val(function(i, val) {
+               equals( val, oldVal, "Make sure the incoming value is correct." );
+               return 4;
+       });
+
+       equals( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" );
+});
+
 var testAddClass = function(valueObj) {
        expect(2);
        var div = jQuery("div");
@@ -316,6 +458,25 @@ test("addClass(Function)", function() {
        testAddClass(functionReturningObj);
 });
 
+test("addClass(Function) with incoming value", function() {
+       expect(39);
+
+       var div = jQuery("div"), old = div.map(function(){
+               return jQuery(this).attr("class");
+       });
+
+       div.addClass(function(i, val) {
+               equals( val, old[i], "Make sure the incoming value is correct." );
+               return "test";
+       });
+
+       var pass = true;
+       for ( var i = 0; i < div.size(); i++ ) {
+        if ( div.get(i).className.indexOf("test") == -1 ) pass = false;
+       }
+       ok( pass, "Add Class" );
+});
+
 var testRemoveClass = function(valueObj) {
        expect(5);
 
@@ -357,6 +518,23 @@ test("removeClass(Function) - simple", function() {
        testRemoveClass(functionReturningObj);
 });
 
+test("removeClass(Function) with incoming value", function() {
+       expect(39);
+
+       var $divs = jQuery('div').addClass("test"), old = $divs.map(function(){
+               return jQuery(this).attr("class");
+       });
+
+       $divs.removeClass(function(i, val) {
+               equals( val, old[i], "Make sure the incoming value is correct." );
+               return "test";
+       });
+
+       ok( !$divs.is('.test'), "Remove Class" );
+
+       reset();        
+});
+
 var testToggleClass = function(valueObj) {
        expect(17);
 
@@ -417,17 +595,57 @@ test("toggleClass(Function[, boolean])", function() {
        testToggleClass(functionReturningObj);
 });
 
-var testRemoveAttr = function(valueObj) {
-       expect(1);
-       equals( jQuery('#mark').removeAttr( valueObj("class") )[0].className, "", "remove class" );
-};
+test("toggleClass(Fucntion[, boolean]) with incoming value", function() {
+       expect(14);
 
-test("removeAttr(String)", function() {
-       testRemoveAttr(bareObj);
-});
+       var e = jQuery("#firstp"), old = e.attr("class");
+       ok( !e.is(".test"), "Assert class not present" );
+       
+       e.toggleClass(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return "test";
+       });
+       ok( e.is(".test"), "Assert class present" );
+       
+       old = e.attr("class");
+       
+       e.toggleClass(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return "test";
+       });
+       ok( !e.is(".test"), "Assert class not present" );
+       
+       old = e.attr("class");
 
-test("removeAttr(Function)", function() {
-       testRemoveAttr(functionReturningObj);
+       // class name with a boolean
+       e.toggleClass(function(i, val, state) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               equals( state, false, "Make sure that the state is passed in." );
+               return "test";
+       }, false );
+       ok( !e.is(".test"), "Assert class not present" );
+       
+       old = e.attr("class");
+       
+       e.toggleClass(function(i, val, state) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               equals( state, true, "Make sure that the state is passed in." );
+               return "test";
+       }, true );
+       ok( e.is(".test"), "Assert class present" );
+       
+       old = e.attr("class");
+       
+       e.toggleClass(function(i, val, state) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               equals( state, false, "Make sure that the state is passed in." );
+               return "test";
+       }, false );
+       ok( !e.is(".test"), "Assert class not present" );
+
+       // Cleanup
+       e.removeClass("test");
+       e.removeData('__className__');
 });
 
 test("addClass, removeClass, hasClass", function() {
index 116312e..5f8a74a 100644 (file)
@@ -120,69 +120,123 @@ if(jQuery.browser.msie) {
 }
 
 test("css(String, Function)", function() {
-       try { 
-               expect(3);
+       expect(3);
                
-               var sizes = ["10px", "20px", "30px"];
+       var sizes = ["10px", "20px", "30px"];
        
-               jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" + 
-                                        "<div class='cssFunction'></div>" + 
-                                        "<div class='cssFunction'></div></div>")
-                       .appendTo("body");
+       jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div></div>")
+               .appendTo("body");
        
-               var index = 0;
+       var index = 0;
        
-               jQuery("#cssFunctionTest div").css("font-size", function() {
-                       var size = sizes[index];
-                       index++;
-                       return size;
-               });
+       jQuery("#cssFunctionTest div").css("font-size", function() {
+               var size = sizes[index];
+               index++;
+               return size;
+       });
                
-               index = 0;
+       index = 0;
+       
+       jQuery("#cssFunctionTest div").each(function() {
+               var computedSize = jQuery(this).css("font-size")
+               var expectedSize = sizes[index]
+               equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
+               index++;
+       });
+
+       jQuery("#cssFunctionTest").remove();
+});
+
+test("css(String, Function) with incoming value", function() {
+       expect(3);
                
-               jQuery("#cssFunctionTest div").each(function() {
-                       var computedSize = jQuery(this).css("font-size")
-                       var expectedSize = sizes[index]
-                       equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
-                       index++;
-               });
+       var sizes = ["10px", "20px", "30px"];
+       
+       jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div></div>")
+               .appendTo("body");
+       
+       var index = 0;
+       
+       jQuery("#cssFunctionTest div").css("font-size", function() {
+               var size = sizes[index];
+               index++;
+               return size;
+       });
                
-       } finally {
-               jQuery("#cssFunctionTest").remove();
-       }
+       index = 0;
+       
+       jQuery("#cssFunctionTest div").css("font-size", function(i, computedSize) {
+               var expectedSize = sizes[index]
+               equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
+               index++;
+               return computedSize;
+       });
+
+       jQuery("#cssFunctionTest").remove();
 });
 
 test("css(Object) where values are Functions", function() {
-       try { 
-               expect(3);
+       expect(3);
                
-               var sizes = ["10px", "20px", "30px"];
+       var sizes = ["10px", "20px", "30px"];
+       
+       jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div></div>")
+               .appendTo("body");
+
+       var index = 0;
        
-               jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" + 
-                                        "<div class='cssFunction'></div>" + 
-                                        "<div class='cssFunction'></div></div>")
-                       .appendTo("body");
+       jQuery("#cssFunctionTest div").css({fontSize: function() {
+               var size = sizes[index];
+               index++;
+               return size;
+       }});
+               
+       index = 0;
+               
+       jQuery("#cssFunctionTest div").each(function() {
+               var computedSize = jQuery(this).css("font-size")
+               var expectedSize = sizes[index]
+               equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
+               index++;
+       });
+               
+       jQuery("#cssFunctionTest").remove();
+});
+
+test("css(Object) where values are Functions with incoming values", function() {
+       expect(3);
+               
+       var sizes = ["10px", "20px", "30px"];
        
-               var index = 0;
+       jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div>" + 
+                                "<div class='cssFunction'></div></div>")
+               .appendTo("body");
+
+       var index = 0;
        
-               jQuery("#cssFunctionTest div").css({fontSize: function() {
-                       var size = sizes[index];
-                       index++;
-                       return size;
-               }});
+       jQuery("#cssFunctionTest div").css({fontSize: function() {
+               var size = sizes[index];
+               index++;
+               return size;
+       }});
                
-               index = 0;
+       index = 0;
                
-               jQuery("#cssFunctionTest div").each(function() {
-                       var computedSize = jQuery(this).css("font-size")
-                       var expectedSize = sizes[index]
-                       equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
-                       index++;
-               });
+       jQuery("#cssFunctionTest div").css({"font-size": function(i, computedSize) {
+               var expectedSize = sizes[index]
+               equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
+               index++;
+               return computedSize;
+       }});
                
-       } finally {
-               jQuery("#cssFunctionTest").remove();
-       }
+       jQuery("#cssFunctionTest").remove();
 });
 
 test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function () {
index 9242ddd..a7e1f7e 100644 (file)
@@ -12,6 +12,42 @@ test("text()", function() {
        equals( jQuery(document.createTextNode("foo")).text(), "foo", "Text node was retreived from .text()." );
 });
 
+var testText = function(valueObj) {
+       expect(4);
+       var val = valueObj("<div><b>Hello</b> cruel world!</div>");
+       equals( jQuery("#foo").text(val)[0].innerHTML.replace(/>/g, "&gt;"), "&lt;div&gt;&lt;b&gt;Hello&lt;/b&gt; cruel world!&lt;/div&gt;", "Check escaped text" );
+
+       // using contents will get comments regular, text, and comment nodes
+       var j = jQuery("#nonnodes").contents();
+       j.text(valueObj("hi!"));
+       equals( jQuery(j[0]).text(), "hi!", "Check node,textnode,comment with text()" );
+       equals( j[1].nodeValue, " there ", "Check node,textnode,comment with text()" );
+       equals( j[2].nodeType, 8, "Check node,textnode,comment with text()" );
+}
+
+test("text(String)", function() {
+       testText(bareObj)
+});
+
+test("text(Function)", function() {
+       testText(functionReturningObj);
+});
+
+test("text(Function) with incoming value", function() {
+       expect(2);
+       
+       var old = "This link has class=\"blog\": Simon Willison's Weblog";
+       
+       jQuery('#sap').text(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return "foobar";
+       });
+       
+       equals( jQuery("#sap").text(), "foobar", 'Check for merged text of more then one element.' );
+       
+       reset();
+});
+
 var testWrap = function(val) {
        expect(18);
        var defaultText = 'Try them out:'
@@ -133,7 +169,7 @@ test("wrapInner(String|Element)", function() {
 //     testWrapInner(functionReturningObj)
 // })
 
-var testUnwrap = function() {
+test("unwrap()", function() {
        expect(9);
 
        jQuery("body").append('  <div id="unwrap" style="display: none;"> <div id="unwrap1"> <span class="unwrap">a</span> <span class="unwrap">b</span> </div> <div id="unwrap2"> <span class="unwrap">c</span> <span class="unwrap">d</span> </div> <div id="unwrap3"> <b><span class="unwrap unwrap3">e</span></b> <b><span class="unwrap unwrap3">f</span></b> </div> </div>');
@@ -158,10 +194,6 @@ var testUnwrap = function() {
        same( jQuery('body > span.unwrap').get(), abcdef, 'body contains 6 .unwrap child spans' );
 
        jQuery('body > span.unwrap').remove();
-}
-
-test("unwrap()", function() {
-       testUnwrap();
 });
 
 var testAppend = function(valueObj) {
@@ -256,7 +288,68 @@ test("append(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 
 test("append(Function)", function() {
        testAppend(functionReturningObj);
-})
+});
+
+test("append(Function) with incoming value", function() {
+       expect(12);
+       
+       var defaultText = 'Try them out:', old = jQuery("#first").html();
+       
+       var result = jQuery('#first').append(function(i, val){
+               equals( val, old, "Make sure the incoming value is correct." );
+               return '<b>buga</b>';
+       });
+       equals( result.text(), defaultText + 'buga', 'Check if text appending works' );
+       
+       var select = jQuery('#select3');
+       old = select.html();
+       
+       equals( select.append(function(i, val){
+               equals( val, old, "Make sure the incoming value is correct." );
+               return '<option value="appendTest">Append Test</option>';
+       }).find('option:last-child').attr('value'), 'appendTest', 'Appending html options to select element');
+
+       reset();
+       var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:";
+       old = jQuery("#sap").html();
+       
+       jQuery('#sap').append(function(i, val){
+               equals( val, old, "Make sure the incoming value is correct." );
+               return document.getElementById('first');
+       });
+       equals( expected, jQuery('#sap').text(), "Check for appending of element" );
+
+       reset();
+       expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo";
+       old = jQuery("#sap").html();
+       
+       jQuery('#sap').append(function(i, val){
+               equals( val, old, "Make sure the incoming value is correct." );
+               return [document.getElementById('first'), document.getElementById('yahoo')];
+       });
+       equals( expected, jQuery('#sap').text(), "Check for appending of array of elements" );
+
+       reset();
+       expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:";
+       old = jQuery("#sap").html();
+       
+       jQuery('#sap').append(function(i, val){
+               equals( val, old, "Make sure the incoming value is correct." );
+               return jQuery("#first, #yahoo");
+       });
+       equals( expected, jQuery('#sap').text(), "Check for appending of jQuery object" );
+
+       reset();
+       old = jQuery("#sap").html();
+       
+       jQuery("#sap").append(function(i, val){
+               equals( val, old, "Make sure the incoming value is correct." );
+               return 5;
+       });
+       ok( jQuery("#sap")[0].innerHTML.match( /5$/ ), "Check for appending a number" );        
+       
+       reset();
+});
 
 test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
        expect(12);
@@ -330,7 +423,7 @@ var testPrepend = function(val) {
        expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
        jQuery('#sap').prepend(val( jQuery("#first, #yahoo") ));
        equals( expected, jQuery('#sap').text(), "Check for prepending of jQuery object" );
-}
+};
 
 test("prepend(String|Element|Array&lt;Element&gt;|jQuery)", function() {
        testPrepend(bareObj);
@@ -338,7 +431,58 @@ test("prepend(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 
 test("prepend(Function)", function() {
        testPrepend(functionReturningObj);
-})
+});
+
+test("prepend(Function) with incoming value", function() {
+       expect(10);
+       
+       var defaultText = 'Try them out:', old = jQuery('#first').html();
+       var result = jQuery('#first').prepend(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return '<b>buga</b>';
+       });
+       equals( result.text(), 'buga' + defaultText, 'Check if text prepending works' );
+       
+       old = jQuery("#select3").html();
+       
+       equals( jQuery('#select3').prepend(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return '<option value="prependTest">Prepend Test</option>';
+       }).find('option:first-child').attr('value'), 'prependTest', 'Prepending html options to select element');
+
+       reset();
+       var expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog";
+       old = jQuery('#sap').html();
+       
+       jQuery('#sap').prepend(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return document.getElementById('first');
+       });
+       
+       equals( expected, jQuery('#sap').text(), "Check for prepending of element" );
+
+       reset();
+       expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog";
+       old = jQuery('#sap').html();
+       
+       jQuery('#sap').prepend(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return [document.getElementById('first'), document.getElementById('yahoo')];
+       });
+       
+       equals( expected, jQuery('#sap').text(), "Check for prepending of array of elements" );
+
+       reset();
+       expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
+       old = jQuery('#sap').html();
+       
+       jQuery('#sap').prepend(function(i, val) {
+               equals( val, old, "Make sure the incoming value is correct." );
+               return jQuery("#first, #yahoo");
+       });
+       
+       equals( expected, jQuery('#sap').text(), "Check for prepending of jQuery object" );     
+});
 
 test("prependTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
        expect(6);
@@ -618,92 +762,6 @@ test("clone() on XML nodes", function() {
 });
 }
 
-test("val()", function() {
-       expect(17);
-
-       document.getElementById('text1').value = "bla";
-       equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" );
-
-       reset();
-
-       equals( jQuery("#text1").val(), "Test", "Check for value of input element" );
-       // ticket #1714 this caused a JS error in IE
-       equals( jQuery("#first").val(), "", "Check a paragraph element to see if it has a value" );
-       ok( jQuery([]).val() === undefined, "Check an empty jQuery object will return undefined from val" );
-
-       equals( jQuery('#select2').val(), '3', 'Call val() on a single="single" select' );
-
-       same( jQuery('#select3').val(), ['1', '2'], 'Call val() on a multiple="multiple" select' );
-
-       equals( jQuery('#option3c').val(), '2', 'Call val() on a option element with value' );
-
-       equals( jQuery('#option3a').val(), '', 'Call val() on a option element with empty value' );
-
-       equals( jQuery('#option3e').val(), 'no value', 'Call val() on a option element with no value attribute' );
-
-       equals( jQuery('#option3a').val(), '', 'Call val() on a option element with no value attribute' );
-
-       jQuery('#select3').val("");
-       same( jQuery('#select3').val(), [''], 'Call val() on a multiple="multiple" select' );
-
-       var checks = jQuery("<input type='checkbox' name='test' value='1'/>").appendTo("#form")
-               .add( jQuery("<input type='checkbox' name='test' value='2'/>").appendTo("#form") )
-               .add( jQuery("<input type='checkbox' name='test' value=''/>").appendTo("#form") )
-               .add( jQuery("<input type='checkbox' name='test'/>").appendTo("#form") );
-
-       same( checks.serialize(), "", "Get unchecked values." );
-
-       equals( checks.eq(3).val(), "on", "Make sure a value of 'on' is provided if none is specified." );
-
-       checks.val([ "2" ]);
-       same( checks.serialize(), "test=2", "Get a single checked value." );
-
-       checks.val([ "1", "" ]);
-       same( checks.serialize(), "test=1&test=", "Get multiple checked values." );
-
-       checks.val([ "", "2" ]);
-       same( checks.serialize(), "test=2&test=", "Get multiple checked values." );
-
-       checks.val([ "1", "on" ]);
-       same( checks.serialize(), "test=1&test=on", "Get multiple checked values." );
-
-       checks.remove();
-});
-
-var testVal = function(valueObj) {
-       expect(6);
-
-       jQuery("#text1").val(valueObj( 'test' ));
-       equals( document.getElementById('text1').value, "test", "Check for modified (via val(String)) value of input element" );
-
-       jQuery("#text1").val(valueObj( 67 ));
-       equals( document.getElementById('text1').value, "67", "Check for modified (via val(Number)) value of input element" );
-
-       jQuery("#select1").val(valueObj( "3" ));
-       equals( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" );
-
-       jQuery("#select1").val(valueObj( 2 ));
-       equals( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" );
-
-       jQuery("#select1").append("<option value='4'>four</option>");
-       jQuery("#select1").val(valueObj( 4 ));
-       equals( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" );
-
-       // using contents will get comments regular, text, and comment nodes
-       var j = jQuery("#nonnodes").contents();
-       j.val(valueObj( "asdf" ));
-       equals( j.val(), "asdf", "Check node,textnode,comment with val()" );
-       j.removeAttr("value");
-}
-
-test("val(String/Number)", function() {
-       testVal(bareObj);
-});
-
-test("val(Function)", function() {
-       testVal(functionReturningObj);
-})
-
 var testHtml = function(valueObj) {
        expect(22);
 
@@ -768,27 +826,66 @@ test("html(Function)", function() {
        testHtml(functionReturningObj);
 });
 
-var testText = function(valueObj) {
-       expect(4);
-       var val = valueObj("<div><b>Hello</b> cruel world!</div>");
-       equals( jQuery("#foo").text(val)[0].innerHTML.replace(/>/g, "&gt;"), "&lt;div&gt;&lt;b&gt;Hello&lt;/b&gt; cruel world!&lt;/div&gt;", "Check escaped text" );
+test("html(Function) with incoming value", function() {
+       expect(20);
+       
+       var div = jQuery("#main > div"), old = div.map(function(){ return jQuery(this).html() });
+       
+       div.html(function(i, val) {
+               equals( val, old[i], "Make sure the incoming value is correct." );
+               return "<b>test</b>";
+       });
+       
+       var pass = true;
+       div.each(function(){
+               if ( this.childNodes.length !== 1 ) {
+                       pass = false;
+               }
+       })
+       ok( pass, "Set HTML" );
 
+       reset();
        // using contents will get comments regular, text, and comment nodes
        var j = jQuery("#nonnodes").contents();
-       j.text(valueObj("hi!"));
-       equals( jQuery(j[0]).text(), "hi!", "Check node,textnode,comment with text()" );
-       equals( j[1].nodeValue, " there ", "Check node,textnode,comment with text()" );
-       equals( j[2].nodeType, 8, "Check node,textnode,comment with text()" );
-}
+       old = j.map(function(){ return jQuery(this).html(); });
+       
+       j.html(function(i, val) {
+               equals( val, old[i], "Make sure the incoming value is correct." );
+               return "<b>bold</b>";
+       });
+       
+       j.find('b').removeData();
+       equals( j.html().replace(/ xmlns="[^"]+"/g, "").toLowerCase(), "<b>bold</b>", "Check node,textnode,comment with html()" );
+       
+       var $div = jQuery('<div />');
+       
+       equals( $div.html(function(i, val) {
+               equals( val, "", "Make sure the incoming value is correct." );
+               return 5;
+       }).html(), '5', 'Setting a number as html' );
+       
+       equals( $div.html(function(i, val) {
+               equals( val, "5", "Make sure the incoming value is correct." );
+               return 0;
+       }).html(), '0', 'Setting a zero as html' );
 
-test("text(String)", function() {
-       testText(bareObj)
+       var $div2 = jQuery('<div/>'), insert = "&lt;div&gt;hello1&lt;/div&gt;";
+       equals( $div2.html(function(i, val) {
+               equals( val, "", "Make sure the incoming value is correct." );
+               return insert;
+       }).html(), insert, "Verify escaped insertion." );
+       
+       equals( $div2.html(function(i, val) {
+               equals( val, insert, "Make sure the incoming value is correct." );
+               return "x" + insert;
+       }).html(), "x" + insert, "Verify escaped insertion." );
+       
+       equals( $div2.html(function(i, val) {
+               equals( val, "x" + insert, "Make sure the incoming value is correct." );
+               return " " + insert;
+       }).html(), " " + insert, "Verify escaped insertion." ); 
 });
 
-test("text(Function)", function() {
-       testText(functionReturningObj);
-})
-
 var testRemove = function(method) {
        expect(9);
 
index 602f5e6..dc03bc2 100644 (file)
@@ -1,6 +1,8 @@
 module("offset");
 
 testoffset("absolute", function( jQuery ) {
+       expect(144);
+       
        // get offset tests
        var tests = [
                { id: '#absolute-1',     top:  1, left:  1 }, 
@@ -51,6 +53,16 @@ testoffset("absolute", function( jQuery ) {
                equals( jQuery( this.id ).offset().top,  this.top,  "jQuery('" + this.id + "').offset({ top: "  + this.top  + " })" );
                equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
                
+               var top = this.top, left = this.left;
+               
+               jQuery( this.id ).offset(function(i, val){
+                       equals( val.top, top, "Verify incoming top position." );
+                       equals( val.left, left, "Verify incoming top position." );
+                       return { top: top + 1, left: left + 1 };
+               });
+               equals( jQuery( this.id ).offset().top,  this.top + 1,  "jQuery('" + this.id + "').offset({ top: "  + this.top  + " })" );
+               equals( jQuery( this.id ).offset().left, this.left + 1, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
+               
                jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
                        jQuery( this ).css({
                                top:  props.top  + 1,
@@ -63,6 +75,8 @@ testoffset("absolute", function( jQuery ) {
 });
 
 testoffset("relative", function( jQuery ) {
+       expect(60);
+       
        // IE is collapsing the top margin of 1px
        var ie = jQuery.browser.msie && parseInt( jQuery.browser.version ) < 8;
        
@@ -122,6 +136,8 @@ testoffset("relative", function( jQuery ) {
 });
 
 testoffset("static", function( jQuery ) {
+       expect(80);
+       
        // IE is collapsing the top margin of 1px
        var ie = jQuery.browser.msie && parseInt( jQuery.browser.version ) < 8;
        
@@ -187,6 +203,8 @@ testoffset("static", function( jQuery ) {
 });
 
 testoffset("fixed", function( jQuery ) {
+       expect(28);
+       
        jQuery.offset.initialize();
        
        var tests = [
@@ -238,31 +256,18 @@ testoffset("fixed", function( jQuery ) {
 });
 
 testoffset("table", function( jQuery ) {
-       var ie = jQuery.browser.msie;
+       expect(4);
        
        equals( jQuery('#table-1').offset().top, 6, "jQuery('#table-1').offset().top" );
        equals( jQuery('#table-1').offset().left, 6, "jQuery('#table-1').offset().left" );
        
        equals( jQuery('#th-1').offset().top, 10, "jQuery('#th-1').offset().top" );
        equals( jQuery('#th-1').offset().left, 10, "jQuery('#th-1').offset().left" );
-       
-       // equals( jQuery('#th-2').offset().top, 10, "jQuery('#th-2').offset().top" );
-       // equals( jQuery('#th-2').offset().left, 116, "jQuery('#th-2').offset().left" );
-       // 
-       // equals( jQuery('#th-3').offset().top, 10, "jQuery('#th-3').offset().top" );
-       // equals( jQuery('#th-3').offset().left, 222, "jQuery('#th-3').offset().left" );
-       
-       // equals( jQuery('#td-1').offset().top, ie ? 116 : 112, "jQuery('#td-1').offset().top" );
-       // equals( jQuery('#td-1').offset().left, 10, "jQuery('#td-1').offset().left" );
-       // 
-       // equals( jQuery('#td-2').offset().top, ie ? 116 : 112, "jQuery('#td-2').offset().top" );
-       // equals( jQuery('#td-2').offset().left, 116, "jQuery('#td-2').offset().left" );
-       // 
-       // equals( jQuery('#td-3').offset().top, ie ? 116 : 112, "jQuery('#td-3').offset().top" );
-       // equals( jQuery('#td-3').offset().left, 222, "jQuery('#td-3').offset().left" );
 });
 
 testoffset("scroll", function( jQuery, win ) {
+       expect(12);
+       
        var ie = jQuery.browser.msie && parseInt( jQuery.browser.version ) < 8;
        
        // IE is collapsing the top margin of 1px
@@ -294,6 +299,8 @@ testoffset("scroll", function( jQuery, win ) {
 });
 
 testoffset("body", function( jQuery ) {
+       expect(2);
+       
        equals( jQuery('body').offset().top, 1, "jQuery('#body').offset().top" );
        equals( jQuery('body').offset().left, 1, "jQuery('#body').offset().left" );
 });