@@ -93,12 +93,12 @@ QUnit.test( "attr(String)", function( assert ) {
assert.equal( jQuery( "#area1" ).attr( "maxLength" ), "30", "Check for maxLength attribute" );

// using innerHTML in IE causes href attribute to be serialized to the full path
jQuery( "<a/>" ).attr( {
jQuery( "<a></a>" ).attr( {
"id": "tAnchor5",
"href": "#5"
} ).appendTo( "#qunit-fixture" );
assert.equal( jQuery( "#tAnchor5" ).attr( "href" ), "#5", "Check for non-absolute href (an anchor)" );
jQuery( "<a id='tAnchor6' href='#5' />" ).appendTo( "#qunit-fixture" );
jQuery( "<a id='tAnchor6' href='#5'></a>" ).appendTo( "#qunit-fixture" );
assert.equal( jQuery( "#tAnchor5" ).prop( "href" ), jQuery( "#tAnchor6" ).prop( "href" ), "Check for absolute href prop on an anchor" );

jQuery( "<script type='jquery/test' src='#5' id='scriptSrc'></script>" ).appendTo( "#qunit-fixture" );
@@ -136,7 +136,7 @@ QUnit.test( "attr(String)", function( assert ) {
assert.equal( $img.attr( "height" ), "53", "Retrieve height attribute on an element with display:none." );

// Check for style support
styleElem = jQuery( "<div/>" ).appendTo( "#qunit-fixture" ).css( {
styleElem = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ).css( {
background: "url(UPPERlower.gif)"
} );
assert.ok( !!~styleElem.attr( "style" ).indexOf( "UPPERlower.gif" ), "Check style attribute getter" );
@@ -158,11 +158,11 @@ QUnit.test( "attr(String)", function( assert ) {
$a = jQuery( "<a href='#' onclick='something()'>Click</a>" ).appendTo( "#qunit-fixture" );
assert.equal( $a.attr( "onclick" ), "something()", "Retrieve ^on attribute without anonymous function wrapper." );

assert.ok( jQuery( "<div/>" ).attr( "doesntexist" ) === undefined, "Make sure undefined is returned when no attribute is found." );
assert.ok( jQuery( "<div/>" ).attr( "title" ) === undefined, "Make sure undefined is returned when no attribute is found." );
assert.equal( jQuery( "<div/>" ).attr( "title", "something" ).attr( "title" ), "something", "Set the title attribute." );
assert.ok( jQuery( "<div></div>" ).attr( "doesntexist" ) === undefined, "Make sure undefined is returned when no attribute is found." );
assert.ok( jQuery( "<div></div>" ).attr( "title" ) === undefined, "Make sure undefined is returned when no attribute is found." );
assert.equal( jQuery( "<div></div>" ).attr( "title", "something" ).attr( "title" ), "something", "Set the title attribute." );
assert.ok( jQuery().attr( "doesntexist" ) === undefined, "Make sure undefined is returned when no element is there." );
assert.equal( jQuery( "<div/>" ).attr( "value" ), undefined, "An unset value on a div returns undefined." );
assert.equal( jQuery( "<div></div>" ).attr( "value" ), undefined, "An unset value on a div returns undefined." );
assert.strictEqual( jQuery( "<select><option value='property'></option></select>" ).attr( "value" ), undefined, "An unset value on a select returns undefined." );

$form = jQuery( "#form" ).attr( "enctype", "multipart/form-data" );
@@ -180,7 +180,7 @@ QUnit.test( "attr(String) on cloned elements, #9646", function( assert ) {

assert.strictEqual( input.clone( true ).attr( "name", "test" )[ 0 ].name, "test", "Name attribute should be changed on cloned element" );

div = jQuery( "<div id='tester' />" );
div = jQuery( "<div id='tester'></div>" );
div.attr( "id" );

assert.strictEqual( div.clone( true ).attr( "id", "test" )[ 0 ].id, "test", "Id attribute should be changed on cloned element" );
@@ -299,7 +299,7 @@ QUnit.test( "attr(String, Object)", function( assert ) {
$input = jQuery( "<input type='checkbox'/>" ).attr( "checked", true );
assert.equal( $input.prop( "checked" ), true, "Setting checked updates property (verified by .prop)" );
assert.equal( $input[ 0 ].checked, true, "Setting checked updates property (verified by native property)" );
$input = jQuery( "<option/>" ).attr( "selected", true );
$input = jQuery( "<option></option>" ).attr( "selected", true );
assert.equal( $input.prop( "selected" ), true, "Setting selected updates property (verified by .prop)" );
assert.equal( $input[ 0 ].selected, true, "Setting selected updates property (verified by native property)" );

@@ -592,7 +592,7 @@ QUnit.test( "removeAttr(String)", function( assert ) {
assert.expect( 12 );
var $first;

assert.equal( jQuery( "<div class='hello' />" ).removeAttr( "class" ).attr( "class" ), undefined, "remove class" );
assert.equal( jQuery( "<div class='hello'></div>" ).removeAttr( "class" ).attr( "class" ), undefined, "remove class" );
assert.equal( jQuery( "#form" ).removeAttr( "id" ).attr( "id" ), undefined, "Remove id" );
assert.equal( jQuery( "#foo" ).attr( "style", "position:absolute;" ).removeAttr( "style" ).attr( "style" ), undefined, "Check removing style attribute" );
assert.equal( jQuery( "#form" ).attr( "style", "position:absolute;" ).removeAttr( "style" ).attr( "style" ), undefined, "Check removing style attribute on a form" );
@@ -692,7 +692,7 @@ QUnit.test( "prop(String, Object)", function( assert ) {
assert.equal( jQuery( "#select2" ).prop( "selectedIndex" ), 3, "Check for selectedIndex attribute" );
assert.equal( jQuery( "#foo" ).prop( "nodeName" ).toUpperCase(), "DIV", "Check for nodeName attribute" );
assert.equal( jQuery( "#foo" ).prop( "tagName" ).toUpperCase(), "DIV", "Check for tagName attribute" );
assert.equal( jQuery( "<option/>" ).prop( "selected" ), false, "Check selected attribute on disconnected element." );
assert.equal( jQuery( "<option></option>" ).prop( "selected" ), false, "Check selected attribute on disconnected element." );

assert.equal( jQuery( "#listWithTabIndex" ).prop( "tabindex" ), 5, "Check retrieving tabindex" );
jQuery( "#text1" ).prop( "readonly", true );
@@ -837,16 +837,16 @@ QUnit.test( "option.prop('selected', true) affects select.selectedIndex (gh-2732

function addOptions( $elem ) {
return $elem.append(
jQuery( "<option/>" ).val( "a" ).text( "One" ),
jQuery( "<option/>" ).val( "b" ).text( "Two" ),
jQuery( "<option/>" ).val( "c" ).text( "Three" )
jQuery( "<option></option>" ).val( "a" ).text( "One" ),
jQuery( "<option></option>" ).val( "b" ).text( "Two" ),
jQuery( "<option></option>" ).val( "c" ).text( "Three" )
)
.find( "[value=a]" ).prop( "selected", true ).end()
.find( "[value=c]" ).prop( "selected", true ).end();
}

var $optgroup,
$select = jQuery( "<select/>" );
$select = jQuery( "<select></select>" );

// Check select with options
addOptions( $select ).appendTo( "#qunit-fixture" );
@@ -856,7 +856,7 @@ QUnit.test( "option.prop('selected', true) affects select.selectedIndex (gh-2732
$select.empty();

// Check select with optgroup
$optgroup = jQuery( "<optgroup/>" );
$optgroup = jQuery( "<optgroup></optgroup>" );
addOptions( $optgroup ).appendTo( $select );
$select.find( "[value=b]" ).prop( "selected", true );

@@ -970,7 +970,7 @@ QUnit.test( "val()", function( assert ) {
assert.equal( $button.val(), "foobar", "Value retrieval on a button does not return innerHTML" );
assert.equal( $button.val( "baz" ).html(), "text", "Setting the value does not change innerHTML" );

assert.equal( jQuery( "<option/>" ).val( "test" ).attr( "value" ), "test", "Setting value sets the value attribute" );
assert.equal( jQuery( "<option></option>" ).val( "test" ).attr( "value" ), "test", "Setting value sets the value attribute" );
} );

QUnit.test( "val() with non-matching values on dropdown list", function( assert ) {
@@ -1029,7 +1029,7 @@ var testVal = function( valueObj, assert ) {
assert.equal( document.getElementById( "text1" ).value, "", "Check for modified (via val(null)) value of input element" );

var j,
$select = jQuery( "<select multiple><option value='1'/><option value='2'/></select>" ),
$select = jQuery( "<select multiple><option value='1'></option><option value='2'></option></select>" ),
$select1 = jQuery( "#select1" );

$select1.val( valueObj( "3" ) );
@@ -1145,7 +1145,7 @@ QUnit.test( "val(select) after form.reset() (Bug #2551)", function( assert ) {
QUnit.test( "select.val(space characters) (gh-2978)", function( assert ) {
assert.expect( 37 );

var $select = jQuery( "<select/>" ).appendTo( "#qunit-fixture" ),
var $select = jQuery( "<select></select>" ).appendTo( "#qunit-fixture" ),
spaces = {
"\\t": {
html: "&#09;",
@@ -1230,7 +1230,7 @@ var testAddClass = function( valueObj, assert ) {
j.addClass( valueObj( "asdf" ) );
assert.ok( j.hasClass( "asdf" ), "Check node,textnode,comment for addClass" );

div = jQuery( "<div/>" );
div = jQuery( "<div></div>" );

div.addClass( valueObj( "test" ) );
assert.equal( div.attr( "class" ), "test", "Make sure there's no extra whitespace." );
@@ -1669,17 +1669,17 @@ QUnit.test( "coords returns correct values in IE6/IE7, see #10828", function( as
assert.expect( 1 );

var area,
map = jQuery( "<map />" );
map = jQuery( "<map></map>" );

area = map.html( "<area shape='rect' coords='0,0,0,0' href='#' alt='a' />" ).find( "area" );
area = map.html( "<area shape='rect' coords='0,0,0,0' href='#' alt='a'></area>" ).find( "area" );
assert.equal( area.attr( "coords" ), "0,0,0,0", "did not retrieve coords correctly" );
} );

QUnit.test( "should not throw at $(option).val() (#14686)", function( assert ) {
assert.expect( 1 );

try {
jQuery( "<option/>" ).val();
jQuery( "<option></option>" ).val();
assert.ok( true );
} catch ( _ ) {
assert.ok( false );
@@ -4,14 +4,14 @@ if ( jQuery.ajax ) {
QUnit.test( "ajax", function( assert ) {
assert.expect( 4 );

var done = jQuery.map( new Array( 3 ), function() { return assert.async(); } );
var done = assert.async( 3 );

jQuery.ajax( {
type: "GET",
url: url( "mock.php?action=name&name=foo" ),
success: function( msg ) {
assert.strictEqual( msg, "bar", "Check for GET" );
done.pop()();
done();
}
} );

@@ -21,22 +21,22 @@ QUnit.test( "ajax", function( assert ) {
data: "name=peter",
success: function( msg ) {
assert.strictEqual( msg, "pan", "Check for POST" );
done.pop()();
done();
}
} );

jQuery( "#first" ).load( url( "name.html" ), function() {
assert.ok( /^ERROR/.test( jQuery( "#first" ).text() ),
"Check if content was injected into the DOM" );
done.pop()();
done();
} );
} );
}

QUnit.test( "attributes", function( assert ) {
assert.expect( 6 );

var a = jQuery( "<a/>" ).appendTo( "#qunit-fixture" ),
var a = jQuery( "<a></a>" ).appendTo( "#qunit-fixture" ),
input = jQuery( "<input/>" ).appendTo( "#qunit-fixture" );

assert.strictEqual( a.attr( "foo", "bar" ).attr( "foo" ), "bar", ".attr getter/setter" );
@@ -56,7 +56,7 @@ if ( jQuery.css ) {
QUnit.test( "css", function( assert ) {
assert.expect( 1 );

var div = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
var div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

assert.strictEqual( div.css( "width", "50px" ).css( "width" ), "50px", ".css getter/setter" );
} );
@@ -66,7 +66,7 @@ if ( jQuery.fn.show && jQuery.fn.hide ) {
QUnit.test( "show/hide", function( assert ) {
assert.expect( 2 );

var div = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
var div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

div.hide();
assert.strictEqual( div.css( "display" ), "none", "div hidden" );
@@ -76,12 +76,11 @@ QUnit.test( "show/hide", function( assert ) {
}

QUnit.test( "core", function( assert ) {
assert.expect( 18 );
assert.expect( 17 );

var elem = jQuery( "<div></div><span></span>" );

assert.strictEqual( elem.length, 2, "Correct number of elements" );
assert.strictEqual( jQuery.trim( " hello " ), "hello", "jQuery.trim" );

assert.ok( jQuery.isPlainObject( { "a": 2 } ), "jQuery.isPlainObject(object)" );
assert.ok( !jQuery.isPlainObject( "foo" ), "jQuery.isPlainObject(String)" );
@@ -127,7 +126,7 @@ QUnit.test( "core", function( assert ) {
QUnit.test( "data", function( assert ) {
assert.expect( 4 );

var elem = jQuery( "<div data-c='d'/>" ).appendTo( "#qunit-fixture" );
var elem = jQuery( "<div data-c='d'></div>" ).appendTo( "#qunit-fixture" );

assert.ok( !jQuery.hasData( elem[ 0 ] ), "jQuery.hasData - false" );
assert.strictEqual( elem.data( "a", "b" ).data( "a" ), "b", ".data getter/setter" );
@@ -139,7 +138,7 @@ QUnit.test( "dimensions", function( assert ) {
assert.expect( 3 );

var elem = jQuery(
"<div style='margin: 10px; padding: 7px; border: 2px solid black;' /> "
"<div style='margin: 10px; padding: 7px; border: 2px solid black;'></div> "
).appendTo( "#qunit-fixture" );

assert.strictEqual( elem.width( 50 ).width(), 50, ".width getter/setter" );
@@ -150,7 +149,7 @@ QUnit.test( "dimensions", function( assert ) {
QUnit.test( "event", function( assert ) {
assert.expect( 1 );

var elem = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
var elem = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

elem
.on( "click", function() {
@@ -169,12 +168,12 @@ QUnit.test( "manipulation", function( assert ) {

var child,
elem1 = jQuery( "<div><span></span></div>" ).appendTo( "#qunit-fixture" ),
elem2 = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
elem2 = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

assert.strictEqual( elem1.text( "foo" ).text(), "foo", ".html getter/setter" );

assert.strictEqual(
elem1.html( "<span/>" ).html(),
elem1.html( "<span></span>" ).html(),
"<span></span>",
".html getter/setter"
);
@@ -183,8 +182,8 @@ QUnit.test( "manipulation", function( assert ) {
assert.strictEqual( elem1.prepend( elem2 )[ 0 ].childNodes[ 0 ], elem2[ 0 ], ".prepend" );

child = elem1.find( "span" );
child.after( "<a/>" );
child.before( "<b/>" );
child.after( "<a></a>" );
child.before( "<b></b>" );

assert.strictEqual(
elem1.html(),
@@ -198,8 +197,8 @@ QUnit.test( "manipulation", function( assert ) {
QUnit[ /jsdom\//.test( navigator.userAgent ) ? "skip" : "test" ]( "offset", function( assert ) {
assert.expect( 3 );

var parent = jQuery( "<div style='position:fixed;top:20px;'/>" ).appendTo( "#qunit-fixture" ),
elem = jQuery( "<div style='position:absolute;top:5px;'/>" ).appendTo( parent );
var parent = jQuery( "<div style='position:fixed;top:20px;'></div>" ).appendTo( "#qunit-fixture" ),
elem = jQuery( "<div style='position:absolute;top:5px;'></div>" ).appendTo( parent );

assert.strictEqual( elem.offset().top, 25, ".offset getter" );
assert.strictEqual( elem.position().top, 5, ".position getter" );
@@ -4,6 +4,12 @@ QUnit.module( "callbacks", {

( function() {

if ( !jQuery.Callbacks ) {
return;
}

( function() {

var output,
addToOutput = function( string ) {
return function() {
@@ -387,3 +393,5 @@ QUnit.test( "jQuery.Callbacks() - list with memory stays locked (gh-3469)", func
cb.fire();
assert.equal( fired, 11, "Post-lock() fire ignored" );
} );

} )();
@@ -23,9 +23,9 @@ QUnit.test( "jQuery()", function( assert ) {

var elem, i,
obj = jQuery( "div" ),
code = jQuery( "<code/>" ),
code = jQuery( "<code></code>" ),
img = jQuery( "<img/>" ),
div = jQuery( "<div/><hr/><code/><b/>" ),
div = jQuery( "<div></div><hr/><code></code><b/>" ),
exec = false,
expected = 23,
attrObj = {
@@ -113,7 +113,7 @@ QUnit.test( "jQuery()", function( assert ) {
elem = jQuery( "\n\n<em>world</em>" )[ 0 ];
assert.equal( elem.nodeName.toLowerCase(), "em", "leading newlines" );

elem = jQuery( "<div/>", attrObj );
elem = jQuery( "<div></div>", attrObj );

if ( jQuery.fn.width ) {
assert.equal( elem[ 0 ].style.width, "10px", "jQuery() quick setter width" );
@@ -197,6 +197,19 @@ QUnit.test( "globalEval execution after script injection (#7862)", function( ass
assert.ok( window.strictEvalTest - now < 500, "Code executed synchronously" );
} );

testIframe(
"globalEval with custom document context",
"core/globaleval-context.html",
function( assert, framejQuery, frameWindow, frameDocument ) {
assert.expect( 2 );

jQuery.globalEval( "window.scriptTest = true;", {}, frameDocument );
assert.ok( !window.scriptTest, "script executed in iframe context" );
assert.ok( frameWindow.scriptTest, "script executed in iframe context" );
}
);


QUnit.test( "noConflict", function( assert ) {
assert.expect( 7 );

@@ -216,28 +229,6 @@ QUnit.test( "noConflict", function( assert ) {
window[ "jQuery" ] = jQuery = $$;
} );

QUnit.test( "trim", function( assert ) {
assert.expect( 13 );

var nbsp = String.fromCharCode( 160 );

assert.equal( jQuery.trim( "hello " ), "hello", "trailing space" );
assert.equal( jQuery.trim( " hello" ), "hello", "leading space" );
assert.equal( jQuery.trim( " hello " ), "hello", "space on both sides" );
assert.equal( jQuery.trim( " " + nbsp + "hello " + nbsp + " " ), "hello", "&nbsp;" );

assert.equal( jQuery.trim(), "", "Nothing in." );
assert.equal( jQuery.trim( undefined ), "", "Undefined" );
assert.equal( jQuery.trim( null ), "", "Null" );
assert.equal( jQuery.trim( 5 ), "5", "Number" );
assert.equal( jQuery.trim( false ), "false", "Boolean" );

assert.equal( jQuery.trim( " " ), "", "space should be trimmed" );
assert.equal( jQuery.trim( "ipad\xA0" ), "ipad", "nbsp should be trimmed" );
assert.equal( jQuery.trim( "\uFEFF" ), "", "zwsp should be trimmed" );
assert.equal( jQuery.trim( "\uFEFF \xA0! | \uFEFF" ), "! |", "leading/trailing should be trimmed" );
} );

QUnit.test( "isPlainObject", function( assert ) {
var done = assert.async();

@@ -380,6 +371,52 @@ QUnit.test( "isXMLDoc - HTML", function( assert ) {
document.body.removeChild( iframe );
} );

QUnit.test( "isXMLDoc - embedded SVG", function( assert ) {
assert.expect( 6 );

var htmlTree = jQuery( "<div>" +
"<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='1' width='1'>" +
"<desc></desc>" +
"</svg>" +
"</div>"
)[ 0 ];

assert.strictEqual( jQuery.isXMLDoc( htmlTree ), false, "disconnected div element" );
assert.strictEqual( jQuery.isXMLDoc( htmlTree.firstChild ), true,
"disconnected HTML-embedded SVG root element" );

assert.strictEqual( jQuery.isXMLDoc( htmlTree.firstChild.firstChild ), true,
"disconnected HTML-embedded SVG child element" );

document.getElementById( "qunit-fixture" ).appendChild( htmlTree );
assert.strictEqual( jQuery.isXMLDoc( htmlTree ), false, "connected div element" );
assert.strictEqual( jQuery.isXMLDoc( htmlTree.firstChild ), true,
"connected HTML-embedded SVG root element" );

assert.strictEqual( jQuery.isXMLDoc( htmlTree.firstChild.firstChild ), true,
"disconnected HTML-embedded SVG child element" );
} );

QUnit.test( "isXMLDoc - XML", function( assert ) {
assert.expect( 8 );

var xml = createDashboardXML();
var svg = jQuery.parseXML(
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" " +
"\"http://www.w3.org/Gaphics/SVG/1.1/DTD/svg11.dtd\">" +
"<svg version='1.1' xmlns='http://www.w3.org/2000/svg'><desc/></svg>"
);
assert.ok( jQuery.isXMLDoc( xml ), "XML document" );
assert.ok( jQuery.isXMLDoc( xml.documentElement ), "XML documentElement" );
assert.ok( jQuery.isXMLDoc( xml.documentElement.firstChild ), "XML child element" );
assert.ok( jQuery.isXMLDoc( jQuery( "tab", xml )[ 0 ] ), "XML tab Element" );

assert.ok( jQuery.isXMLDoc( svg ), "SVG document" );
assert.ok( jQuery.isXMLDoc( svg.documentElement ), "SVG documentElement" );
assert.ok( jQuery.isXMLDoc( svg.documentElement.firstChild ), "SVG child element" );
assert.ok( jQuery.isXMLDoc( jQuery( "desc", svg )[ 0 ] ), "XML desc Element" );
} );

QUnit.test( "XSS via location.hash", function( assert ) {
var done = assert.async();
assert.expect( 1 );
@@ -399,14 +436,6 @@ QUnit.test( "XSS via location.hash", function( assert ) {
}
} );

QUnit.test( "isXMLDoc - XML", function( assert ) {
assert.expect( 3 );
var xml = createDashboardXML();
assert.ok( jQuery.isXMLDoc( xml ), "XML document" );
assert.ok( jQuery.isXMLDoc( xml.documentElement ), "XML documentElement" );
assert.ok( jQuery.isXMLDoc( jQuery( "tab", xml )[ 0 ] ), "XML Tab Element" );
} );

QUnit.test( "jQuery('html')", function( assert ) {
assert.expect( 18 );

@@ -429,7 +458,7 @@ QUnit.test( "jQuery('html')", function( assert ) {

assert.ok( jQuery( "<link rel='stylesheet'/>" )[ 0 ], "Creating a link" );

assert.ok( !jQuery( "<script/>" )[ 0 ].parentNode, "Create a script" );
assert.ok( !jQuery( "<script></script>" )[ 0 ].parentNode, "Create a script" );

assert.ok( jQuery( "<input/>" ).attr( "type", "hidden" ), "Create an input and set the type." );

@@ -497,8 +526,8 @@ QUnit.test( "jQuery('massive html #7990')", function( assert ) {
QUnit.test( "jQuery('html', context)", function( assert ) {
assert.expect( 1 );

var $div = jQuery( "<div/>" )[ 0 ],
$span = jQuery( "<span/>", $div );
var $div = jQuery( "<div></div>" )[ 0 ],
$span = jQuery( "<span></span>", $div );
assert.equal( $span.length, 1, "verify a span created with a div context works, #1763" );
} );

@@ -632,6 +661,18 @@ QUnit.test( "first()/last()", function( assert ) {
assert.deepEqual( $none.last().get(), [], "last() none" );
} );

QUnit.test( "even()/odd()", function( assert ) {
assert.expect( 4 );

var $links = jQuery( "#ap a" ), $none = jQuery( "asdf" );

assert.deepEqual( $links.even().get(), q( "google", "anchor1" ), "even()" );
assert.deepEqual( $links.odd().get(), q( "groups", "mark" ), "odd()" );

assert.deepEqual( $none.even().get(), [], "even() none" );
assert.deepEqual( $none.odd().get(), [], "odd() none" );
} );

QUnit.test( "map()", function( assert ) {
assert.expect( 2 );

@@ -653,7 +694,7 @@ QUnit.test( "map()", function( assert ) {
} );

QUnit.test( "jQuery.map", function( assert ) {
assert.expect( 25 );
assert.expect( 28 );

var i, label, result, callback;

@@ -753,6 +794,24 @@ QUnit.test( "jQuery.map", function( assert ) {
return k % 2 ? k : [ k, k, k ];
} );
assert.equal( result.join( "" ), "00012223", "Array results flattened (#2616)" );

result = jQuery.map( [ [ [ 1, 2 ], 3 ], 4 ], function( v, k ) {
return v;
} );
assert.equal( result.length, 3, "Array flatten only one level down" );
assert.ok( Array.isArray( result[ 0 ] ), "Array flatten only one level down" );

// Support: IE 9 - 11+, Edge 18+, Android Browser 4.0 - 4.3 only, iOS 7 - 11 only,
// Safari 11 only, Firefox <= 61 only
// Skip the test in browsers without Array#flat.
if ( Array.prototype.flat ) {
result = jQuery.map( Array( 300000 ), function( v, k ) {
return k;
} );
assert.equal( result.length, 300000, "Able to map 300000 records without any problems (#4320)" );
} else {
assert.ok( "skip", "Array#flat doesn't supported on all browsers" );
}
} );

QUnit.test( "jQuery.merge()", function( assert ) {
@@ -1297,7 +1356,7 @@ QUnit.test( "jQuery.parseHTML", function( assert ) {
assert.equal( jQuery.parseHTML( "text" )[ 0 ].nodeType, 3, "Parsing text returns a text node" );
assert.equal( jQuery.parseHTML( "\t<div></div>" )[ 0 ].nodeValue, "\t", "Preserve leading whitespace" );

assert.equal( jQuery.parseHTML( " <div/> " )[ 0 ].nodeType, 3, "Leading spaces are treated as text nodes (#11290)" );
assert.equal( jQuery.parseHTML( " <div></div> " )[ 0 ].nodeType, 3, "Leading spaces are treated as text nodes (#11290)" );

html = jQuery.parseHTML( "<div>test div</div>" );

Large diffs are not rendered by default.

@@ -427,7 +427,7 @@ QUnit.test( ".data(Object)", function( assert ) {
assert.expect( 4 );

var obj, jqobj,
div = jQuery( "<div/>" );
div = jQuery( "<div></div>" );

div.data( { "test": "in", "test2": "in2" } );
assert.equal( div.data( "test" ), "in", "Verify setting an object in data" );
@@ -556,7 +556,7 @@ QUnit.test( ".data should not miss preset data-* w/ hyphenated property names",

assert.expect( 2 );

var div = jQuery( "<div/>", { id: "hyphened" } ).appendTo( "#qunit-fixture" ),
var div = jQuery( "<div></div>", { id: "hyphened" } ).appendTo( "#qunit-fixture" ),
test = {
"camelBar": "camelBar",
"hyphen-foo": "hyphen-foo"
@@ -573,7 +573,7 @@ QUnit.test( "jQuery.data should not miss data-* w/ hyphenated property names #14

assert.expect( 1 );

var div = jQuery( "<div/>" );
var div = jQuery( "<div></div>" );

div.data( "foo-bar", "baz" );

@@ -585,14 +585,14 @@ QUnit.test( ".data should not miss attr() set data-* with hyphenated property na

var a, b;

a = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
a = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

a.attr( "data-long-param", "test" );
a.data( "long-param", { a: 2 } );

assert.deepEqual( a.data( "long-param" ), { a: 2 }, "data with property long-param was found, 1" );

b = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
b = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

b.attr( "data-long-param", "test" );
b.data( "long-param" );
@@ -668,7 +668,7 @@ QUnit.test( ".data should not strip more than one hyphen when camelCasing (gh-20

QUnit.test( ".data supports interoperable hyphenated/camelCase get/set of properties with arbitrary non-null|NaN|undefined values", function( assert ) {

var div = jQuery( "<div/>", { id: "hyphened" } ).appendTo( "#qunit-fixture" ),
var div = jQuery( "<div></div>", { id: "hyphened" } ).appendTo( "#qunit-fixture" ),
datas = {
"non-empty": {
key: "nonEmpty",
@@ -736,7 +736,8 @@ QUnit.test( ".data supports interoperable hyphenated/camelCase get/set of proper
} );

QUnit.test( ".data supports interoperable removal of hyphenated/camelCase properties", function( assert ) {
var div = jQuery( "<div/>", { id: "hyphened" } ).appendTo( "#qunit-fixture" ),
var div = jQuery( "<div></div>", { id: "hyphened" } ).appendTo( "#qunit-fixture" ),
rdashAlpha = /-([a-z])/g,
datas = {
"non-empty": "a string",
"empty-string": "",
@@ -755,11 +756,19 @@ QUnit.test( ".data supports interoperable removal of hyphenated/camelCase proper

assert.expect( 27 );

function fcamelCase( all, letter ) {
return letter.toUpperCase();
}

jQuery.each( datas, function( key, val ) {
div.data( key, val );

assert.deepEqual( div.data( key ), val, "get: " + key );
assert.deepEqual( div.data( jQuery.camelCase( key ) ), val, "get: " + jQuery.camelCase( key ) );
assert.deepEqual(
div.data( key.replace( rdashAlpha, fcamelCase ) ),
val,
"get: " + key.replace( rdashAlpha, fcamelCase )
);

div.removeData( key );

@@ -934,7 +943,7 @@ QUnit.test( "Check that the expando is removed when there's no more data", funct
assert.expect( 2 );

var key,
div = jQuery( "<div/>" );
div = jQuery( "<div></div>" );
div.data( "some", "data" );
assert.equal( div.data( "some" ), "data", "Data is added" );
div.removeData( "some" );
@@ -968,7 +977,7 @@ QUnit.test( ".data(prop) does not create expando", function( assert ) {
assert.expect( 1 );

var key,
div = jQuery( "<div/>" );
div = jQuery( "<div></div>" );

div.data( "foo" );
assert.equal( jQuery.hasData( div[ 0 ] ), false, "No data exists after access" );
@@ -980,3 +989,18 @@ QUnit.test( ".data(prop) does not create expando", function( assert ) {
}
}
} );

QUnit.test( "keys matching Object.prototype properties (gh-3256)", function( assert ) {
assert.expect( 2 );

var div = jQuery( "<div></div>" );

assert.strictEqual( div.data( "hasOwnProperty" ), undefined,
"hasOwnProperty not matched (before forced data creation)" );

// Force the creation of a data object for this element.
div.data( { foo: "bar" } );

assert.strictEqual( div.data( "hasOwnProperty" ), undefined,
"hasOwnProperty not matched (after forced data creation)" );
} );
@@ -2,6 +2,12 @@ QUnit.module( "deferred", {
afterEach: moduleTeardown
} );

( function() {

if ( !jQuery.Deferred ) {
return;
}

jQuery.each( [ "", " - new operator" ], function( _, withNew ) {

function createDeferred( fn ) {
@@ -1154,3 +1160,5 @@ QUnit.test( "jQuery.when(...) - opportunistically synchronous", function( assert

when = "after";
} );

} )();
@@ -1,7 +1,7 @@
QUnit.module( "deprecated", { afterEach: moduleTeardown } );


QUnit.test( "bind/unbind", function( assert ) {
QUnit[ jQuery.fn.bind ? "test" : "skip" ]( "bind/unbind", function( assert ) {
assert.expect( 4 );

var markup = jQuery(
@@ -22,7 +22,7 @@ QUnit.test( "bind/unbind", function( assert ) {
.remove();
} );

QUnit.test( "delegate/undelegate", function( assert ) {
QUnit[ jQuery.fn.delegate ? "test" : "skip" ]( "delegate/undelegate", function( assert ) {
assert.expect( 2 );

var markup = jQuery(
@@ -41,28 +41,25 @@ QUnit.test( "delegate/undelegate", function( assert ) {
.remove();
} );

if ( jQuery.fn.hover ) {
QUnit.test( "hover() mouseenter mouseleave", function( assert ) {
assert.expect( 1 );

var times = 0,
handler1 = function() { ++times; },
handler2 = function() { ++times; };

jQuery( "#firstp" )
.hover( handler1, handler2 )
.mouseenter().mouseleave()
.off( "mouseenter", handler1 )
.off( "mouseleave", handler2 )
.hover( handler1 )
.mouseenter().mouseleave()
.off( "mouseenter mouseleave", handler1 )
.mouseenter().mouseleave();

assert.equal( times, 4, "hover handlers fired" );
QUnit[ jQuery.fn.hover ? "test" : "skip" ]( "hover() mouseenter mouseleave", function( assert ) {
assert.expect( 1 );

} );
}
var times = 0,
handler1 = function() { ++times; },
handler2 = function() { ++times; };

jQuery( "#firstp" )
.hover( handler1, handler2 )
.mouseenter().mouseleave()
.off( "mouseenter", handler1 )
.off( "mouseleave", handler2 )
.hover( handler1 )
.mouseenter().mouseleave()
.off( "mouseenter mouseleave", handler1 )
.mouseenter().mouseleave();

assert.equal( times, 4, "hover handlers fired" );
} );


QUnit[ jQuery.fn.click ? "test" : "skip" ]( "trigger() shortcuts", function( assert ) {
@@ -99,10 +96,49 @@ QUnit[ jQuery.fn.click ? "test" : "skip" ]( "trigger() shortcuts", function( ass
assert.equal( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" );
} );

if ( jQuery.ajax && jQuery.fn.ajaxSend ) {
ajaxTest( "jQuery.ajax() - events with context", 12, function( assert ) {
var context = document.createElement( "div" );

function event( e ) {
assert.equal( this, context, e.type );
}

function callback( msg ) {
return function() {
assert.equal( this, context, "context is preserved on callback " + msg );
};
}

return {
setup: function() {
jQuery( context ).appendTo( "#foo" )
.ajaxSend( event )
.ajaxComplete( event )
.ajaxError( event )
.ajaxSuccess( event );
},
requests: [ {
url: url( "name.html" ),
context: context,
beforeSend: callback( "beforeSend" ),
success: callback( "success" ),
complete: callback( "complete" )
}, {
url: url( "404.txt" ),
context: context,
beforeSend: callback( "beforeSend" ),
error: callback( "error" ),
complete: callback( "complete" )
} ]
};
} );
}

QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) {

// Explicitly skipping focus/blur events due to their flakiness
var $elem = jQuery( "<div />" ).appendTo( "#qunit-fixture" ),
var $elem = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ),
aliases = ( "resize scroll click dblclick mousedown mouseup " +
"mousemove mouseover mouseout mouseenter mouseleave change " +
"select submit keydown keypress keyup contextmenu" ).split( " " );
@@ -117,7 +153,7 @@ QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert )
} );
} );

QUnit.test( "jQuery.parseJSON", function( assert ) {
QUnit[ jQuery.parseJSON ? "test" : "skip" ]( "jQuery.parseJSON", function( assert ) {
assert.expect( 20 );

assert.strictEqual( jQuery.parseJSON( null ), null, "primitive null" );
@@ -187,13 +223,13 @@ QUnit.test( "jQuery.parseJSON", function( assert ) {
assert.strictEqual( jQuery.parseJSON( [ 0 ] ), 0, "Input cast to string" );
} );

QUnit.test( "jQuery.isArray", function( assert ) {
QUnit[ jQuery.isArray ? "test" : "skip" ]( "jQuery.isArray", function( assert ) {
assert.expect( 1 );

assert.strictEqual( jQuery.isArray, Array.isArray, "Array.isArray equals jQuery.isArray" );
} );

QUnit.test( "jQuery.nodeName", function( assert ) {
QUnit[ jQuery.nodeName ? "test" : "skip" ]( "jQuery.nodeName", function( assert ) {
assert.expect( 8 );

assert.strictEqual( typeof jQuery.nodeName, "function", "jQuery.nodeName is a function" );
@@ -242,7 +278,7 @@ QUnit.test( "jQuery.nodeName", function( assert ) {
} );


QUnit.test( "type", function( assert ) {
QUnit[ jQuery.type ? "test" : "skip" ]( "type", function( assert ) {
assert.expect( 28 );

assert.equal( jQuery.type( null ), "null", "null" );
@@ -281,14 +317,15 @@ QUnit.test( "type", function( assert ) {
assert.equal( jQuery.type( new MyObject() ), "object", "Object" );
} );

QUnit[ typeof Symbol === "function" ? "test" : "skip" ]( "type for `Symbol`", function( assert ) {
QUnit[ jQuery.type && typeof Symbol === "function" ? "test" : "skip" ](
"type for `Symbol`", function( assert ) {
assert.expect( 2 );

assert.equal( jQuery.type( Symbol() ), "symbol", "Symbol" );
assert.equal( jQuery.type( Object( Symbol() ) ), "symbol", "Symbol" );
} );

QUnit.test( "isFunction", function( assert ) {
QUnit[ jQuery.isFunction ? "test" : "skip" ]( "isFunction", function( assert ) {
assert.expect( 20 );

var mystr, myarr, myfunction, fn, obj, nodes, first, input, a;
@@ -376,7 +413,7 @@ QUnit.test( "isFunction", function( assert ) {
} );
} );

QUnit.test( "isFunction(cross-realm function)", function( assert ) {
QUnit[ jQuery.isFunction ? "test" : "skip" ]( "isFunction(cross-realm function)", function( assert ) {
assert.expect( 1 );

var iframe, doc,
@@ -409,7 +446,7 @@ supportjQuery.each(
fn = Function( "return " + source )();
} catch ( e ) {}

QUnit[ fn ? "test" : "skip" ]( "isFunction(" + subclass + ")",
QUnit[ jQuery.isFunction && fn ? "test" : "skip" ]( "isFunction(" + subclass + ")",
function( assert ) {
assert.expect( 1 );

@@ -419,7 +456,7 @@ supportjQuery.each(
}
);

QUnit[ typeof Symbol === "function" && Symbol.toStringTag ? "test" : "skip" ](
QUnit[ jQuery.isFunction && typeof Symbol === "function" && Symbol.toStringTag ? "test" : "skip" ](
"isFunction(custom @@toStringTag)",
function( assert ) {
assert.expect( 2 );
@@ -434,7 +471,7 @@ QUnit[ typeof Symbol === "function" && Symbol.toStringTag ? "test" : "skip" ](
}
);

QUnit.test( "jQuery.isWindow", function( assert ) {
QUnit[ jQuery.isWindow ? "test" : "skip" ]( "jQuery.isWindow", function( assert ) {
assert.expect( 14 );

assert.ok( jQuery.isWindow( window ), "window" );
@@ -453,7 +490,7 @@ QUnit.test( "jQuery.isWindow", function( assert ) {
assert.ok( !jQuery.isWindow( function() {} ), "function" );
} );

QUnit.test( "jQuery.camelCase()", function( assert ) {
QUnit[ jQuery.camelCase ? "test" : "skip" ]( "jQuery.camelCase()", function( assert ) {

var tests = {
"foo-bar": "fooBar",
@@ -472,13 +509,13 @@ QUnit.test( "jQuery.camelCase()", function( assert ) {
} );
} );

QUnit.test( "jQuery.now", function( assert ) {
QUnit[ jQuery.now ? "test" : "skip" ]( "jQuery.now", function( assert ) {
assert.expect( 1 );

assert.ok( typeof jQuery.now() === "number", "jQuery.now is a function" );
} );

QUnit.test( "jQuery.proxy", function( assert ) {
QUnit[ jQuery.proxy ? "test" : "skip" ]( "jQuery.proxy", function( assert ) {
assert.expect( 9 );

var test2, test3, test4, fn, cb,
@@ -526,7 +563,7 @@ QUnit.test( "jQuery.proxy", function( assert ) {
cb.call( thisObject, "arg3" );
} );

QUnit.test( "isNumeric", function( assert ) {
QUnit[ jQuery.isNumeric ? "test" : "skip" ]( "isNumeric", function( assert ) {
assert.expect( 43 );

var t = jQuery.isNumeric,
@@ -594,9 +631,32 @@ QUnit.test( "isNumeric", function( assert ) {
assert.equal( t( new Date() ), false, "Instance of a Date" );
} );

QUnit[ typeof Symbol === "function" ? "test" : "skip" ]( "isNumeric(Symbol)", function( assert ) {
QUnit[ jQuery.isNumeric && typeof Symbol === "function" ? "test" : "skip" ](
"isNumeric(Symbol)", function( assert ) {
assert.expect( 2 );

assert.equal( jQuery.isNumeric( Symbol() ), false, "Symbol" );
assert.equal( jQuery.isNumeric( Object( Symbol() ) ), false, "Symbol inside an object" );
} );

QUnit[ jQuery.trim ? "test" : "skip" ]( "trim", function( assert ) {
assert.expect( 13 );

var nbsp = String.fromCharCode( 160 );

assert.equal( jQuery.trim( "hello " ), "hello", "trailing space" );
assert.equal( jQuery.trim( " hello" ), "hello", "leading space" );
assert.equal( jQuery.trim( " hello " ), "hello", "space on both sides" );
assert.equal( jQuery.trim( " " + nbsp + "hello " + nbsp + " " ), "hello", "&nbsp;" );

assert.equal( jQuery.trim(), "", "Nothing in." );
assert.equal( jQuery.trim( undefined ), "", "Undefined" );
assert.equal( jQuery.trim( null ), "", "Null" );
assert.equal( jQuery.trim( 5 ), "5", "Number" );
assert.equal( jQuery.trim( false ), "false", "Boolean" );

assert.equal( jQuery.trim( " " ), "", "space should be trimmed" );
assert.equal( jQuery.trim( "ipad\xA0" ), "ipad", "nbsp should be trimmed" );
assert.equal( jQuery.trim( "\uFEFF" ), "", "zwsp should be trimmed" );
assert.equal( jQuery.trim( "\uFEFF \xA0! | \uFEFF" ), "! |", "leading/trailing should be trimmed" );
} );
@@ -342,7 +342,7 @@ QUnit.test( "getting dimensions shouldn't modify runtimeStyle see #9233", functi
QUnit.test( "table dimensions", function( assert ) {
assert.expect( 2 );

var table = jQuery( "<table><colgroup><col/><col/></colgroup><tbody><tr><td></td><td>a</td></tr><tr><td></td><td>a</td></tr></tbody></table>" ).appendTo( "#qunit-fixture" ),
var table = jQuery( "<table><colgroup><col></col><col></col></colgroup><tbody><tr><td></td><td>a</td></tr><tr><td></td><td>a</td></tr></tbody></table>" ).appendTo( "#qunit-fixture" ),
tdElem = table.find( "td" ).first(),
colElem = table.find( "col" ).first().width( 300 );

@@ -536,7 +536,7 @@ QUnit.test( "allow modification of coordinates argument (gh-1848)", function( as
assert.expect( 1 );

var offsetTop,
element = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
element = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

element.offset( function( index, coords ) {
coords.top = 100;
@@ -583,7 +583,7 @@ QUnit.test( "width/height on element with transform (gh-3193)", function( assert

assert.expect( 2 );

var $elem = jQuery( "<div style='width: 200px; height: 200px; transform: scale(2);' />" )
var $elem = jQuery( "<div style='width: 200px; height: 200px; transform: scale(2);'></div>" )
.appendTo( "#qunit-fixture" );

assert.equal( $elem.width(), 200, "Width ignores transforms" );
@@ -627,7 +627,14 @@ QUnit.test( "width/height on an inline element with percentage dimensions (gh-36
}
);

QUnit.test( "width/height on a table row with phantom borders (gh-3698)", function( assert ) {
// Support: Firefox 70+
// Firefox 70 & newer fail this test but the issue there is more profound - Firefox doesn't
// subtract borders from table row computed widths.
// See https://github.com/jquery/jquery/issues/4529
// See https://bugzilla.mozilla.org/show_bug.cgi?id=1590837
// See https://github.com/w3c/csswg-drafts/issues/4444
QUnit[ /firefox/i.test( navigator.userAgent ) ? "skip" : "test" ](
"width/height on a table row with phantom borders (gh-3698)", function( assert ) {
assert.expect( 4 );

jQuery( "<table id='gh3698' style='border-collapse: separate; border-spacing: 0;'><tbody>" +
@@ -656,7 +663,7 @@ QUnit.test( "interaction with scrollbars (gh-3589)", function( assert ) {
return old + adjustment;
};
},
parent = jQuery( "<div/>" )
parent = jQuery( "<div></div>" )
.css( { position: "absolute", width: "1000px", height: "1000px" } )
.appendTo( "#qunit-fixture" ),
fraction = jQuery.support.boxSizingReliable() ?
@@ -665,7 +672,7 @@ QUnit.test( "interaction with scrollbars (gh-3589)", function( assert ) {
borderWidth = 1,
padding = 2,
size = 100 + fraction,
plainBox = jQuery( "<div />" )
plainBox = jQuery( "<div></div>" )
.css( {
"box-sizing": "content-box",
position: "absolute",
@@ -752,24 +759,24 @@ QUnit.test( "interaction with scrollbars (gh-3589)", function( assert ) {

QUnit.test( "outerWidth/Height for table cells and textarea with border-box in IE 11 (gh-4102)", function( assert ) {
assert.expect( 5 );
var $table = jQuery( "<table class='border-box' style='border-collapse: separate' />" ).appendTo( "#qunit-fixture" ),
$thead = jQuery( "<thead />" ).appendTo( $table ),
$firstTh = jQuery( "<th style='width: 200px;padding: 5px' />" ),
$secondTh = jQuery( "<th style='width: 190px;padding: 5px' />" ),
$thirdTh = jQuery( "<th style='width: 180px;padding: 5px' />" ),
var $table = jQuery( "<table class='border-box' style='border-collapse: separate'></table>" ).appendTo( "#qunit-fixture" ),
$thead = jQuery( "<thead></thead>" ).appendTo( $table ),
$firstTh = jQuery( "<th style='width: 200px;padding: 5px'></th>" ),
$secondTh = jQuery( "<th style='width: 190px;padding: 5px'></th>" ),
$thirdTh = jQuery( "<th style='width: 180px;padding: 5px'></th>" ),

// Support: Firefox 63, Edge 16-17, Android 8, iOS 7-11
// These browsers completely ignore the border-box and height settings
// The computed height is instead just line-height + border
// Either way, what we're doing in css.js is correct
$td = jQuery( "<td style='height: 20px;padding: 5px;border: 1px solid;line-height:18px'>text</td>" ),

$tbody = jQuery( "<tbody />" ).appendTo( $table ),
$textarea = jQuery( "<textarea style='height: 0;padding: 2px;border: 1px solid;box-sizing: border-box' />" ).appendTo( "#qunit-fixture" );
$tbody = jQuery( "<tbody></tbody>" ).appendTo( $table ),
$textarea = jQuery( "<textarea style='height: 0;padding: 2px;border: 1px solid;box-sizing: border-box'></textarea>" ).appendTo( "#qunit-fixture" );

jQuery( "<tr />" ).appendTo( $thead ).append( $firstTh );
jQuery( "<tr />" ).appendTo( $thead ).append( $secondTh );
jQuery( "<tr />" ).appendTo( $thead ).append( $thirdTh );
jQuery( "<tr></tr>" ).appendTo( $thead ).append( $firstTh );
jQuery( "<tr></tr>" ).appendTo( $thead ).append( $secondTh );
jQuery( "<tr></tr>" ).appendTo( $thead ).append( $thirdTh );
jQuery( "<tr><td></td></tr>" ).appendTo( $tbody ).append( $td );

assert.strictEqual( $firstTh.outerWidth(), 200, "First th has outerWidth 200." );
@@ -221,8 +221,11 @@ supportjQuery.each( hideOptions, function( type, setup ) {
assert.expectJqData( this, $span, "olddisplay" );
} );

QUnit[ document.body.attachShadow ? "test" : "skip" ](
"Persist correct display value - " + type + " hidden, shadow child", function( assert ) {
QUnit[
document.body.attachShadow && document.body.getRootNode ?
"test" :
"skip"
]( "Persist correct display value - " + type + " hidden, shadow child", function( assert ) {
assert.expect( 3 );

jQuery( "<div id='shadowHost'></div>" ).appendTo( "#qunit-fixture" );
@@ -602,7 +605,7 @@ QUnit.test( "animate duration 0", function( assert ) {
} );
this.clock.tick( 200 );

$elem = jQuery( "<div />" );
$elem = jQuery( "<div></div>" );
$elem.show( 0, function() {
assert.ok( true, "Show callback with no duration" );
} );
@@ -1299,7 +1302,7 @@ QUnit.test( "animate with CSS shorthand properties", function( assert ) {
QUnit.test( "hide hidden elements, with animation (bug #7141)", function( assert ) {
assert.expect( 4 );

var div = jQuery( "<div id='bug7141' style='display:none'/>" ).appendTo( "#qunit-fixture" );
var div = jQuery( "<div id='bug7141' style='display:none'></div>" ).appendTo( "#qunit-fixture" );
assert.equal( div.css( "display" ), "none", "Element is initially hidden" );
div.hide( 10, function() {
assert.equal( div.css( "display" ), "none", "Element is hidden in .hide() callback" );
@@ -1600,10 +1603,10 @@ QUnit.test( "animate should set display for disconnected nodes", function( asser
toggle: [ 1 ],
slideToggle: []
},
$divEmpty = jQuery( "<div/>" ),
$divEmpty = jQuery( "<div></div>" ),
$divTest = jQuery( "<div>test</div>" ),
$divNone = jQuery( "<div style='display: none;'/>" ),
$divInline = jQuery( "<div style='display: inline;'/>" ),
$divNone = jQuery( "<div style='display: none;'></div>" ),
$divInline = jQuery( "<div style='display: inline;'></div>" ),
nullParentDisplay = $divEmpty.css( "display" ),
underFragmentDisplay = $divTest.css( "display" ),
clock = this.clock;
@@ -1623,7 +1626,7 @@ QUnit.test( "animate should set display for disconnected nodes", function( asser
assert.expectJqData( env, $divNone[ 0 ], "olddisplay" );

jQuery.each( showMethods, function( name, opt ) {
jQuery.fn[ name ].apply( jQuery( "<div/>" ), opt.concat( [ function() {
jQuery.fn[ name ].apply( jQuery( "<div></div>" ), opt.concat( [ function() {
assert.strictEqual( jQuery( this ).css( "display" ), nullParentDisplay,
"." + name + " block with null parentNode" );
} ] ) );
@@ -1634,7 +1637,7 @@ QUnit.test( "animate should set display for disconnected nodes", function( asser
} ] ) );
} );
jQuery.each( toggleMethods, function( name, opt ) {
jQuery.fn[ name ].apply( jQuery( "<div/>" ), opt.concat( [ function() {
jQuery.fn[ name ].apply( jQuery( "<div></div>" ), opt.concat( [ function() {
assert.strictEqual( jQuery( this ).css( "display" ), "none",
"." + name + " block with null parentNode" );
} ] ) );
@@ -2359,8 +2362,8 @@ QUnit.test( "Respect display value on inline elements (#14824)", function( asser
assert.expect( 2 );

var clock = this.clock,
fromStyleSheet = jQuery( "<span id='span-14824' />" ),
fromStyleAttr = jQuery( "<span style='display: block;' />" );
fromStyleSheet = jQuery( "<span id='span-14824'></span>" ),
fromStyleAttr = jQuery( "<span style='display: block;'></span>" );

jQuery( "#qunit-fixture" ).append( fromStyleSheet, fromStyleAttr );

@@ -2460,7 +2463,7 @@ QUnit.test( "jQuery.easing._default in Tween (gh-2218)", function( assert ) {
QUnit.test( "Display value is correct for disconnected nodes (trac-13310)", function( assert ) {
assert.expect( 3 );

var div = jQuery( "<div/>" );
var div = jQuery( "<div></div>" );

assert.equal( div.css( "display", "inline" ).hide().show().appendTo( "body" ).css( "display" ), "inline", "Initialized display value has returned" );
div.remove();
@@ -2481,7 +2484,7 @@ QUnit.test( "Show/hide/toggle and display: inline", function( assert ) {

var clock = this.clock;

jQuery( "<span/><div style='display:inline' title='inline div'/>" ).each( function() {
jQuery( "<span></span><div style='display:inline' title='inline div'></div>" ).each( function() {
var completed, interrupted,
N = 100,
fixture = jQuery( "#qunit-fixture" ),
@@ -153,7 +153,7 @@ QUnit.test( "on(), multiple events at once and namespaces", function( assert ) {
var cur, div,
obj = {};

div = jQuery( "<div/>" ).on( "focusin.a", function( e ) {
div = jQuery( "<div></div>" ).on( "focusin.a", function( e ) {
assert.equal( e.type, cur, "Verify right single event was fired." );
} );

@@ -163,7 +163,7 @@ QUnit.test( "on(), multiple events at once and namespaces", function( assert ) {
// manually clean up detached elements
div.remove();

div = jQuery( "<div/>" ).on( "click mouseover", obj, function( e ) {
div = jQuery( "<div></div>" ).on( "click mouseover", obj, function( e ) {
assert.equal( e.type, cur, "Verify right multi event was fired." );
assert.equal( e.data, obj, "Make sure the data came in correctly." );
} );
@@ -177,7 +177,7 @@ QUnit.test( "on(), multiple events at once and namespaces", function( assert ) {
// manually clean up detached elements
div.remove();

div = jQuery( "<div/>" ).on( "focusin.a focusout.b", function( e ) {
div = jQuery( "<div></div>" ).on( "focusin.a focusout.b", function( e ) {
assert.equal( e.type, cur, "Verify right multi event was fired." );
} );

@@ -195,7 +195,7 @@ QUnit.test( "on(), namespace with special add", function( assert ) {
assert.expect( 27 );

var i = 0,
div = jQuery( "<div/>" ).appendTo( "#qunit-fixture" ).on( "test", function() {
div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ).on( "test", function() {
assert.ok( true, "Test event fired." );
} );

@@ -244,7 +244,7 @@ QUnit.test( "on(), namespace with special add", function( assert ) {
// Should trigger 4
div.off( "test" );

div = jQuery( "<div/>" ).on( "test", function() {
div = jQuery( "<div></div>" ).on( "test", function() {
assert.ok( true, "Test event fired." );
} );

@@ -876,7 +876,7 @@ QUnit.test( "mouseover triggers mouseenter", function( assert ) {
assert.expect( 1 );

var count = 0,
elem = jQuery( "<a />" );
elem = jQuery( "<a></a>" );
elem.on( "mouseenter", function() {
count++;
} );
@@ -890,7 +890,7 @@ QUnit.test( "pointerover triggers pointerenter", function( assert ) {
assert.expect( 1 );

var count = 0,
elem = jQuery( "<a />" );
elem = jQuery( "<a></a>" );
elem.on( "pointerenter", function() {
count++;
} );
@@ -1075,7 +1075,7 @@ QUnit.test( "submit event bubbles on copied forms (#11649)", function( assert )
var $formByClone, $formByHTML,
$testForm = jQuery( "#testForm" ),
$fixture = jQuery( "#qunit-fixture" ),
$wrapperDiv = jQuery( "<div/>" ).appendTo( $fixture );
$wrapperDiv = jQuery( "<div></div>" ).appendTo( $fixture );

function noSubmit( e ) {
e.preventDefault();
@@ -1111,7 +1111,7 @@ QUnit.test( "change event bubbles on copied forms (#11796)", function( assert )
var $formByClone, $formByHTML,
$form = jQuery( "#form" ),
$fixture = jQuery( "#qunit-fixture" ),
$wrapperDiv = jQuery( "<div/>" ).appendTo( $fixture );
$wrapperDiv = jQuery( "<div></div>" ).appendTo( $fixture );

function delegatedChange() {
assert.ok( true, "Make sure change event bubbles up." );
@@ -1141,7 +1141,7 @@ QUnit.test( "trigger(eventObject, [data], [fn])", function( assert ) {
assert.expect( 28 );

var event,
$parent = jQuery( "<div id='par' />" ).appendTo( "body" ),
$parent = jQuery( "<div id='par'></div>" ).appendTo( "body" ),
$child = jQuery( "<p id='child'>foo</p>" ).appendTo( $parent );

$parent.get( 0 ).style.display = "none";
@@ -1317,7 +1317,7 @@ QUnit.test( "Delegated events with malformed selectors (gh-3071)", function( ass
jQuery( "#foo" ).on( "click", "nonexistent:not", function() {} );
}, "short-circuitable malformed selector throws on attach" );

jQuery( "#foo > :first-child" ).click();
jQuery( "#foo > :first-child" ).trigger( "click" );
assert.ok( true, "malformed selector does not throw on event" );
} );

@@ -1796,6 +1796,49 @@ QUnit.test( "jQuery.off using dispatched jQuery.Event", function( assert ) {
.remove();
} );

QUnit.test( "events with type matching an Object.prototype property (gh-3256)", function( assert ) {
assert.expect( 1 );

var elem = jQuery( "<div></div>" ),
eventFired = false;

elem.appendTo( "#qunit-fixture" );

try {
elem
.one( "hasOwnProperty", function() {
eventFired = true;
} )
.trigger( "hasOwnProperty" );
} finally {
assert.strictEqual( eventFired, true, "trigger fired without crashing" );
}
} );

QUnit.test( "events with type matching an Object.prototype property, cloned element (gh-3256)",
function( assert ) {
assert.expect( 1 );

var elem = jQuery( "<div></div>" ),
eventFired = false;

elem.appendTo( "#qunit-fixture" );

try {
// Make sure the original element has some event data.
elem.on( "click", function() {} );

elem
.clone( true )
.one( "hasOwnProperty", function() {
eventFired = true;
} )
.trigger( "hasOwnProperty" );
} finally {
assert.strictEqual( eventFired, true, "trigger fired without crashing" );
}
} );

// selector-native does not support scope-fixing in delegation
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "delegated event with delegateTarget-relative selector", function( assert ) {
assert.expect( 3 );
@@ -2490,7 +2533,7 @@ QUnit.test( "drag/drop events copy mouse-related event properties (gh-1925, gh-2

fireNative( $fixture[ 0 ], "drop" );

$fixture.unbind( "dragmove drop" ).remove();
$fixture.off( "dragmove drop" ).remove();
} );

QUnit.test( "focusin using non-element targets", function( assert ) {
@@ -2512,38 +2555,81 @@ testIframe(
function( assert, framejQuery, frameWin, frameDoc ) {
assert.expect( 1 );

var input = jQuery( frameDoc ).find( "#frame-input" );
var done = assert.async(),
focus = false,
input = jQuery( frameDoc ).find( "#frame-input" );

// Create a focusin handler on the parent; shouldn't affect the iframe's fate
jQuery( "body" ).on( "focusin.iframeTest", function() {
assert.ok( false, "fired a focusin event in the parent document" );

// Support: IE 9 - 11+
// IE does propagate the event to the parent document. In this test
// we mainly care about the inner element so we'll just skip this one
// assertion in IE.
if ( !document.documentMode ) {
assert.ok( false, "fired a focusin event in the parent document" );
}
} );

input.on( "focusin", function() {
focus = true;
assert.ok( true, "fired a focusin event in the iframe" );
} );

// Avoid a native event; Chrome can't force focus to another frame
input.trigger( "focusin" );

// Must manually remove handler to avoid leaks in our data store
input.remove();

// Be sure it was removed; nothing should happen
input.trigger( "focusin" );
input[ 0 ].focus();

// Remove body handler manually since it's outside the fixture
jQuery( "body" ).off( "focusin.iframeTest" );

setTimeout( function() {

// DOM focus is unreliable in TestSwarm
if ( QUnit.isSwarm && !focus ) {
assert.ok( true, "GAP: Could not observe focus change" );
}

done();
}, 50 );
}
);

QUnit.test( "focusin on document & window", function( assert ) {
assert.expect( 1 );

var counter = 0,
input = jQuery( "<input />" );

input.appendTo( "#qunit-fixture" );

input[ 0 ].focus();

jQuery( window ).on( "focusout", function() {
counter++;
} );
jQuery( document ).on( "focusout", function() {
counter++;
} );

input[ 0 ].blur();

// DOM focus is unreliable in TestSwarm
if ( QUnit.isSwarm && counter === 0 ) {
assert.ok( true, "GAP: Could not observe focus change" );
}

assert.strictEqual( counter, 2,
"focusout handlers on document/window fired once only" );
} );

testIframe(
"jQuery.ready promise",
"event/promiseReady.html",
function( assert, jQuery, window, document, isOk ) {
assert.expect( 1 );
assert.ok( isOk, "$.when( $.ready ) works" );
}
},
jQuery.when ? QUnit.test : QUnit.skip
);

// need PHP here to make the incepted IFRAME hang
@@ -2739,7 +2825,7 @@ QUnit.test( ".off() removes the expando when there's no more data", function( as
assert.expect( 2 );

var key,
div = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );

div.on( "click", false );
div.on( "custom", function() {
@@ -2806,6 +2892,15 @@ QUnit.test( "preventDefault() on focusin does not throw exception", function( as
}, QUnit.config.testTimeout / 4 || 1000 );
} );

QUnit.test( ".on('focus', fn) on a text node doesn't throw", function( assert ) {
assert.expect( 1 );

jQuery( document.createTextNode( "text" ) )
.on( "focus", function() {} );

assert.ok( true, "No crash" );
} );

QUnit.test( "Donor event interference", function( assert ) {
assert.expect( 8 );

@@ -3041,6 +3136,49 @@ QUnit.test( "focus-blur order (#12868)", function( assert ) {
}, 50 );
} );

QUnit.test( "Event handling works with multiple async focus events (gh-4350)", function( assert ) {
assert.expect( 3 );

var remaining = 3,
input = jQuery( "#name" ),

// Support: IE <=9 - 11+
// focus and blur events are asynchronous; this is the resulting mess.
// The browser window must be topmost for this to work properly!!
done = assert.async();

input
.on( "focus", function() {
remaining--;
assert.ok( true, "received focus event, expecting " + remaining + " more" );
if ( remaining > 0 ) {
input.trigger( "blur" );
} else {
done();
}
} )
.on( "blur", function() {
setTimeout( function() {
input.trigger( "focus" );
} );
} );

// gain focus
input.trigger( "focus" );

// DOM focus is unreliable in TestSwarm
setTimeout( function() {
if ( QUnit.isSwarm && remaining === 3 ) {
assert.ok( true, "GAP: Could not observe focus change" );
assert.ok( true, "GAP: Could not observe focus change" );
assert.ok( true, "GAP: Could not observe focus change" );
setTimeout( function() {
done();
} );
}
} );
} );

QUnit.test( "native-backed events preserve trigger data (gh-1741, gh-4139)", function( assert ) {
assert.expect( 17 );

Large diffs are not rendered by default.

@@ -5,7 +5,7 @@ if ( !jQuery.fn.offset ) {
}

var supportsFixedPosition, supportsScroll, alwaysScrollable,
forceScroll = supportjQuery( "<div/>" ).css( { width: 2000, height: 2000 } ),
forceScroll = supportjQuery( "<div></div>" ).css( { width: 2000, height: 2000 } ),
checkSupport = function( assert ) {

// Only run once
@@ -81,7 +81,7 @@ QUnit.test( "disconnected element", function( assert ) {
QUnit.test( "hidden (display: none) element", function( assert ) {
assert.expect( 4 );

var node = jQuery( "<div style='display: none' />" ).appendTo( "#qunit-fixture" ),
var node = jQuery( "<div style='display: none'></div>" ).appendTo( "#qunit-fixture" ),
result = node.offset();

node.remove();
@@ -98,7 +98,7 @@ QUnit.test( "hidden (display: none) element", function( assert ) {
QUnit.test( "0 sized element", function( assert ) {
assert.expect( 4 );

var node = jQuery( "<div style='margin: 5px; width: 0; height: 0' />" ).appendTo( "#qunit-fixture" ),
var node = jQuery( "<div style='margin: 5px; width: 0; height: 0'></div>" ).appendTo( "#qunit-fixture" ),
result = node.offset();

node.remove();
@@ -112,7 +112,7 @@ QUnit.test( "0 sized element", function( assert ) {
QUnit.test( "hidden (visibility: hidden) element", function( assert ) {
assert.expect( 4 );

var node = jQuery( "<div style='margin: 5px; visibility: hidden' />" ).appendTo( "#qunit-fixture" ),
var node = jQuery( "<div style='margin: 5px; visibility: hidden'></div>" ).appendTo( "#qunit-fixture" ),
result = node.offset();

node.remove();
@@ -785,7 +785,7 @@ QUnit.test( "offsetParent", function( assert ) {
QUnit.test( "fractions (see #7730 and #7885)", function( assert ) {
assert.expect( 2 );

jQuery( "body" ).append( "<div id='fractions'/>" );
jQuery( "body" ).append( "<div id='fractions'></div>" );

var result,
expected = { "top": 1000, "left": 1000 },
@@ -806,7 +806,7 @@ QUnit.test( "fractions (see #7730 and #7885)", function( assert ) {
// Support: Chrome <=45 - 46
// In recent Chrome these values differ a little.
assert.ok( Math.abs( result.top - expected.top ) < 0.25, "Check top within 0.25 of expected" );
assert.equal( result.left, expected.left, "Check left" );
assert.ok( Math.abs( result.left - expected.left ) < 0.25, "Check left within 0.25 of expected" );

div.remove();
} );
@@ -1,5 +1,11 @@
QUnit.module( "queue", { afterEach: moduleTeardown } );

( function() {

if ( !jQuery.fn.queue ) {
return;
}

QUnit.test( "queue() with other types", function( assert ) {
var done = assert.async( 2 );
assert.expect( 14 );
@@ -271,64 +277,63 @@ QUnit.test( ".promise(obj)", function( assert ) {
assert.strictEqual( promise, obj, ".promise(type, obj) returns obj" );
} );

if ( jQuery.fn.stop ) {
QUnit.test( "delay() can be stopped", function( assert ) {
var done = assert.async();
assert.expect( 3 );
var storage = {};
jQuery( {} )
.queue( "alternate", function( next ) {
storage.alt1 = true;
assert.ok( true, "This first function was dequeued" );
next();
} )
.delay( 1000, "alternate" )
.queue( "alternate", function() {
storage.alt2 = true;
assert.ok( true, "The function was dequeued immediately, the delay was stopped" );
} )
.dequeue( "alternate" )

// stop( "alternate", false ) will NOT clear the queue, so it should automatically dequeue the next
.stop( "alternate", false, false )

// this test
.delay( 1 )
.queue( function() {
storage.default1 = true;
assert.ok( false, "This queue should never run" );
} )

// stop( clearQueue ) should clear the queue
.stop( true, false );

assert.deepEqual( storage, { alt1: true, alt2: true }, "Queue ran the proper functions" );
QUnit[ jQuery.fn.stop ? "test" : "skip" ]( "delay() can be stopped", function( assert ) {
var done = assert.async();
assert.expect( 3 );
var storage = {};
jQuery( {} )
.queue( "alternate", function( next ) {
storage.alt1 = true;
assert.ok( true, "This first function was dequeued" );
next();
} )
.delay( 1000, "alternate" )
.queue( "alternate", function() {
storage.alt2 = true;
assert.ok( true, "The function was dequeued immediately, the delay was stopped" );
} )
.dequeue( "alternate" )

setTimeout( function() {
done();
}, 1500 );
} );
// stop( "alternate", false ) will NOT clear the queue, so it should automatically dequeue the next
.stop( "alternate", false, false )

QUnit.test( "queue stop hooks", function( assert ) {
assert.expect( 2 );
var done = assert.async();
var foo = jQuery( "#foo" );
// this test
.delay( 1 )
.queue( function() {
storage.default1 = true;
assert.ok( false, "This queue should never run" );
} )

foo.queue( function( next, hooks ) {
hooks.stop = function( gotoEnd ) {
assert.equal( !!gotoEnd, false, "Stopped without gotoEnd" );
};
} );
foo.stop();
// stop( clearQueue ) should clear the queue
.stop( true, false );

foo.queue( function( next, hooks ) {
hooks.stop = function( gotoEnd ) {
assert.equal( gotoEnd, true, "Stopped with gotoEnd" );
done();
};
} );
assert.deepEqual( storage, { alt1: true, alt2: true }, "Queue ran the proper functions" );

setTimeout( function() {
done();
}, 1500 );
} );

QUnit[ jQuery.fn.stop ? "test" : "skip" ]( "queue stop hooks", function( assert ) {
assert.expect( 2 );
var done = assert.async();
var foo = jQuery( "#foo" );

foo.queue( function( next, hooks ) {
hooks.stop = function( gotoEnd ) {
assert.equal( !!gotoEnd, false, "Stopped without gotoEnd" );
};
} );
foo.stop();

foo.stop( false, true );
foo.queue( function( next, hooks ) {
hooks.stop = function( gotoEnd ) {
assert.equal( gotoEnd, true, "Stopped with gotoEnd" );
done();
};
} );

} // if ( jQuery.fn.stop )
foo.stop( false, true );
} );

} )();
@@ -2,7 +2,7 @@ QUnit.module( "ready" );

( function() {
var notYetReady, noEarlyExecution,
whenified = jQuery.when( jQuery.ready ),
whenified = jQuery.when && jQuery.when( jQuery.ready ),
promisified = Promise.resolve( jQuery.ready ),
start = new Date(),
order = [],
@@ -105,33 +105,33 @@ QUnit.module( "ready" );
} );
} );

QUnit.test( "jQuery.when(jQuery.ready)", function( assert ) {
QUnit[ jQuery.when ? "test" : "skip" ]( "jQuery.when(jQuery.ready)", function( assert ) {
assert.expect( 2 );
var done = jQuery.map( new Array( 2 ), function() { return assert.async(); } );
var done = assert.async( 2 );

whenified.then( function() {
assert.ok( jQuery.isReady, "jQuery.when Deferred resolved" );
done.pop()();
done();
} );

jQuery.when( jQuery.ready ).then( function() {
assert.ok( jQuery.isReady, "jQuery.when Deferred resolved" );
done.pop()();
done();
} );
} );

QUnit.test( "Promise.resolve(jQuery.ready)", function( assert ) {
assert.expect( 2 );
var done = jQuery.map( new Array( 2 ), function() { return assert.async(); } );
var done = assert.async( 2 );

promisified.then( function() {
assert.ok( jQuery.isReady, "Native promised resolved" );
done.pop()();
done();
} );

Promise.resolve( jQuery.ready ).then( function() {
assert.ok( jQuery.isReady, "Native promised resolved" );
done.pop()();
done();
} );
} );

@@ -149,15 +149,18 @@ QUnit.module( "ready" );
} );
} );

testIframe(
"holdReady test needs to be a standalone test since it deals with DOM ready",
"readywait.html",
function( assert, jQuery, window, document, releaseCalled ) {
assert.expect( 2 );
var now = new Date();
assert.ok( now - start >= 300, "Needs to have waited at least half a second" );
assert.ok( releaseCalled, "The release function was called, which resulted in ready" );
}
);
// jQuery.holdReady is deprecated, skip the test if it was excluded.
if ( jQuery.holdReady ) {
testIframe(
"holdReady test needs to be a standalone test since it deals with DOM ready",
"readywait.html",
function( assert, jQuery, window, document, releaseCalled ) {
assert.expect( 2 );
var now = new Date();
assert.ok( now - start >= 300, "Needs to have waited at least half a second" );
assert.ok( releaseCalled, "The release function was called, which resulted in ready" );
}
);
}

} )();
@@ -92,7 +92,7 @@ QUnit.test( "name", function( assert ) {
QUnit.test( "selectors with comma", function( assert ) {
assert.expect( 4 );

var fixture = jQuery( "<div><h2><span/></h2><div><p><span/></p><p/></div></div>" );
var fixture = jQuery( "<div><h2><span></span></h2><div><p><span></span></p><p></p></div></div>" );

assert.equal( fixture.find( "h2, div p" ).filter( "p" ).length, 2, "has to find two <p>" );
assert.equal( fixture.find( "h2, div p" ).filter( "h2" ).length, 1, "has to find one <h2>" );
@@ -275,7 +275,7 @@ QUnit.test( "attributes", function( assert ) {
QUnit.test( "disconnected nodes", function( assert ) {
assert.expect( 1 );

var $div = jQuery( "<div/>" );
var $div = jQuery( "<div></div>" );
assert.equal( $div.is( "div" ), true, "Make sure .is('nodeName') works on disconnected nodes." );
} );

@@ -77,7 +77,7 @@ QUnit.test( "jQuery.param()", function( assert ) {
assert.equal( jQuery.param( params ), "", "jQuery.param( undefined ) === empty string" );
} );

QUnit.test( "jQuery.param() not affected by ajaxSettings", function( assert ) {
QUnit[ jQuery.ajax ? "test" : "skip" ]( "jQuery.param() not affected by ajaxSettings", function( assert ) {
assert.expect( 1 );

var oldTraditional = jQuery.ajaxSettings.traditional;
@@ -55,7 +55,7 @@ testIframe(
);

( function() {
var expected,
var browserKey, expected,
userAgent = window.navigator.userAgent,
expectedMap = {
edge: {
@@ -68,11 +68,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": false,
"scrollboxSize": true
},
ie_10_11: {
@@ -85,11 +87,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": true,
"noCloneChecked": false,
"option": true,
"optSelected": false,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": false,
"reliableMarginLeft": true,
"reliableTrDimensions": false,
"scrollboxSize": true
},
ie_9: {
@@ -102,11 +106,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": true,
"noCloneChecked": false,
"option": false,
"optSelected": false,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": false,
"reliableMarginLeft": true,
"reliableTrDimensions": false,
"scrollboxSize": false
},
chrome: {
@@ -119,11 +125,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
safari: {
@@ -136,11 +144,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
safari_9_10: {
@@ -153,11 +163,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": false,
"pixelPosition": false,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
firefox: {
@@ -170,11 +182,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
firefox_60: {
@@ -187,11 +201,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": true,
"reliableMarginLeft": false,
"reliableTrDimensions": true,
"scrollboxSize": true
},
ios: {
@@ -204,11 +220,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": true,
"pixelPosition": true,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
ios_9_10: {
@@ -221,11 +239,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": false,
"pixelPosition": false,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
ios_8: {
@@ -238,11 +258,13 @@ testIframe(
"createHTMLDocument": false,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": false,
"pixelPosition": false,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
ios_7: {
@@ -255,11 +277,13 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": false,
"pixelPosition": false,
"radioValue": true,
"reliableMarginLeft": true,
"reliableTrDimensions": true,
"scrollboxSize": true
},
android: {
@@ -272,15 +296,25 @@ testIframe(
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"option": true,
"optSelected": true,
"pixelBoxStyles": false,
"pixelPosition": false,
"radioValue": true,
"reliableMarginLeft": false,
"reliableTrDimensions": true,
"scrollboxSize": true
}
};

// Make the slim build pass tests.
for ( browserKey in expectedMap ) {
if ( !jQuery.ajax ) {
delete expectedMap[ browserKey ].ajax;
delete expectedMap[ browserKey ].cors;
}
}

if ( /edge\//i.test( userAgent ) ) {
expected = expectedMap.edge;
} else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) {
@@ -292,24 +326,24 @@ testIframe(
// Catches Chrome on Android as well (i.e. the default
// Android browser on Android >= 4.4).
expected = expectedMap.chrome;
} else if ( /\b(?:11|12)\.\d(\.\d+)* safari/i.test( userAgent ) ) {
expected = expectedMap.safari;
} else if ( /\b(?:9|10)\.\d(\.\d+)* safari/i.test( userAgent ) ) {
} else if ( /\b(?:9|10)\.\d+(\.\d+)* safari/i.test( userAgent ) ) {
expected = expectedMap.safari_9_10;
} else if ( /firefox\/(?:52|60)/i.test( userAgent ) ) {
} else if ( /firefox\/(?:4\d|5\d|60)/i.test( userAgent ) ) {
expected = expectedMap.firefox_60;
} else if ( /firefox/i.test( userAgent ) ) {
expected = expectedMap.firefox;
} else if ( /(?:iphone|ipad);.*(?:iphone)? os (?:11|12)_/i.test( userAgent ) ) {
expected = expectedMap.ios;
} else if ( /android 4\.[0-3]/i.test( userAgent ) ) {
expected = expectedMap.android;
} else if ( /iphone os (?:9|10)_/i.test( userAgent ) ) {
expected = expectedMap.ios_9_10;
} else if ( /iphone os 8_/i.test( userAgent ) ) {
expected = expectedMap.ios_8;
} else if ( /iphone os 7_/i.test( userAgent ) ) {
expected = expectedMap.ios_7;
} else if ( /android 4\.[0-3]/i.test( userAgent ) ) {
expected = expectedMap.android;
} else if ( /(?:iphone|ipad);.*(?:iphone)? os \d+_/i.test( userAgent ) ) {
expected = expectedMap.ios;
} else if ( /\b\d+(\.\d+)+ safari/i.test( userAgent ) ) {
expected = expectedMap.safari;
}

QUnit.test( "Verify that support tests resolve as expected per browser", function( assert ) {
@@ -197,7 +197,7 @@ QUnit.test( "index()", function( assert ) {

assert.equal( jQuery( "#text2" ).index(), 2, "Returns the index of a child amongst its siblings" );

assert.equal( jQuery( "<div/>" ).index(), -1, "Node without parent returns -1" );
assert.equal( jQuery( "<div></div>" ).index(), -1, "Node without parent returns -1" );
} );

QUnit.test( "index(Object|String|undefined)", function( assert ) {
@@ -502,7 +502,7 @@ QUnit.test( "has(Element)", function( assert ) {
obj = jQuery( "#qunit-fixture" ).has( jQuery( "#sndp" )[ 0 ] );
assert.deepEqual( obj.get(), q( "qunit-fixture" ), "Keeps elements that have the element as a descendant" );

detached = jQuery( "<a><b><i/></b></a>" );
detached = jQuery( "<a><b><i></i></b></a>" );
assert.deepEqual( detached.has( detached.find( "i" )[ 0 ] ).get(), detached.get(), "...Even when detached" );

multipleParent = jQuery( "#qunit-fixture, #header" ).has( jQuery( "#sndp" )[ 0 ] );
@@ -517,7 +517,7 @@ QUnit.test( "has(Selector)", function( assert ) {
obj = jQuery( "#qunit-fixture" ).has( "#sndp" );
assert.deepEqual( obj.get(), q( "qunit-fixture" ), "Keeps elements that have any element matching the selector as a descendant" );

detached = jQuery( "<a><b><i/></b></a>" );
detached = jQuery( "<a><b><i></i></b></a>" );
assert.deepEqual( detached.has( "i" ).get(), detached.get(), "...Even when detached" );

multipleParent = jQuery( "#qunit-fixture, #header" ).has( "#sndp" );
@@ -538,7 +538,7 @@ QUnit.test( "has(Arrayish)", function( assert ) {
simple = jQuery( "#qunit-fixture" ).has( jQuery( "#sndp" ) );
assert.deepEqual( simple.get(), q( "qunit-fixture" ), "Keeps elements that have any element in the jQuery list as a descendant" );

detached = jQuery( "<a><b><i/></b></a>" );
detached = jQuery( "<a><b><i></i></b></a>" );
assert.deepEqual( detached.has( detached.find( "i" ) ).get(), detached.get(), "...Even when detached" );

multipleParent = jQuery( "#qunit-fixture, #header" ).has( jQuery( "#sndp" ) );
@@ -566,7 +566,7 @@ QUnit.test( "siblings([String])", function( assert ) {
var set = q( "sndp", "en", "sap" );
assert.deepEqual( jQuery( "#en, #sndp" ).siblings().get(), set, "Check for unique results from siblings" );
assert.deepEqual( jQuery( "#option5a" ).siblings( "option[data-attr]" ).get(), q( "option5c" ), "Has attribute selector in siblings (#9261)" );
assert.equal( jQuery( "<a/>" ).siblings().length, 0, "Detached elements have no siblings (#11370)" );
assert.equal( jQuery( "<a></a>" ).siblings().length, 0, "Detached elements have no siblings (#11370)" );
} );

QUnit[ jQuery.find.compile ? "test" : "skip" ]( "siblings([String])", function( assert ) {
@@ -733,7 +733,7 @@ QUnit.test( "contents()", function( assert ) {

assert.equal( jQuery( "div", ibody ).text(), "span text", "Make sure the correct div is still left after deletion in IFrame" );

jQuery( "<table/>", ibody ).append( "<tr><td>cell</td></tr>" ).appendTo( ibody );
jQuery( "<table></table>", ibody ).append( "<tr><td>cell</td></tr>" ).appendTo( ibody );
jQuery( "table", ibody ).remove();
assert.equal( jQuery( "div", ibody ).length, 1, "Check for JS error on add and delete of a table in IFrame" );

@@ -761,7 +761,7 @@ QUnit.test( "contents() for <template />", function( assert ) {

assert.equal( contents.find( "span" ).text(), "Hello, Web Component!", "Find span in template and check its text" );

jQuery( "<div id='templateTest' />" ).append(
jQuery( "<div id='templateTest'></div>" ).append(
jQuery( jQuery.map( contents, function( node ) {
return document.importNode( node, true );
} ) )
@@ -808,6 +808,19 @@ QUnit.test( "contents() for <object />", function( assert ) {
jQuery( "#qunit-fixture" ).append( svgObject );
} );

QUnit.test( "contents() for <object /> with children", function( assert ) {
assert.expect( 1 );

var object = "<object type='application/x-shockwave-flash' width='200' height='300' id='penguin'>" +
"<param name='movie' value='flash/penguin.swf'>" +
"<param name='quality' value='high'>" +
"<img src='images/penguin.jpg' width='200' height='300' alt='Penguin'>" +
"</object>";

var contents = jQuery( object ).contents();
assert.equal( contents.length, 3, "Check object contents children are correct" );
} );

QUnit.test( "contents() for <frame />", function( assert ) {
assert.expect( 2 );

@@ -862,7 +875,7 @@ QUnit.test( "add(String selector)", function( assert ) {
"Check elements from document"
);

divs = jQuery( "<div/>" ).add( "#sndp" );
divs = jQuery( "<div></div>" ).add( "#sndp" );
assert.ok( divs[ 0 ].parentNode, "Sort with the disconnected node last (started with disconnected first)." );
} );

@@ -880,7 +893,7 @@ QUnit.test( "add(String html)", function( assert ) {
assert.expect( 3 );

var x,
divs = jQuery( "#sndp" ).add( "<div/>" );
divs = jQuery( "#sndp" ).add( "<div></div>" );

assert.ok( !divs[ 1 ].parentNode, "Sort with the disconnected node last." );

@@ -893,7 +906,7 @@ QUnit.test( "add(jQuery)", function( assert ) {
assert.expect( 4 );

var x,
tmp = jQuery( "<div/>" );
tmp = jQuery( "<div></div>" );

x = jQuery( [] )
.add(
@@ -922,7 +935,7 @@ QUnit.test( "add(Element)", function( assert ) {
assert.expect( 2 );

var x,
tmp = jQuery( "<div/>" );
tmp = jQuery( "<div></div>" );

x = jQuery( [] ).add( jQuery( "<p id='x1'>xxx</p>" ).appendTo( tmp )[ 0 ] ).add( jQuery( "<p id='x2'>xxx</p>" ).appendTo( tmp )[ 0 ] );
assert.equal( x[ 0 ].id, "x1", "Check on-the-fly element1" );
@@ -74,7 +74,7 @@ function testWrap( val, assert ) {
cacheLength++;
}

j = jQuery( "<label/>" ).wrap( val( "<li/>" ) );
j = jQuery( "<label></label>" ).wrap( val( "<li></li>" ) );
assert.equal(
j[ 0 ] .nodeName.toUpperCase(), "LABEL", "Element is a label"
);
@@ -90,7 +90,7 @@ function testWrap( val, assert ) {
);

// Wrap an element containing a text node
j = jQuery( "<span/>" ).wrap( "<div>test</div>" );
j = jQuery( "<span></span>" ).wrap( "<div>test</div>" );
assert.equal(
j[ 0 ].previousSibling.nodeType, 3, "Make sure the previous node is a text element"
);
@@ -112,7 +112,7 @@ function testWrap( val, assert ) {
);

// Wrap an element with a jQuery set
j = jQuery( "<span/>" ).wrap( jQuery( "<div></div>" ) );
j = jQuery( "<span></span>" ).wrap( jQuery( "<div></div>" ) );
assert.equal(
j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works."
);
@@ -128,7 +128,7 @@ function testWrap( val, assert ) {
jQuery( this ).off();
} );

j = jQuery( "<span/>" ).wrap( result );
j = jQuery( "<span></span>" ).wrap( result );
assert.equal(
j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works."
);
@@ -313,7 +313,7 @@ QUnit.test( "wrapInner(Element)", function( assert ) {
assert.expect( 5 );

var num,
div = jQuery( "<div/>" );
div = jQuery( "<div></div>" );

num = jQuery( "#first" ).children().length;
jQuery( "#first" ).wrapInner( document.getElementById( "empty" ) );
@@ -375,7 +375,7 @@ QUnit.test( "wrapInner(Function) returns Element", function( assert ) {

var num,
val = manipulationFunctionReturningObj,
div = jQuery( "<div/>" );
div = jQuery( "<div></div>" );

num = jQuery( "#first" ).children().length;
jQuery( "#first" ).wrapInner( val( document.getElementById( "empty" ) ) );