@@ -51,20 +51,12 @@ if ( !jQuery.support.htmlSerialize ) {
}

jQuery.fn.extend({
text: function( text ) {
if ( jQuery.isFunction(text) ) {
return this.each(function(i) {
var self = jQuery( this );

self.text( text.call(this, i, self.text()) );
});
}

if ( typeof text !== "object" && text !== undefined ) {
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
}

return jQuery.text( this );
text: function( value ) {
return jQuery.access( this, function( value ) {
return value === undefined ?
jQuery.text( this ) :
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
}, null, value, arguments.length );
},

wrapAll: function( html ) {
@@ -216,44 +208,44 @@ jQuery.fn.extend({
},

html: function( value ) {
if ( value === undefined ) {
return this[0] && this[0].nodeType === 1 ?
this[0].innerHTML.replace(rinlinejQuery, "") :
null;

// See if we can take a shortcut and just use innerHTML
} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {

value = value.replace(rxhtmlTag, "<$1></$2>");

try {
for ( var i = 0, l = this.length; i < l; i++ ) {
// Remove element nodes and prevent memory leaks
if ( this[i].nodeType === 1 ) {
jQuery.cleanData( this[i].getElementsByTagName("*") );
this[i].innerHTML = value;
}
}

// If using innerHTML throws an exception, use the fallback method
} catch(e) {
this.empty().append( value );
return jQuery.access( this, function( value ) {
var elem = this[0] || {},
i = 0,
l = this.length;

if ( value === undefined ) {
return elem.nodeType === 1 ?
elem.innerHTML.replace( rinlinejQuery, "" ) :
null;
}

} else if ( jQuery.isFunction( value ) ) {
this.each(function(i){
var self = jQuery( this );

self.html( value.call(this, i, self.html()) );
});
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {

} else {
this.empty().append( value );
}
value = value.replace( rxhtmlTag, "<$1></$2>" );

return this;
try {
for (; i < l; i++ ) {
// Remove element nodes and prevent memory leaks
elem = this[i] || {};
if ( elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName( "*" ) );
elem.innerHTML = value;
}
}

elem = 0;

// If using innerHTML throws an exception, use the fallback method
} catch(e) {}
}

if ( elem ) {
this.empty().append( value );
}
}, null, value, arguments.length );
},

replaceWith: function( value ) {
@@ -1,40 +1,22 @@
(function( jQuery ) {

var rtable = /^t(?:able|d|h)$/i,
var getOffset,
rtable = /^t(?:able|d|h)$/i,
rroot = /^(?:body|html)$/i;

if ( "getBoundingClientRect" in document.documentElement ) {
jQuery.fn.offset = function( options ) {
var elem = this[0], box;

if ( options ) {
return this.each(function( i ) {
jQuery.offset.setOffset( this, options, i );
});
}

if ( !elem || !elem.ownerDocument ) {
return null;
}

if ( elem === elem.ownerDocument.body ) {
return jQuery.offset.bodyOffset( elem );
}

getOffset = function( elem, doc, docElem, box ) {
try {
box = elem.getBoundingClientRect();
} catch(e) {}

var doc = elem.ownerDocument,
docElem = doc.documentElement;

// Make sure we're not dealing with a disconnected DOM node
if ( !box || !jQuery.contains( docElem, elem ) ) {
return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
}

var body = doc.body,
win = getWindow(doc),
win = getWindow( doc ),
clientTop = docElem.clientTop || body.clientTop || 0,
clientLeft = docElem.clientLeft || body.clientLeft || 0,
scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
@@ -46,28 +28,10 @@ if ( "getBoundingClientRect" in document.documentElement ) {
};

} else {
jQuery.fn.offset = function( options ) {
var elem = this[0];

if ( options ) {
return this.each(function( i ) {
jQuery.offset.setOffset( this, options, i );
});
}

if ( !elem || !elem.ownerDocument ) {
return null;
}

if ( elem === elem.ownerDocument.body ) {
return jQuery.offset.bodyOffset( elem );
}

getOffset = function( elem, doc, docElem ) {
var computedStyle,
offsetParent = elem.offsetParent,
prevOffsetParent = elem,
doc = elem.ownerDocument,
docElem = doc.documentElement,
body = doc.body,
defaultView = doc.defaultView,
prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
@@ -118,6 +82,29 @@ if ( "getBoundingClientRect" in document.documentElement ) {
};
}

jQuery.fn.offset = function( options ) {
if ( arguments.length ) {
return options === undefined ?
this :
this.each(function( i ) {
jQuery.offset.setOffset( this, options, i );
});
}

var elem = this[0],
doc = elem && elem.ownerDocument;

if ( !doc ) {
return null;
}

if ( elem === doc.body ) {
return jQuery.offset.bodyOffset( elem );
}

return getOffset( elem, doc, doc.documentElement );
};

jQuery.offset = {

bodyOffset: function( body ) {
@@ -223,42 +210,30 @@ jQuery.fn.extend({


// Create scrollLeft and scrollTop methods
jQuery.each( ["Left", "Top"], function( i, name ) {
var method = "scroll" + name;
jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
var top = /Y/.test( prop );

jQuery.fn[ method ] = function( val ) {
var elem, win;

if ( val === undefined ) {
elem = this[ 0 ];

if ( !elem ) {
return null;
return jQuery.access( this, function( elem, method, val ) {
var win = getWindow( elem );

if ( val === undefined ) {
return win ? (prop in win) ? win[ prop ] :
jQuery.support.boxModel && win.document.documentElement[ method ] ||
win.document.body[ method ] :
elem[ method ];
}

win = getWindow( elem );

// Return the scroll offset
return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
jQuery.support.boxModel && win.document.documentElement[ method ] ||
win.document.body[ method ] :
elem[ method ];
}

// Set the scroll offset
return this.each(function() {
win = getWindow( this );

if ( win ) {
win.scrollTo(
!i ? val : jQuery( win ).scrollLeft(),
i ? val : jQuery( win ).scrollTop()
!top ? val : jQuery( win ).scrollLeft(),
top ? val : jQuery( win ).scrollTop()
);

} else {
this[ method ] = val;
elem[ method ] = val;
}
});
}, method, val, arguments.length, null );
};
});

@@ -100,21 +100,27 @@ jQuery.extend({

jQuery.fn.extend({
queue: function( type, data ) {
var setter = 2;

if ( typeof type !== "string" ) {
data = type;
type = "fx";
setter--;
}

if ( data === undefined ) {
if ( arguments.length < setter ) {
return jQuery.queue( this[0], type );
}
return this.each(function() {
var queue = jQuery.queue( this, type, data );

if ( type === "fx" && queue[0] !== "inprogress" ) {
jQuery.dequeue( this, type );
}
});
return data === undefined ?
this :
this.each(function() {
var queue = jQuery.queue( this, type, data );

if ( type === "fx" && queue[0] !== "inprogress" ) {
jQuery.dequeue( this, type );
}
});
},
dequeue: function( type ) {
return this.each(function() {
@@ -158,7 +158,7 @@ test("attr(Hash)", function() {
});

test("attr(String, Object)", function() {
expect(78);
expect(81);

var div = jQuery("div").attr("foo", "bar"),
fail = false;
@@ -353,6 +353,12 @@ test("attr(String, Object)", function() {
+ "</svg>").appendTo("body");
equal( $svg.attr("cx", 100).attr("cx"), "100", "Set attribute on svg element" );
$svg.remove();

// undefined values are chainable
jQuery("#name").attr("maxlength", "5").removeAttr("nonexisting");
equal( typeof jQuery("#name").attr("maxlength", undefined), "object", ".attr('attribute', undefined) is chainable (#5571)" );
equal( jQuery("#name").attr("maxlength", undefined).attr("maxlength"), "5", ".attr('attribute', undefined) does not change value (#5571)" );
equal( jQuery("#name").attr("nonexisting", undefined).attr("nonexisting"), undefined, ".attr('attribute', undefined) does not create attribute (#5571)" );
});

test("attr(jquery_method)", function(){
@@ -222,8 +222,7 @@ test(".data(String) and .data(String, Object)", function() {
div.data("test", "overwritten");
equal( div.data("test"), "overwritten", "Check for overwritten data" );

div.data("test", undefined);
equal( div.data("test"), "overwritten", "Check that data wasn't removed");
equal( div.data("test", undefined).data("test"), "overwritten", "Check that .data('key',undefined) does nothing but is chainable (#5571)");

div.data("test", null);
ok( div.data("test") === null, "Check for null data");
@@ -41,11 +41,16 @@ test("width()", function() {
testWidth( pass );
});

test("width() with function", function() {
test("width(undefined)", function() {
expect(1);
equal(jQuery("#nothiddendiv").width(30).width(undefined).width(), 30, ".width(undefined) is chainable (#5571)");
});

test("width(Function)", function() {
testWidth( fn );
});

test("width() with function args", function() {
test("width(Function(args))", function() {
expect( 2 );

var $div = jQuery("#nothiddendiv");
@@ -90,11 +95,16 @@ test("height()", function() {
testHeight( pass );
});

test("height() with function", function() {
test("height(undefined)", function() {
expect(1);
equal(jQuery("#nothiddendiv").height(30).height(undefined).height(), 30, ".height(undefined) is chainable (#5571)");
});

test("height(Function)", function() {
testHeight( fn );
});

test("height() with function args", function() {
test("height(Function(args))", function() {
expect( 2 );

var $div = jQuery("#nothiddendiv");
@@ -16,6 +16,11 @@ test("text()", function() {
notEqual( jQuery(document).text(), "", "Retrieving text for the document retrieves all text (#10724).");
});

test("text(undefined)", function() {
expect(1);
equal( jQuery("#foo").text("<div").text(undefined)[0].innerHTML, "&lt;div", ".text(undefined) is chainable (#5571)" );
});

var testText = function(valueObj) {
expect(4);
var val = valueObj("<div><b>Hello</b> cruel world!</div>");
@@ -1207,6 +1212,11 @@ test("clone() on XML nodes", function() {
});
}

test("html(undefined)", function() {
expect(1);
equal( jQuery("#foo").html("<i>test</i>").html(undefined).html().toLowerCase(), "<i>test</i>", ".html(undefined) is chainable (#5571)" );
});

var testHtml = function(valueObj) {
expect(34);

@@ -342,7 +342,7 @@ testoffset("table", function( jQuery ) {
});

testoffset("scroll", function( jQuery, win ) {
expect(22);
expect(24);

var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;

@@ -362,8 +362,9 @@ testoffset("scroll", function( jQuery, win ) {
equal( jQuery("#scroll-1-1").scrollTop(), 0, "jQuery('#scroll-1-1').scrollTop()" );
equal( jQuery("#scroll-1-1").scrollLeft(), 0, "jQuery('#scroll-1-1').scrollLeft()" );

// equal( jQuery("body").scrollTop(), 0, "jQuery("body").scrollTop()" );
// equal( jQuery("body").scrollLeft(), 0, "jQuery("body").scrollTop()" );
// scroll method chaining
equal( jQuery("#scroll-1").scrollTop(undefined).scrollTop(), 5, ".scrollTop(undefined) is chainable (#5571)" );
equal( jQuery("#scroll-1").scrollLeft(undefined).scrollLeft(), 5, ".scrollLeft(undefined) is chainable (#5571)" );

win.name = "test";

@@ -405,11 +406,12 @@ testoffset("body", function( jQuery ) {
equal( jQuery("body").offset().left, 1, "jQuery('#body').offset().left" );
});

test("Chaining offset(coords) returns jQuery object", function() {
expect(2);
test("chaining", function() {
expect(3);
var coords = { top: 1, left: 1 };
equal( jQuery("#absolute-1").offset(coords).selector, "#absolute-1", "offset(coords) returns jQuery object" );
equal( jQuery("#non-existent").offset(coords).selector, "#non-existent", "offset(coords) with empty jQuery set returns jQuery object" );
equal( jQuery("#absolute-1").offset(undefined).selector, "#absolute-1", "offset(undefined) returns jQuery object (#5571)" );
});

test("offsetParent", function(){
@@ -1,7 +1,7 @@
module("queue", { teardown: moduleTeardown });

test("queue() with other types",function() {
expect(11);
expect(12);
var counter = 0;

stop();
@@ -36,6 +36,8 @@ test("queue() with other types",function() {

equal( $div.queue("foo").length, 4, "Testing queue length" );

equal( $div.queue("foo", undefined).queue("foo").length, 4, ".queue('name',undefined) does nothing but is chainable (#5571)");

$div.dequeue("foo");

equal( counter, 3, "Testing previous call to dequeue" );
@@ -289,4 +291,4 @@ test("promise()", function() {
jQuery.each( objects, function() {
this.dequeue();
});
});
});