jquery/test/unit/manipulation.js
Timmy Willison fc864c83c8
Build: upgrade dependencies, including eslint 9.4.0 and uglify 3.7.7
- Sinon is already at the latest version that supports IE9.
- Upgraded uglify to 3.7.7, which is the latest that worked with IE9.
  I tried 3.9.4, which we are using in jquery-migrate, and 3.8.1,
  but there were failures in traversing ("Permission denied" errors).
- Upgraded eslint to version 9, which required some changes.
  Mainly, unused arguments in catch expressions error by default in 9+.
  The config now makes use of `caughtErrorsIgnorePattern`,
  which is set to `"^_"`, the same as unused function params.
- Ignored main branch dist files when switching branches.

Closes gh-5508
2024-06-15 09:10:59 -04:00

3113 lines
112 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

QUnit.module( "manipulation", {
afterEach: moduleTeardown
} );
// Ensure that an extended Array prototype doesn't break jQuery
Array.prototype.arrayProtoFn = function() {
};
function manipulationBareObj( value ) {
return value;
}
function manipulationFunctionReturningObj( value ) {
return function() {
return value;
};
}
/*
======== local reference =======
manipulationBareObj and manipulationFunctionReturningObj can be used to test passing functions to setters
See testVal below for an example
bareObj( value );
This function returns whatever value is passed in
functionReturningObj( value );
Returns a function that returns the value
*/
QUnit.test( "text()", function( assert ) {
assert.expect( 6 );
var expected, frag, $newLineTest, doc;
expected = "This link has class=\"blog\": Simon Willison's Weblog";
assert.equal( jQuery( "#sap" ).text(), expected, "Check for merged text of more then one element." );
// Check serialization of text values
assert.equal( jQuery( document.createTextNode( "foo" ) ).text(), "foo", "Text node was retrieved from .text()." );
assert.notEqual( jQuery( document ).text(), "", "Retrieving text for the document retrieves all text (trac-10724)." );
// Retrieve from document fragments trac-10864
frag = document.createDocumentFragment();
frag.appendChild( document.createTextNode( "foo" ) );
assert.equal( jQuery( frag ).text(), "foo", "Document Fragment Text node was retrieved from .text()." );
$newLineTest = jQuery( "<div>test<br/>testy</div>" ).appendTo( "#moretests" );
$newLineTest.find( "br" ).replaceWith( "\n" );
assert.equal( $newLineTest.text(), "test\ntesty", "text() does not remove new lines (trac-11153)" );
$newLineTest.remove();
if ( !document.documentMode || document.documentMode > 9 ) {
doc = new DOMParser().parseFromString( "<span>example</span>", "text/html" );
assert.equal( jQuery( doc ).text(), "example", "text() on HTMLDocument (gh-5264)" );
} else {
assert.ok( true, "IE 9 doesn't support DOMParser's parseFromString with text/html" );
}
} );
QUnit.test( "text(undefined)", function( assert ) {
assert.expect( 1 );
assert.equal( jQuery( "#foo" ).text( "<div" ).text( undefined )[ 0 ].innerHTML, "&lt;div", ".text(undefined) is chainable (trac-5571)" );
} );
function testText( valueObj, assert ) {
assert.expect( 6 );
var val, j, expected, $multipleElements, $parentDiv, $childDiv;
val = valueObj( "<div><b>Hello</b> cruel world!</div>" );
assert.equal( 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
j = jQuery( "#nonnodes" ).contents();
j.text( valueObj( "hi!" ) );
assert.equal( jQuery( j[ 0 ] ).text(), "hi!", "Check node,textnode,comment with text()" );
assert.equal( j[ 1 ].nodeValue, " there ", "Check node,textnode,comment with text()" );
assert.equal( j[ 2 ].nodeType, 8, "Check node,textnode,comment with text()" );
// Update multiple elements trac-11809
expected = "New";
$multipleElements = jQuery( "<div>Hello</div>" ).add( "<div>World</div>" );
$multipleElements.text( expected );
assert.equal( $multipleElements.eq( 0 ).text(), expected, "text() updates multiple elements (trac-11809)" );
assert.equal( $multipleElements.eq( 1 ).text(), expected, "text() updates multiple elements (trac-11809)" );
// Prevent memory leaks trac-11809
$childDiv = jQuery( "<div></div>" );
$childDiv.data( "leak", true );
$parentDiv = jQuery( "<div></div>" );
$parentDiv.append( $childDiv );
$parentDiv.text( "Dry off" );
}
QUnit.test( "text(String)", function( assert ) {
testText( manipulationBareObj, assert );
} );
QUnit.test( "text(Function)", function( assert ) {
testText( manipulationFunctionReturningObj, assert );
} );
QUnit.test( "text(Function) with incoming value", function( assert ) {
assert.expect( 2 );
var old = "This link has class=\"blog\": Simon Willison's Weblog";
jQuery( "#sap" ).text( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return "foobar";
} );
assert.equal( jQuery( "#sap" ).text(), "foobar", "Check for merged text of more then one element." );
} );
function testAppendForObject( valueObj, isFragment, assert ) {
var $base,
type = isFragment ? " (DocumentFragment)" : " (Element)",
text = "This link has class=\"blog\": Simon Willison's Weblog",
el = document.getElementById( "sap" ).cloneNode( true ),
first = document.getElementById( "first" ),
yahoo = document.getElementById( "yahoo" );
if ( isFragment ) {
$base = document.createDocumentFragment();
jQuery( el ).contents().each( function() {
$base.appendChild( this );
} );
$base = jQuery( $base );
} else {
$base = jQuery( el );
}
assert.equal( $base.clone().append( valueObj( first.cloneNode( true ) ) ).text(),
text + "Try them out:",
"Check for appending of element" + type
);
assert.equal( $base.clone().append( valueObj( [ first.cloneNode( true ), yahoo.cloneNode( true ) ] ) ).text(),
text + "Try them out:Yahoo",
"Check for appending of array of elements" + type
);
assert.equal( $base.clone().append( valueObj( jQuery( "#yahoo, #first" ).clone() ) ).text(),
text + "YahooTry them out:",
"Check for appending of jQuery object" + type
);
assert.equal( $base.clone().append( valueObj( 5 ) ).text(),
text + "5",
"Check for appending a number" + type
);
assert.equal( $base.clone().append( valueObj( [ jQuery( "#first" ).clone(), jQuery( "#yahoo, #google" ).clone() ] ) ).text(),
text + "Try them out:GoogleYahoo",
"Check for appending of array of jQuery objects"
);
assert.equal( $base.clone().append( valueObj( " text with spaces " ) ).text(),
text + " text with spaces ",
"Check for appending text with spaces" + type
);
assert.equal( $base.clone().append( valueObj( [] ) ).text(),
text,
"Check for appending an empty array" + type
);
assert.equal( $base.clone().append( valueObj( "" ) ).text(),
text,
"Check for appending an empty string" + type
);
assert.equal( $base.clone().append( valueObj( document.getElementsByTagName( "foo" ) ) ).text(),
text,
"Check for appending an empty nodelist" + type
);
assert.equal( $base.clone().append( "<span></span>", "<span></span>", "<span></span>" ).children().length,
$base.children().length + 3,
"Make sure that multiple arguments works." + type
);
assert.equal( $base.clone().append( valueObj( document.getElementById( "form" ).cloneNode( true ) ) ).children( "form" ).length,
1,
"Check for appending a form (trac-910)" + type
);
}
function testAppend( valueObj, assert ) {
assert.expect( 82 );
testAppendForObject( valueObj, false, assert );
testAppendForObject( valueObj, true, assert );
var defaultText, result, message, iframe, iframeDoc, j, d,
$input, $radioChecked, $radioUnchecked, $radioParent, $map, $table;
defaultText = "Try them out:";
result = jQuery( "#first" ).append( valueObj( "<b>buga</b>" ) );
assert.equal( result.text(), defaultText + "buga", "Check if text appending works" );
assert.equal( jQuery( "#select3" ).append( valueObj( "<option value='appendTest'>Append Test</option>" ) ).find( "option:last-child" ).attr( "value" ), "appendTest", "Appending html options to select element" );
jQuery( "#qunit-fixture form" ).append( valueObj( "<input name='radiotest' type='radio' checked='checked' />" ) );
jQuery( "#qunit-fixture form input[name=radiotest]" ).each( function() {
assert.ok( jQuery( this ).is( ":checked" ), "Append checked radio" );
} ).remove();
jQuery( "#qunit-fixture form" ).append( valueObj( "<input name='radiotest2' type='radio' checked = 'checked' />" ) );
jQuery( "#qunit-fixture form input[name=radiotest2]" ).each( function() {
assert.ok( jQuery( this ).is( ":checked" ), "Append alternately formatted checked radio" );
} ).remove();
jQuery( "#qunit-fixture form" ).append( valueObj( "<input name='radiotest3' type='radio' checked />" ) );
jQuery( "#qunit-fixture form input[name=radiotest3]" ).each( function() {
assert.ok( jQuery( this ).is( ":checked" ), "Append HTML5-formatted checked radio" );
} ).remove();
jQuery( "#qunit-fixture form" ).append( valueObj( "<input type='radio' checked='checked' name='radiotest4' />" ) );
jQuery( "#qunit-fixture form input[name=radiotest4]" ).each( function() {
assert.ok( jQuery( this ).is( ":checked" ), "Append with name attribute after checked attribute" );
} ).remove();
message = "Test for appending a DOM node to the contents of an iframe";
iframe = jQuery( "#iframe" )[ 0 ];
iframeDoc = iframe.contentDocument || iframe.contentWindow && iframe.contentWindow.document;
try {
if ( iframeDoc && iframeDoc.body ) {
assert.equal( jQuery( iframeDoc.body ).append( valueObj( "<div id='success'>test</div>" ) )[ 0 ].lastChild.id, "success", message );
} else {
assert.ok( true, message + " - can't test" );
}
} catch ( e ) {
assert.strictEqual( e.message || e, undefined, message );
}
jQuery( "<fieldset></fieldset>" ).appendTo( "#form" ).append( valueObj( "<legend id='legend'>test</legend>" ) );
assert.t( "Append legend", "#legend", [ "legend" ] );
$map = jQuery( "<map></map>" ).append( valueObj( "<area id='map01' shape='rect' coords='50,50,150,150' href='http://www.jquery.com/' alt='jQuery'>" ) );
assert.equal( $map[ 0 ].childNodes.length, 1, "The area was inserted." );
assert.equal( $map[ 0 ].firstChild.nodeName.toLowerCase(), "area", "The area was inserted." );
jQuery( "#select1" ).append( valueObj( "<OPTION>Test</OPTION>" ) );
assert.equal( jQuery( "#select1 option:last-child" ).text(), "Test", "Appending OPTION (all caps)" );
jQuery( "#select1" ).append( valueObj( "<optgroup label='optgroup'><option>optgroup</option></optgroup>" ) );
assert.equal( jQuery( "#select1 optgroup" ).attr( "label" ), "optgroup", "Label attribute in newly inserted optgroup is correct" );
assert.equal( jQuery( "#select1 option" ).last().text(), "optgroup", "Appending optgroup" );
$table = jQuery( "#table" );
jQuery.each( "thead tbody tfoot colgroup caption tr th td".split( " " ), function( i, name ) {
$table.append( valueObj( "<" + name + "/>" ) );
assert.equal( $table.find( name ).length, 1, "Append " + name );
assert.ok( jQuery.parseHTML( "<" + name + "/>" ).length, name + " wrapped correctly" );
} );
jQuery( "#table colgroup" ).append( valueObj( "<col></col>" ) );
assert.equal( jQuery( "#table colgroup col" ).length, 1, "Append col" );
jQuery( "#form" )
.append( valueObj( "<select id='appendSelect1'></select>" ) )
.append( valueObj( "<select id='appendSelect2'><option>Test</option></select>" ) );
assert.t( "Append Select", "#appendSelect1, #appendSelect2", [ "appendSelect1", "appendSelect2" ] );
assert.equal( "Two nodes", jQuery( "<div></div>" ).append( "Two", " nodes" ).text(), "Appending two text nodes (trac-4011)" );
assert.equal( jQuery( "<div></div>" ).append( "1", "", 3 ).text(), "13", "If median is false-like value, subsequent arguments should not be ignored" );
// using contents will get comments regular, text, and comment nodes
j = jQuery( "#nonnodes" ).contents();
d = jQuery( "<div></div>" ).appendTo( "#nonnodes" ).append( j );
assert.equal( jQuery( "#nonnodes" ).length, 1, "Check node,textnode,comment append moved leaving just the div" );
assert.equal( d.contents().length, 3, "Check node,textnode,comment append works" );
d.contents().appendTo( "#nonnodes" );
d.remove();
assert.equal( jQuery( "#nonnodes" ).contents().length, 3, "Check node,textnode,comment append cleanup worked" );
$input = jQuery( "<input type='checkbox'/>" ).prop( "checked", true ).appendTo( "#testForm" );
assert.equal( $input[ 0 ].checked, true, "A checked checkbox that is appended stays checked" );
$radioChecked = jQuery( "input[type='radio'][name='R1']" ).eq( 1 );
$radioParent = $radioChecked.parent();
$radioUnchecked = jQuery( "<input type='radio' name='R1' checked='checked'/>" ).appendTo( $radioParent );
$radioChecked.trigger( "click" );
$radioUnchecked[ 0 ].checked = false;
jQuery( "<div></div>" ).insertBefore( $radioParent ).append( $radioParent );
assert.equal( $radioChecked[ 0 ].checked, true, "Reappending radios uphold which radio is checked" );
assert.equal( $radioUnchecked[ 0 ].checked, false, "Reappending radios uphold not being checked" );
assert.equal( jQuery( "<div></div>" ).append( valueObj( "option<area></area>" ) )[ 0 ].childNodes.length, 2, "HTML-string with leading text should be processed correctly" );
}
QUnit.test( "append(String|Element|Array<Element>|jQuery)", function( assert ) {
testAppend( manipulationBareObj, assert );
} );
QUnit.test( "append(Function)", function( assert ) {
testAppend( manipulationFunctionReturningObj, assert );
} );
QUnit.test( "append(param) to object, see trac-11280", function( assert ) {
assert.expect( 5 );
var object = jQuery( document.createElement( "object" ) ).appendTo( document.body );
assert.equal( object.children().length, 0, "object does not start with children" );
object.append( jQuery( "<param type='wmode' name='foo'>" ) );
assert.equal( object.children().length, 1, "appended param" );
assert.equal( object.children().eq( 0 ).attr( "name" ), "foo", "param has name=foo" );
object = jQuery( "<object><param type='baz' name='bar'></object>" );
assert.equal( object.children().length, 1, "object created with child param" );
assert.equal( object.children().eq( 0 ).attr( "name" ), "bar", "param has name=bar" );
} );
QUnit.test( "append(Function) returns String", function( assert ) {
assert.expect( 4 );
var defaultText, result, select, old;
defaultText = "Try them out:";
old = jQuery( "#first" ).html();
result = jQuery( "#first" ).append( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return "<b>buga</b>";
} );
assert.equal( result.text(), defaultText + "buga", "Check if text appending works" );
select = jQuery( "#select3" );
old = select.html();
assert.equal( select.append( function( i, val ) {
assert.equal( 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" );
} );
QUnit.test( "append(Function) returns Element", function( assert ) {
assert.expect( 2 );
var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:",
old = jQuery( "#sap" ).html();
jQuery( "#sap" ).append( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return document.getElementById( "first" );
} );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for appending of element" );
} );
QUnit.test( "append(Function) returns Array<Element>", function( assert ) {
assert.expect( 2 );
var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo",
old = jQuery( "#sap" ).html();
jQuery( "#sap" ).append( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return [ document.getElementById( "first" ), document.getElementById( "yahoo" ) ];
} );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for appending of array of elements" );
} );
QUnit.test( "append(Function) returns jQuery", function( assert ) {
assert.expect( 2 );
var expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:",
old = jQuery( "#sap" ).html();
jQuery( "#sap" ).append( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return jQuery( "#yahoo, #first" );
} );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for appending of jQuery object" );
} );
QUnit.test( "append(Function) returns Number", function( assert ) {
assert.expect( 2 );
var old = jQuery( "#sap" ).html();
jQuery( "#sap" ).append( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return 5;
} );
assert.ok( jQuery( "#sap" )[ 0 ].innerHTML.match( /5$/ ), "Check for appending a number" );
} );
QUnit.test( "XML DOM manipulation (trac-9960)", function( assert ) {
assert.expect( 5 );
var xmlDoc1 = jQuery.parseXML( "<scxml xmlns='http://www.w3.org/2005/07/scxml' version='1.0'><state x='100' y='100' initial='actions' id='provisioning'></state><state x='100' y='100' id='error'></state><state x='100' y='100' id='finished' final='true'></state></scxml>" ),
xmlDoc2 = jQuery.parseXML( "<scxml xmlns='http://www.w3.org/2005/07/scxml' version='1.0'><state id='provisioning3'></state></scxml>" ),
xml1 = jQuery( xmlDoc1 ),
xml2 = jQuery( xmlDoc2 ),
scxml1 = jQuery( "scxml", xml1 ),
scxml2 = jQuery( "scxml", xml2 ),
state = scxml2.find( "state" );
scxml1.append( state );
assert.strictEqual( scxml1[ 0 ].lastChild, state[ 0 ], "append" );
scxml1.prepend( state );
assert.strictEqual( scxml1[ 0 ].firstChild, state[ 0 ], "prepend" );
scxml1.find( "#finished" ).after( state );
assert.strictEqual( scxml1[ 0 ].lastChild, state[ 0 ], "after" );
scxml1.find( "#provisioning" ).before( state );
assert.strictEqual( scxml1[ 0 ].firstChild, state[ 0 ], "before" );
scxml2.replaceWith( scxml1 );
assert.deepEqual( jQuery( "state", xml2 ).get(), scxml1.find( "state" ).get(), "replaceWith" );
} );
QUnit.test( "append HTML5 sectioning elements (Bug trac-6485)", function( assert ) {
assert.expect( 2 );
var article, aside;
jQuery( "#qunit-fixture" ).append( "<article style='font-size:10px'><section><aside>HTML5 elements</aside></section></article>" );
article = jQuery( "article" );
aside = jQuery( "aside" );
assert.equal( article.get( 0 ).style.fontSize, "10px", "HTML5 elements are styleable" );
assert.equal( aside.length, 1, "HTML5 elements do not collapse their children" );
} );
if ( includesModule( "css" ) ) {
QUnit.test( "HTML5 Elements inherit styles from style rules (Bug trac-10501)", function( assert ) {
assert.expect( 1 );
jQuery( "#qunit-fixture" ).append( "<article id='article'></article>" );
jQuery( "#article" ).append( "<section>This section should have a pink background.</section>" );
// In IE, the missing background color will claim its value is "transparent"
assert.notEqual( jQuery( "section" ).css( "background-color" ), "transparent", "HTML5 elements inherit styles" );
} );
}
QUnit.test( "html(String) with HTML5 (Bug trac-6485)", function( assert ) {
assert.expect( 2 );
jQuery( "#qunit-fixture" ).html( "<article><section><aside>HTML5 elements</aside></section></article>" );
assert.equal( jQuery( "#qunit-fixture" ).children().children().length, 1, "Make sure HTML5 article elements can hold children. innerHTML shortcut path" );
assert.equal( jQuery( "#qunit-fixture" ).children().children().children().length, 1, "Make sure nested HTML5 elements can hold children." );
} );
QUnit.test( "html(String) tag-hyphenated elements (Bug gh-1987)", function( assert ) {
assert.expect( 27 );
jQuery.each( "thead tbody tfoot colgroup caption tr th td".split( " " ), function( i, name ) {
var j = jQuery( "<" + name + "-d></" + name + "-d><" + name + "-d></" + name + "-d>" );
assert.ok( j[ 0 ], "Create a tag-hyphenated element" );
assert.ok( j[ 0 ].nodeName === name.toUpperCase() + "-D", "Hyphenated node name" );
assert.ok( j[ 1 ].nodeName === name.toUpperCase() + "-D", "Hyphenated node name" );
} );
var j = jQuery( "<tr-multiple-hyphens><td-with-hyphen>text</td-with-hyphen></tr-multiple-hyphens>" );
assert.ok( j[ 0 ].nodeName === "TR-MULTIPLE-HYPHENS", "Tags with multiple hyphens" );
assert.ok( j.children()[ 0 ].nodeName === "TD-WITH-HYPHEN", "Tags with multiple hyphens" );
assert.equal( j.children().text(), "text", "Tags with multiple hyphens behave normally" );
} );
QUnit.test( "Tag name processing respects the HTML Standard (gh-2005)", function( assert ) {
assert.expect( 240 );
var wrapper = jQuery( "<div></div>" ),
nameTerminatingChars = "\x20\t\r\n\f".split( "" ),
specialChars = "[ ] { } _ - = + \\ ( ) * & ^ % $ # @ ! ~ ` ' ; ? ¥ « µ λ ⊕ ≈ ξ ♣ €"
.split( " " );
specialChars.push( specialChars.join( "" ) );
jQuery.each( specialChars, function( i, characters ) {
assertSpecialCharsSupport( "html", characters );
assertSpecialCharsSupport( "append", characters );
} );
jQuery.each( nameTerminatingChars, function( i, character ) {
assertNameTerminatingCharsHandling( "html", character );
assertNameTerminatingCharsHandling( "append", character );
} );
function buildChild( method, html ) {
wrapper[ method ]( html );
return wrapper.children()[ 0 ];
}
function assertSpecialCharsSupport( method, characters ) {
// Support: Android 4.4 only
// Chromium < 35 incorrectly upper-cases µ; Android 4.4 uses such a version by default
// (and its WebView, being un-updatable, will use it for eternity) so we need to blacklist
// that one for the tests to pass.
if ( characters === "µ" && /chrome/i.test( navigator.userAgent ) &&
navigator.userAgent.match( /chrome\/(\d+)/i )[ 1 ] < 35 ) {
assert.ok( true, "This Chromium version upper-cases µ incorrectly; skip test" );
assert.ok( true, "This Chromium version upper-cases µ incorrectly; skip test" );
assert.ok( true, "This Chromium version upper-cases µ incorrectly; skip test" );
return;
}
var child,
codepoint = characters.charCodeAt( 0 ).toString( 16 ).toUpperCase(),
description = characters.length === 1 ?
"U+" + ( "000" + codepoint ).slice( -4 ) + " " + characters :
"all special characters",
nodeName = "valid" + characters + "tagname";
child = buildChild( method, "<" + nodeName + "></" + nodeName + ">" );
assert.equal( child.nodeName.toUpperCase(), nodeName.toUpperCase(),
method + "(): Paired tag name includes " + description );
child = buildChild( method, "<" + nodeName + ">" );
assert.equal( child.nodeName.toUpperCase(), nodeName.toUpperCase(),
method + "(): Unpaired tag name includes " + description );
child = buildChild( method, "<" + nodeName + "/>" );
assert.equal( child.nodeName.toUpperCase(), nodeName.toUpperCase(),
method + "(): Self-closing tag name includes " + description );
}
function assertNameTerminatingCharsHandling( method, character ) {
var child,
codepoint = character.charCodeAt( 0 ).toString( 16 ).toUpperCase(),
description = "U+" + ( "000" + codepoint ).slice( -4 ) + " " + character,
nodeName = "div" + character + "this-will-be-discarded";
child = buildChild( method, "<" + nodeName + "></" + nodeName + ">" );
assert.equal( child.nodeName.toUpperCase(), "DIV",
method + "(): Paired tag name terminated by " + description );
child = buildChild( method, "<" + nodeName + ">" );
assert.equal( child.nodeName.toUpperCase(), "DIV",
method + "(): Unpaired open tag name terminated by " + description );
child = buildChild( method, "<" + nodeName + "/>" );
assert.equal( child.nodeName.toUpperCase(), "DIV",
method + "(): Self-closing tag name terminated by " + description );
}
} );
QUnit.test( "IE8 serialization bug", function( assert ) {
assert.expect( 2 );
var wrapper = jQuery( "<div></div>" );
wrapper.html( "<div></div><article></article>" );
assert.equal( wrapper.children( "article" ).length, 1, "HTML5 elements are insertable with .html()" );
wrapper.html( "<div></div><link></link>" );
assert.equal( wrapper.children( "link" ).length, 1, "Link elements are insertable with .html()" );
} );
QUnit.test( "html() object element trac-10324", function( assert ) {
assert.expect( 1 );
var object = jQuery( "<object id='object2'><param name='object2test' value='test'></param></object>?" ).appendTo( "#qunit-fixture" ),
clone = object.clone();
assert.equal( clone.html(), object.html(), "html() returns correct innerhtml of cloned object elements" );
} );
QUnit.test( "append(xml)", function( assert ) {
assert.expect( 1 );
var xmlDoc, xml1, xml2;
function createXMLDoc() {
// Initialize DOM based upon latest installed MSXML or Netscape
var elem, n, len,
aActiveX =
[ "MSXML6.DomDocument",
"MSXML3.DomDocument",
"MSXML2.DomDocument",
"MSXML.DomDocument",
"Microsoft.XmlDom" ];
if ( document.implementation && "createDocument" in document.implementation ) {
return document.implementation.createDocument( "", "", null );
} else {
// IE
for ( n = 0, len = aActiveX.length; n < len; n++ ) {
try {
elem = new window.ActiveXObject( aActiveX[ n ] );
return elem;
} catch ( _ ) {}
}
}
}
xmlDoc = createXMLDoc();
xml1 = xmlDoc.createElement( "head" );
xml2 = xmlDoc.createElement( "test" );
assert.ok( jQuery( xml1 ).append( xml2 ), "Append an xml element to another without raising an exception." );
} );
QUnit.test( "appendTo(String)", function( assert ) {
assert.expect( 4 );
var l, defaultText;
defaultText = "Try them out:";
jQuery( "<b>buga</b>" ).appendTo( "#first" );
assert.equal( jQuery( "#first" ).text(), defaultText + "buga", "Check if text appending works" );
assert.equal( jQuery( "<option value='appendTest'>Append Test</option>" ).appendTo( "#select3" ).parent().find( "option:last-child" ).attr( "value" ), "appendTest", "Appending html options to select element" );
l = jQuery( "#first" ).children().length + 2;
jQuery( "<strong>test</strong>" );
jQuery( "<strong>test</strong>" );
jQuery( [ jQuery( "<strong>test</strong>" )[ 0 ], jQuery( "<strong>test</strong>" )[ 0 ] ] )
.appendTo( "#first" );
assert.equal( jQuery( "#first" ).children().length, l, "Make sure the elements were inserted." );
assert.equal( jQuery( "#first" ).children().last()[ 0 ].nodeName.toLowerCase(), "strong", "Verify the last element." );
} );
QUnit.test( "appendTo(Element|Array<Element>)", function( assert ) {
assert.expect( 2 );
var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:";
jQuery( document.getElementById( "first" ) ).appendTo( "#sap" );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for appending of element" );
expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo";
jQuery( [ document.getElementById( "first" ), document.getElementById( "yahoo" ) ] ).appendTo( "#sap" );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for appending of array of elements" );
} );
QUnit.test( "appendTo(jQuery)", function( assert ) {
assert.expect( 10 );
var expected, num, div;
assert.ok( jQuery( document.createElement( "script" ) ).appendTo( "body" ).length, "Make sure a disconnected script can be appended." );
expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:";
jQuery( "#yahoo, #first" ).appendTo( "#sap" );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for appending of jQuery object" );
jQuery( "#select1" ).appendTo( "#foo" );
assert.t( "Append select", "#foo select", [ "select1" ] );
div = jQuery( "<div></div>" ).on( "click", function() {
assert.ok( true, "Running a cloned click." );
} );
div.appendTo( "#qunit-fixture, #moretests" );
jQuery( "#qunit-fixture div" ).last().trigger( "click" );
jQuery( "#moretests div" ).last().trigger( "click" );
div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture, #moretests" );
assert.equal( div.length, 2, "appendTo returns the inserted elements" );
div.addClass( "test" );
assert.ok( jQuery( "#qunit-fixture div" ).last().hasClass( "test" ), "appendTo element was modified after the insertion" );
assert.ok( jQuery( "#moretests div" ).last().hasClass( "test" ), "appendTo element was modified after the insertion" );
div = jQuery( "<div></div>" );
jQuery( "<span>a</span><b>b</b>" ).filter( "span" ).appendTo( div );
assert.equal( div.children().length, 1, "Make sure the right number of children were inserted." );
div = jQuery( "#moretests div" );
num = jQuery( "#qunit-fixture div" ).length;
div.remove().appendTo( "#qunit-fixture" );
assert.equal( jQuery( "#qunit-fixture div" ).length, num, "Make sure all the removed divs were inserted." );
} );
QUnit.test( "prepend(String)", function( assert ) {
assert.expect( 2 );
var result, expected;
expected = "Try them out:";
result = jQuery( "#first" ).prepend( "<b>buga</b>" );
assert.equal( result.text(), "buga" + expected, "Check if text prepending works" );
assert.equal( jQuery( "#select3" ).prepend( "<option value='prependTest'>Prepend Test</option>" ).find( "option:first-child" ).attr( "value" ), "prependTest", "Prepending html options to select element" );
} );
QUnit.test( "prepend(Element)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog";
jQuery( "#sap" ).prepend( document.getElementById( "first" ) );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of element" );
} );
QUnit.test( "prepend(Array<Element>)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog";
jQuery( "#sap" ).prepend( [ document.getElementById( "first" ), document.getElementById( "yahoo" ) ] );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of array of elements" );
} );
QUnit.test( "prepend(jQuery)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
jQuery( "#sap" ).prepend( jQuery( "#yahoo, #first" ) );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of jQuery object" );
} );
QUnit.test( "prepend(Array<jQuery>)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "Try them out:GoogleYahooThis link has class=\"blog\": Simon Willison's Weblog";
jQuery( "#sap" ).prepend( [ jQuery( "#first" ), jQuery( "#yahoo, #google" ) ] );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of array of jQuery objects" );
} );
QUnit.test( "prepend(Function) with incoming value -- String", function( assert ) {
assert.expect( 4 );
var defaultText, old, result;
defaultText = "Try them out:";
old = jQuery( "#first" ).html();
result = jQuery( "#first" ).prepend( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return "<b>buga</b>";
} );
assert.equal( result.text(), "buga" + defaultText, "Check if text prepending works" );
old = jQuery( "#select3" ).html();
assert.equal( jQuery( "#select3" ).prepend( function( i, val ) {
assert.equal( 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" );
} );
QUnit.test( "prepend(Function) with incoming value -- Element", function( assert ) {
assert.expect( 2 );
var old, expected;
expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog";
old = jQuery( "#sap" ).html();
jQuery( "#sap" ).prepend( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return document.getElementById( "first" );
} );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of element" );
} );
QUnit.test( "prepend(Function) with incoming value -- Array<Element>", function( assert ) {
assert.expect( 2 );
var old, expected;
expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog";
old = jQuery( "#sap" ).html();
jQuery( "#sap" ).prepend( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return [ document.getElementById( "first" ), document.getElementById( "yahoo" ) ];
} );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of array of elements" );
} );
QUnit.test( "prepend(Function) with incoming value -- jQuery", function( assert ) {
assert.expect( 2 );
var old, expected;
expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
old = jQuery( "#sap" ).html();
jQuery( "#sap" ).prepend( function( i, val ) {
assert.equal( val, old, "Make sure the incoming value is correct." );
return jQuery( "#yahoo, #first" );
} );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of jQuery object" );
} );
QUnit.test( "prependTo(String)", function( assert ) {
assert.expect( 2 );
var defaultText;
defaultText = "Try them out:";
jQuery( "<b>buga</b>" ).prependTo( "#first" );
assert.equal( jQuery( "#first" ).text(), "buga" + defaultText, "Check if text prepending works" );
assert.equal( jQuery( "<option value='prependTest'>Prepend Test</option>" ).prependTo( "#select3" ).parent().find( "option:first-child" ).attr( "value" ), "prependTest", "Prepending html options to select element" );
} );
QUnit.test( "prependTo(Element)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog";
jQuery( document.getElementById( "first" ) ).prependTo( "#sap" );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of element" );
} );
QUnit.test( "prependTo(Array<Element>)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog";
jQuery( [ document.getElementById( "first" ), document.getElementById( "yahoo" ) ] ).prependTo( "#sap" );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of array of elements" );
} );
QUnit.test( "prependTo(jQuery)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
jQuery( "#yahoo, #first" ).prependTo( "#sap" );
assert.equal( jQuery( "#sap" ).text(), expected, "Check for prepending of jQuery object" );
} );
QUnit.test( "prependTo(Array<jQuery>)", function( assert ) {
assert.expect( 1 );
jQuery( "<select id='prependSelect1'></select>" ).prependTo( "#form" );
jQuery( "<select id='prependSelect2'><option>Test</option></select>" ).prependTo( "#form" );
assert.t( "Prepend Select", "#prependSelect2, #prependSelect1", [ "prependSelect2", "prependSelect1" ] );
} );
QUnit.test( "before(String)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: bugaYahoo";
jQuery( "#yahoo" ).before( manipulationBareObj( "<b>buga</b>" ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert String before" );
} );
QUnit.test( "before(Element)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: Try them out:Yahoo";
jQuery( "#yahoo" ).before( manipulationBareObj( document.getElementById( "first" ) ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert element before" );
} );
QUnit.test( "before(Array<Element>)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: Try them out:diveintomarkYahoo";
jQuery( "#yahoo" ).before( manipulationBareObj( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements before" );
} );
QUnit.test( "before(jQuery)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: diveintomarkTry them out:Yahoo";
jQuery( "#yahoo" ).before( manipulationBareObj( jQuery( "#mark, #first" ) ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert jQuery before" );
} );
QUnit.test( "before(Array<jQuery>)", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: Try them out:GooglediveintomarkYahoo";
jQuery( "#yahoo" ).before( manipulationBareObj( [ jQuery( "#first" ), jQuery( "#mark, #google" ) ] ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of jQuery objects before" );
} );
QUnit.test( "before(Function) -- Returns String", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: bugaYahoo";
jQuery( "#yahoo" ).before( manipulationFunctionReturningObj( "<b>buga</b>" ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert String before" );
} );
QUnit.test( "before(Function) -- Returns Element", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: Try them out:Yahoo";
jQuery( "#yahoo" ).before( manipulationFunctionReturningObj( document.getElementById( "first" ) ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert element before" );
} );
QUnit.test( "before(Function) -- Returns Array<Element>", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: Try them out:diveintomarkYahoo";
jQuery( "#yahoo" ).before( manipulationFunctionReturningObj( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements before" );
} );
QUnit.test( "before(Function) -- Returns jQuery", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: diveintomarkTry them out:Yahoo";
jQuery( "#yahoo" ).before( manipulationFunctionReturningObj( jQuery( "#mark, #first" ) ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert jQuery before" );
} );
QUnit.test( "before(Function) -- Returns Array<jQuery>", function( assert ) {
assert.expect( 1 );
var expected;
expected = "This is a normal link: Try them out:GooglediveintomarkYahoo";
jQuery( "#yahoo" ).before( manipulationFunctionReturningObj( [ jQuery( "#first" ), jQuery( "#mark, #google" ) ] ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of jQuery objects before" );
} );
QUnit.test( "before(no-op)", function( assert ) {
assert.expect( 2 );
var set;
set = jQuery( "<div></div>" ).before( "<span>test</span>" );
assert.equal( set[ 0 ].nodeName.toLowerCase(), "div", "Insert before a disconnected node should be a no-op" );
assert.equal( set.length, 1, "Insert the element before the disconnected node. should be a no-op" );
} );
QUnit.test( "before and after w/ empty object (trac-10812)", function( assert ) {
assert.expect( 1 );
var res;
res = jQuery( "#notInTheDocument" ).before( "(" ).after( ")" );
assert.equal( res.length, 0, "didn't choke on empty object" );
} );
QUnit.test( ".before() and .after() disconnected node", function( assert ) {
assert.expect( 2 );
assert.equal( jQuery( "<input type='checkbox'/>" ).before( "<div></div>" ).length, 1, "before() on disconnected node is no-op" );
assert.equal( jQuery( "<input type='checkbox'/>" ).after( "<div></div>" ).length, 1, "after() on disconnected node is no-op" );
} );
QUnit.test( "insert with .before() on disconnected node last", function( assert ) {
assert.expect( 1 );
var expectedBefore = "This is a normal link: bugaYahoo";
jQuery( "#yahoo" ).add( "<span></span>" ).before( "<b>buga</b>" );
assert.equal( jQuery( "#en" ).text(), expectedBefore, "Insert String before with disconnected node last" );
} );
QUnit.test( "insert with .before() on disconnected node first", function( assert ) {
assert.expect( 1 );
var expectedBefore = "This is a normal link: bugaYahoo";
jQuery( "<span></span>" ).add( "#yahoo" ).before( "<b>buga</b>" );
assert.equal( jQuery( "#en" ).text(), expectedBefore, "Insert String before with disconnected node first" );
} );
QUnit.test( "insert with .before() on disconnected node last", function( assert ) {
assert.expect( 1 );
var expectedAfter = "This is a normal link: Yahoobuga";
jQuery( "#yahoo" ).add( "<span></span>" ).after( "<b>buga</b>" );
assert.equal( jQuery( "#en" ).text(), expectedAfter, "Insert String after with disconnected node last" );
} );
QUnit.test( "insert with .before() on disconnected node last", function( assert ) {
assert.expect( 1 );
var expectedAfter = "This is a normal link: Yahoobuga";
jQuery( "<span></span>" ).add( "#yahoo" ).after( "<b>buga</b>" );
assert.equal( jQuery( "#en" ).text(), expectedAfter, "Insert String after with disconnected node first" );
} );
QUnit.test( "insertBefore(String)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: bugaYahoo";
jQuery( "<b>buga</b>" ).insertBefore( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert String before" );
} );
QUnit.test( "insertBefore(Element)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: Try them out:Yahoo";
jQuery( document.getElementById( "first" ) ).insertBefore( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert element before" );
} );
QUnit.test( "insertBefore(Array<Element>)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: Try them out:diveintomarkYahoo";
jQuery( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ).insertBefore( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements before" );
} );
QUnit.test( "insertBefore(jQuery)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: diveintomarkTry them out:Yahoo";
jQuery( "#mark, #first" ).insertBefore( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert jQuery before" );
} );
QUnit.test( ".after(String)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: Yahoobuga";
jQuery( "#yahoo" ).after( "<b>buga</b>" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert String after" );
} );
QUnit.test( ".after(Element)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:";
jQuery( "#yahoo" ).after( document.getElementById( "first" ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert element after" );
} );
QUnit.test( ".after(Array<Element>)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:diveintomark";
jQuery( "#yahoo" ).after( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements after" );
} );
QUnit.test( ".after(jQuery)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:Googlediveintomark";
jQuery( "#yahoo" ).after( [ jQuery( "#first" ), jQuery( "#mark, #google" ) ] );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of jQuery objects after" );
} );
QUnit.test( ".after(Function) returns String", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: Yahoobuga",
val = manipulationFunctionReturningObj;
jQuery( "#yahoo" ).after( val( "<b>buga</b>" ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert String after" );
} );
QUnit.test( ".after(Function) returns Element", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:",
val = manipulationFunctionReturningObj;
jQuery( "#yahoo" ).after( val( document.getElementById( "first" ) ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert element after" );
} );
QUnit.test( ".after(Function) returns Array<Element>", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:diveintomark",
val = manipulationFunctionReturningObj;
jQuery( "#yahoo" ).after( val( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements after" );
} );
QUnit.test( ".after(Function) returns jQuery", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:Googlediveintomark",
val = manipulationFunctionReturningObj;
jQuery( "#yahoo" ).after( val( [ jQuery( "#first" ), jQuery( "#mark, #google" ) ] ) );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of jQuery objects after" );
} );
QUnit.test( ".after(disconnected node)", function( assert ) {
assert.expect( 2 );
var set = jQuery( "<div></div>" ).before( "<span>test</span>" );
assert.equal( set[ 0 ].nodeName.toLowerCase(), "div", "Insert after a disconnected node should be a no-op" );
assert.equal( set.length, 1, "Insert the element after the disconnected node should be a no-op" );
} );
QUnit.test( "insertAfter(String)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: Yahoobuga";
jQuery( "<b>buga</b>" ).insertAfter( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert String after" );
} );
QUnit.test( "insertAfter(Element)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:";
jQuery( document.getElementById( "first" ) ).insertAfter( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert element after" );
} );
QUnit.test( "insertAfter(Array<Element>)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahooTry them out:diveintomark";
jQuery( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ).insertAfter( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements after" );
} );
QUnit.test( "insertAfter(jQuery)", function( assert ) {
assert.expect( 1 );
var expected = "This is a normal link: YahoodiveintomarkTry them out:";
jQuery( "#mark, #first" ).insertAfter( "#yahoo" );
assert.equal( jQuery( "#en" ).text(), expected, "Insert jQuery after" );
} );
function testReplaceWith( val, assert ) {
var tmp, y, child, child2, set, nonExistent, $div,
expected = 29;
assert.expect( expected );
jQuery( "#yahoo" ).replaceWith( val( "<b id='replace'>buga</b>" ) );
assert.ok( jQuery( "#replace" )[ 0 ], "Replace element with element from string" );
assert.ok( !jQuery( "#yahoo" )[ 0 ], "Verify that original element is gone, after string" );
jQuery( "#anchor2" ).replaceWith( val( document.getElementById( "first" ) ) );
assert.ok( jQuery( "#first" )[ 0 ], "Replace element with element" );
assert.ok( !jQuery( "#anchor2" )[ 0 ], "Verify that original element is gone, after element" );
jQuery( "#qunit-fixture" ).append( "<div id='bar'><div id='baz'></div></div>" );
jQuery( "#baz" ).replaceWith( val( "Baz" ) );
assert.equal( jQuery( "#bar" ).text(), "Baz", "Replace element with text" );
assert.ok( !jQuery( "#baz" )[ 0 ], "Verify that original element is gone, after element" );
jQuery( "#bar" ).replaceWith( "<div id='yahoo'></div>", "...", "<div id='baz'></div>" );
assert.deepEqual( jQuery( "#yahoo, #baz" ).get(), q( "yahoo", "baz" ), "Replace element with multiple arguments (trac-13722)" );
assert.strictEqual( jQuery( "#yahoo" )[ 0 ].nextSibling, jQuery( "#baz" )[ 0 ].previousSibling, "Argument order preserved" );
assert.deepEqual( jQuery( "#bar" ).get(), [], "Verify that original element is gone, after multiple arguments" );
jQuery( "#google" ).replaceWith( val( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ) );
assert.deepEqual( jQuery( "#mark, #first" ).get(), q( "first", "mark" ), "Replace element with array of elements" );
assert.ok( !jQuery( "#google" )[ 0 ], "Verify that original element is gone, after array of elements" );
jQuery( "#groups" ).replaceWith( val( jQuery( "#mark, #first" ) ) );
assert.deepEqual( jQuery( "#mark, #first" ).get(), q( "first", "mark" ), "Replace element with jQuery collection" );
assert.ok( !jQuery( "#groups" )[ 0 ], "Verify that original element is gone, after jQuery collection" );
jQuery( "#mark, #first" ).replaceWith( val( "<span class='replacement'></span><span class='replacement'></span>" ) );
assert.equal( jQuery( "#qunit-fixture .replacement" ).length, 4, "Replace multiple elements (trac-12449)" );
assert.deepEqual( jQuery( "#mark, #first" ).get(), [], "Verify that original elements are gone, after replace multiple" );
tmp = jQuery( "<b>content</b>" )[ 0 ];
jQuery( "#anchor1" ).contents().replaceWith( val( tmp ) );
assert.deepEqual( jQuery( "#anchor1" ).contents().get(), [ tmp ], "Replace text node with element" );
tmp = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ).on( "click", function() {
assert.ok( true, "Newly bound click run." );
} );
y = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ).on( "click", function() {
assert.ok( false, "Previously bound click run." );
} );
child = y.append( "<b>test</b>" ).find( "b" ).on( "click", function() {
assert.ok( true, "Child bound click run." );
return false;
} );
y.replaceWith( val( tmp ) );
tmp.trigger( "click" );
y.trigger( "click" ); // Shouldn't be run
child.trigger( "click" ); // Shouldn't be run
y = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ).on( "click", function() {
assert.ok( false, "Previously bound click run." );
} );
child2 = y.append( "<u>test</u>" ).find( "u" ).on( "click", function() {
assert.ok( true, "Child 2 bound click run." );
return false;
} );
y.replaceWith( val( child2 ) );
child2.trigger( "click" );
set = jQuery( "<div></div>" ).replaceWith( val( "<span>test</span>" ) );
assert.equal( set[ 0 ].nodeName.toLowerCase(), "div", "No effect on a disconnected node." );
assert.equal( set.length, 1, "No effect on a disconnected node." );
assert.equal( set[ 0 ].childNodes.length, 0, "No effect on a disconnected node." );
child = jQuery( "#qunit-fixture" ).children().first();
$div = jQuery( "<div class='pathological'></div>" ).insertBefore( child );
$div.replaceWith( $div );
assert.deepEqual( jQuery( ".pathological", "#qunit-fixture" ).get(), $div.get(),
"Self-replacement" );
$div.replaceWith( child );
assert.deepEqual( jQuery( "#qunit-fixture" ).children().first().get(), child.get(),
"Replacement with following sibling (trac-13810)" );
assert.deepEqual( jQuery( ".pathological", "#qunit-fixture" ).get(), [],
"Replacement with following sibling (context removed)" );
nonExistent = jQuery( "#does-not-exist" ).replaceWith( val( "<b>should not throw an error</b>" ) );
assert.equal( nonExistent.length, 0, "Length of non existent element." );
$div = jQuery( "<div class='replacewith'></div>" ).appendTo( "#qunit-fixture" );
$div.replaceWith( val( "<div class='replacewith'></div><script>" +
"QUnit.assert.equal( jQuery('.replacewith').length, 1, 'Check number of elements in page.' );" +
"</script>" ) );
jQuery( "#qunit-fixture" ).append( "<div id='replaceWith'></div>" );
assert.equal( jQuery( "#qunit-fixture" ).find( "div[id=replaceWith]" ).length, 1, "Make sure only one div exists." );
jQuery( "#replaceWith" ).replaceWith( val( "<div id='replaceWith'></div>" ) );
assert.equal( jQuery( "#qunit-fixture" ).find( "div[id=replaceWith]" ).length, 1, "Make sure only one div exists after replacement." );
jQuery( "#replaceWith" ).replaceWith( val( "<div id='replaceWith'></div>" ) );
assert.equal( jQuery( "#qunit-fixture" ).find( "div[id=replaceWith]" ).length, 1, "Make sure only one div exists after subsequent replacement." );
return expected;
}
QUnit.test( "replaceWith(String|Element|Array<Element>|jQuery)", function( assert ) {
testReplaceWith( manipulationBareObj, assert );
} );
QUnit.test( "replaceWith(Function)", function( assert ) {
assert.expect( testReplaceWith( manipulationFunctionReturningObj, assert ) + 1 );
var y = jQuery( "#foo" )[ 0 ];
jQuery( y ).replaceWith( function() {
assert.equal( this, y, "Make sure the context is coming in correctly." );
} );
} );
QUnit.test( "replaceWith(string) for more than one element", function( assert ) {
assert.expect( 3 );
assert.equal( jQuery( "#foo p" ).length, 3, "ensuring that test data has not changed" );
jQuery( "#foo p" ).replaceWith( "<span>bar</span>" );
assert.equal( jQuery( "#foo span" ).length, 3, "verify that all the three original element have been replaced" );
assert.equal( jQuery( "#foo p" ).length, 0, "verify that all the three original element have been replaced" );
} );
QUnit.test( "Empty replaceWith (trac-13401; trac-13596; gh-2204)", function( assert ) {
assert.expect( 25 );
var $el = jQuery( "<div></div><div></div>" ).html( "<p>0</p>" ),
expectedHTML = $el.html(),
tests = {
"empty string": "",
"empty array": [],
"array of empty string": [ "" ],
"empty collection": jQuery( "#nonexistent" ),
// in case of jQuery(...).replaceWith();
"undefined": undefined
};
jQuery.each( tests, function( label, input ) {
$el.html( "<a></a>" ).children().replaceWith( input );
assert.strictEqual( $el.html(), "", "replaceWith(" + label + ")" );
$el.html( "<b></b>" ).children().replaceWith( function() {
return input;
} );
assert.strictEqual( $el.html(), "", "replaceWith(function returning " + label + ")" );
$el.html( "<i></i>" ).children().replaceWith( function() {
return input;
} );
assert.strictEqual( $el.html(), "", "replaceWith(other function returning " + label + ")" );
$el.html( "<p></p>" ).children().replaceWith( function( i ) {
return i ?
input :
jQuery( this ).html( i + "" );
} );
assert.strictEqual( $el.eq( 0 ).html(), expectedHTML,
"replaceWith(function conditionally returning context)" );
assert.strictEqual( $el.eq( 1 ).html(), "",
"replaceWith(function conditionally returning " + label + ")" );
} );
} );
QUnit.test( "replaceAll(String)", function( assert ) {
assert.expect( 2 );
jQuery( "<b id='replace'>buga</b>" ).replaceAll( "#yahoo" );
assert.ok( jQuery( "#replace" )[ 0 ], "Replace element with string" );
assert.ok( !jQuery( "#yahoo" )[ 0 ], "Verify that original element is gone, after string" );
} );
QUnit.test( "replaceAll(Element)", function( assert ) {
assert.expect( 2 );
jQuery( document.getElementById( "first" ) ).replaceAll( "#yahoo" );
assert.ok( jQuery( "#first" )[ 0 ], "Replace element with element" );
assert.ok( !jQuery( "#yahoo" )[ 0 ], "Verify that original element is gone, after element" );
} );
QUnit.test( "replaceAll(Array<Element>)", function( assert ) {
assert.expect( 3 );
jQuery( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ).replaceAll( "#yahoo" );
assert.ok( jQuery( "#first" )[ 0 ], "Replace element with array of elements" );
assert.ok( jQuery( "#mark" )[ 0 ], "Replace element with array of elements" );
assert.ok( !jQuery( "#yahoo" )[ 0 ], "Verify that original element is gone, after array of elements" );
} );
QUnit.test( "replaceAll(jQuery)", function( assert ) {
assert.expect( 3 );
jQuery( "#mark, #first" ).replaceAll( "#yahoo" );
assert.ok( jQuery( "#first" )[ 0 ], "Replace element with set of elements" );
assert.ok( jQuery( "#mark" )[ 0 ], "Replace element with set of elements" );
assert.ok( !jQuery( "#yahoo" )[ 0 ], "Verify that original element is gone, after set of elements" );
} );
QUnit.test( "jQuery.clone() (trac-8017)", function( assert ) {
assert.expect( 2 );
assert.ok( jQuery.clone && typeof jQuery.clone === "function", "jQuery.clone() utility exists and is a function." );
var main = jQuery( "#qunit-fixture" )[ 0 ],
clone = jQuery.clone( main );
assert.equal( main.childNodes.length, clone.childNodes.length, "Simple child length to ensure a large dom tree copies correctly" );
} );
QUnit.test( "append to multiple elements (trac-8070)", function( assert ) {
assert.expect( 2 );
var selects = jQuery( "<select class='test8070'></select><select class='test8070'></select>" ).appendTo( "#qunit-fixture" );
selects.append( "<OPTION>1</OPTION><OPTION>2</OPTION>" );
assert.equal( selects[ 0 ].childNodes.length, 2, "First select got two nodes" );
assert.equal( selects[ 1 ].childNodes.length, 2, "Second select got two nodes" );
} );
QUnit.test( "table manipulation", function( assert ) {
assert.expect( 2 );
var table = jQuery( "<table style='font-size:16px'></table>" ).appendTo( "#qunit-fixture" ).empty(),
height = table[ 0 ].offsetHeight;
table.append( "<tr><td>DATA</td></tr>" );
assert.ok( table[ 0 ].offsetHeight - height >= 15, "appended rows are visible" );
table.empty();
height = table[ 0 ].offsetHeight;
table.prepend( "<tr><td>DATA</td></tr>" );
assert.ok( table[ 0 ].offsetHeight - height >= 15, "prepended rows are visible" );
} );
QUnit.test( "clone()", function( assert ) {
assert.expect( 45 );
var div, clone, form, body;
assert.equal( jQuery( "#en" ).text(), "This is a normal link: Yahoo", "Assert text for #en" );
assert.equal( jQuery( "#first" ).append( jQuery( "#yahoo" ).clone() ).text(), "Try them out:Yahoo", "Check for clone" );
assert.equal( jQuery( "#en" ).text(), "This is a normal link: Yahoo", "Reassert text for #en" );
jQuery.each( "table thead tbody tfoot tr td div button ul ol li select option textarea iframe".split( " " ), function( i, nodeName ) {
assert.equal( jQuery( "<" + nodeName + "/>" ).clone()[ 0 ].nodeName.toLowerCase(), nodeName, "Clone a " + nodeName );
} );
assert.equal( jQuery( "<input type='checkbox' />" ).clone()[ 0 ].nodeName.toLowerCase(), "input", "Clone a <input type='checkbox' />" );
// Check cloning non-elements
assert.equal( jQuery( "#nonnodes" ).contents().clone().length, 3, "Check node,textnode,comment clone works (some browsers delete comments on clone)" );
// Verify that clones of clones can keep event listeners
div = jQuery( "<div><ul><li>test</li></ul></div>" ).on( "click", function() {
assert.ok( true, "Bound event still exists." );
} );
clone = div.clone( true ); div.remove();
div = clone.clone( true ); clone.remove();
assert.equal( div.length, 1, "One element cloned" );
assert.equal( div[ 0 ].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
div.trigger( "click" );
// Manually clean up detached elements
div.remove();
// Verify that cloned children can keep event listeners
div = jQuery( "<div></div>" ).append( [ document.createElement( "table" ), document.createElement( "table" ) ] );
div.find( "table" ).on( "click", function() {
assert.ok( true, "Bound event still exists." );
} );
clone = div.clone( true );
assert.equal( clone.length, 1, "One element cloned" );
assert.equal( clone[ 0 ].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
clone.find( "table" ).trigger( "click" );
// Manually clean up detached elements
div.remove();
clone.remove();
// Make sure that doing .clone() doesn't clone event listeners
div = jQuery( "<div><ul><li>test</li></ul></div>" ).on( "click", function() {
assert.ok( false, "Bound event still exists after .clone()." );
} );
clone = div.clone();
clone.trigger( "click" );
// Manually clean up detached elements
clone.remove();
div.remove();
// Test both html() and clone() for <embed> and <object> types
div = jQuery( "<div></div>" ).html( "<embed height='355' width='425' src='http://www.youtube.com/v/3KANI2dpXLw&amp;hl=en'></embed>" );
clone = div.clone( true );
assert.equal( clone.length, 1, "One element cloned" );
assert.equal( clone.html(), div.html(), "Element contents cloned" );
assert.equal( clone[ 0 ].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
// this is technically an invalid object, but because of the special
// classid instantiation it is the only kind that IE has trouble with,
// so let's test with it too.
div = jQuery( "<div></div>" ).html( "<object height='355' width='425' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'> <param name='movie' value='http://www.youtube.com/v/3KANI2dpXLw&amp;hl=en'> <param name='wmode' value='transparent'> </object>" );
clone = div.clone( true );
assert.equal( clone.length, 1, "One element cloned" );
assert.equal( clone[ 0 ].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
div = div.find( "object" );
clone = clone.find( "object" );
// oldIE adds extra attributes and <param> elements, so just test for existence of the defined set
jQuery.each( [ "height", "width", "classid" ], function( i, attr ) {
assert.equal( clone.attr( attr ), div.attr( attr ), "<object> attribute cloned: " + attr );
} );
( function() {
var params = {};
clone.find( "param" ).each( function( index, param ) {
params[ param.attributes.name.nodeValue.toLowerCase() ] =
param.attributes.value.nodeValue.toLowerCase();
} );
div.find( "param" ).each( function( index, param ) {
var key = param.attributes.name.nodeValue.toLowerCase();
assert.equal( params[ key ], param.attributes.value.nodeValue.toLowerCase(), "<param> cloned: " + key );
} );
} )();
// and here's a valid one.
div = jQuery( "<div></div>" ).html( "<object height='355' width='425' type='application/x-shockwave-flash' data='http://www.youtube.com/v/3KANI2dpXLw&amp;hl=en'> <param name='movie' value='http://www.youtube.com/v/3KANI2dpXLw&amp;hl=en'> <param name='wmode' value='transparent'> </object>" );
clone = div.clone( true );
assert.equal( clone.length, 1, "One element cloned" );
assert.equal( clone.html(), div.html(), "Element contents cloned" );
assert.equal( clone[ 0 ].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
div = jQuery( "<div></div>" ).data( { "a": true } );
clone = div.clone( true );
assert.equal( clone.data( "a" ), true, "Data cloned." );
clone.data( "a", false );
assert.equal( clone.data( "a" ), false, "Ensure cloned element data object was correctly modified" );
assert.equal( div.data( "a" ), true, "Ensure cloned element data object is copied, not referenced" );
// manually clean up detached elements
div.remove();
clone.remove();
form = document.createElement( "form" );
form.action = "/test/";
div = document.createElement( "div" );
div.appendChild( document.createTextNode( "test" ) );
form.appendChild( div );
assert.equal( jQuery( form ).clone().children().length, 1, "Make sure we just get the form back." );
body = jQuery( "body" ).clone();
assert.equal( body.children()[ 0 ].id, "qunit", "Make sure cloning body works" );
body.remove();
} );
QUnit.test( "clone(script type=non-javascript) (trac-11359)", function( assert ) {
assert.expect( 3 );
var src = jQuery( "<script type='text/filler'>Lorem ipsum dolor sit amet</script><q><script type='text/filler'>consectetur adipiscing elit</script></q>" ),
dest = src.clone();
assert.equal( dest[ 0 ].text, "Lorem ipsum dolor sit amet", "Cloning preserves script text" );
assert.equal( dest.last().html(), src.last().html(), "Cloning preserves nested script text" );
assert.ok( /^\s*<scr.pt\s+type=['"]?text\/filler['"]?\s*>consectetur adipiscing elit<\/scr.pt>\s*$/i.test( dest.last().html() ), "Cloning preserves nested script text" );
dest.remove();
} );
QUnit.test( "clone(form element) (Bug trac-3879, trac-6655)", function( assert ) {
assert.expect( 5 );
var clone, element;
element = jQuery( "<select><option>Foo</option><option value='selected' selected>Bar</option></select>" );
assert.equal( element.clone().find( "option" ).filter( function() {
return this.selected;
} ).val(), "selected", "Selected option cloned correctly" );
element = jQuery( "<input type='checkbox' value='foo'>" ).attr( "checked", "checked" );
clone = element.clone();
assert.equal( clone.is( ":checked" ), element.is( ":checked" ), "Checked input cloned correctly" );
assert.equal( clone[ 0 ].defaultValue, "foo", "Checked input defaultValue cloned correctly" );
element = jQuery( "<input type='text' value='foo'>" );
clone = element.clone();
assert.equal( clone[ 0 ].defaultValue, "foo", "Text input defaultValue cloned correctly" );
element = jQuery( "<textarea>foo</textarea>" );
clone = element.clone();
assert.equal( clone[ 0 ].defaultValue, "foo", "Textarea defaultValue cloned correctly" );
} );
QUnit.test( "clone(multiple selected options) (Bug trac-8129)", function( assert ) {
assert.expect( 1 );
var element = jQuery( "<select><option>Foo</option><option selected>Bar</option><option selected>Baz</option></select>" );
function getSelectedOptions( collection ) {
return collection.find( "option" ).filter( function( option ) {
return option.selected;
} );
}
assert.equal(
getSelectedOptions( element.clone() ).length,
getSelectedOptions( element ).length,
"Multiple selected options cloned correctly"
);
} );
QUnit.test( "clone() on XML nodes", function( assert ) {
assert.expect( 2 );
var xml = createDashboardXML(),
root = jQuery( xml.documentElement ).clone(),
origTab = jQuery( "tab", xml ).eq( 0 ),
cloneTab = jQuery( "tab", root ).eq( 0 );
origTab.text( "origval" );
cloneTab.text( "cloneval" );
assert.equal( origTab.text(), "origval", "Check original XML node was correctly set" );
assert.equal( cloneTab.text(), "cloneval", "Check cloned XML node was correctly set" );
} );
QUnit.test( "clone() on local XML nodes with html5 nodename", function( assert ) {
assert.expect( 2 );
var $xmlDoc = jQuery( jQuery.parseXML( "<root><meter /></root>" ) ),
$meter = $xmlDoc.find( "meter" ).clone();
assert.equal( $meter[ 0 ].nodeName, "meter", "Check if nodeName was not changed due to cloning" );
assert.equal( $meter[ 0 ].nodeType, 1, "Check if nodeType is not changed due to cloning" );
} );
QUnit.test( "html(undefined)", function( assert ) {
assert.expect( 1 );
assert.equal( jQuery( "#foo" ).html( "<i>test</i>" ).html( undefined ).html().toLowerCase(), "<i>test</i>", ".html(undefined) is chainable (trac-5571)" );
} );
QUnit.test( "html() on empty set", function( assert ) {
assert.expect( 1 );
assert.strictEqual( jQuery().html(), undefined, ".html() returns undefined for empty sets (trac-11962)" );
} );
function childNodeNames( node ) {
return jQuery.map( node.childNodes, function( child ) {
return child.nodeName.toUpperCase();
} ).join( " " );
}
function testHtml( valueObj, assert ) {
assert.expect( 40 );
var actual, expected, tmp,
div = jQuery( "<div></div>" ),
fixture = jQuery( "#qunit-fixture" );
div.html( valueObj( "<div id='parent_1'><div id='child_1'></div></div><div id='parent_2'></div>" ) );
assert.equal( div.children().length, 2, "Found children" );
assert.equal( div.children().children().length, 1, "Found grandchild" );
actual = []; expected = [];
tmp = jQuery( "<map></map>" ).html( valueObj( "<area alt='area'></area>" ) ).each( function() {
expected.push( "AREA" );
actual.push( childNodeNames( this ) );
} );
assert.equal( expected.length, 1, "Expecting one parent" );
assert.deepEqual( actual, expected, "Found the inserted area element" );
assert.equal( div.html( valueObj( 5 ) ).html(), "5", "Setting a number as html" );
assert.equal( div.html( valueObj( 0 ) ).html(), "0", "Setting a zero as html" );
assert.equal( div.html( valueObj( Infinity ) ).html(), "Infinity", "Setting Infinity as html" );
assert.equal( div.html( valueObj( NaN ) ).html(), "", "Setting NaN as html" );
assert.equal( div.html( valueObj( 1e2 ) ).html(), "100", "Setting exponential number notation as html" );
div.html( valueObj( "&#160;&amp;" ) );
assert.equal(
div[ 0 ].innerHTML.replace( /\xA0/, "&nbsp;" ),
"&nbsp;&amp;",
"Entities are passed through correctly"
);
tmp = "&lt;div&gt;hello1&lt;/div&gt;";
assert.equal( div.html( valueObj( tmp ) ).html().replace( />/g, "&gt;" ), tmp, "Escaped html" );
tmp = "x" + tmp;
assert.equal( div.html( valueObj( tmp ) ).html().replace( />/g, "&gt;" ), tmp, "Escaped html, leading x" );
tmp = " " + tmp.slice( 1 );
assert.equal( div.html( valueObj( tmp ) ).html().replace( />/g, "&gt;" ), tmp, "Escaped html, leading space" );
actual = []; expected = []; tmp = {};
jQuery( "#nonnodes" ).contents().html( valueObj( "<b>bold</b>" ) ).each( function() {
var html = jQuery( this ).html();
tmp[ this.nodeType ] = true;
expected.push( this.nodeType === 1 ? "<b>bold</b>" : undefined );
actual.push( html ? html.toLowerCase() : html );
} );
assert.deepEqual( actual, expected, "Set containing element, text node, comment" );
assert.ok( tmp[ 1 ], "element" );
assert.ok( tmp[ 3 ], "text node" );
assert.ok( tmp[ 8 ], "comment" );
actual = []; expected = [];
fixture.children( "div" ).html( valueObj( "<b>test</b>" ) ).each( function() {
expected.push( "B" );
actual.push( childNodeNames( this ) );
} );
assert.equal( expected.length, 7, "Expecting many parents" );
assert.deepEqual( actual, expected, "Correct childNodes after setting HTML" );
actual = []; expected = [];
fixture.html( valueObj( "<style>.foobar{color:green;}</style>" ) ).each( function() {
expected.push( "STYLE" );
actual.push( childNodeNames( this ) );
} );
assert.equal( expected.length, 1, "Expecting one parent" );
assert.deepEqual( actual, expected, "Found the inserted style element" );
fixture.html( valueObj( "<select></select>" ) );
jQuery( "#qunit-fixture select" ).html( valueObj( "<option>O1</option><option selected='selected'>O2</option><option>O3</option>" ) );
assert.equal( jQuery( "#qunit-fixture select" ).val(), "O2", "Selected option correct" );
tmp = fixture.html(
valueObj( [
"<script type='something/else'>QUnit.assert.ok( false, 'evaluated: non-script' );</script>",
"<script type='text/javascript'>QUnit.assert.ok( true, 'evaluated: text/javascript' );</script>",
"<script type='text/ecmascript'>QUnit.assert.ok( true, 'evaluated: text/ecmascript' );</script>",
"<script>QUnit.assert.ok( true, 'evaluated: no type' );</script>",
"<div>",
"<script type='something/else'>QUnit.assert.ok( false, 'evaluated: inner non-script' );</script>",
"<script type='text/javascript'>QUnit.assert.ok( true, 'evaluated: inner text/javascript' );</script>",
"<script type='text/ecmascript'>QUnit.assert.ok( true, 'evaluated: inner text/ecmascript' );</script>",
"<script>QUnit.assert.ok( true, 'evaluated: inner no type' );</script>",
"</div>"
].join( "" ) )
).find( "script" );
assert.equal( tmp.length, 8, "All script tags remain." );
assert.equal( tmp[ 0 ].type, "something/else", "Non-evaluated type." );
assert.equal( tmp[ 1 ].type, "text/javascript", "Evaluated type." );
fixture.html( valueObj( "<script type='text/javascript'>QUnit.assert.ok( true, 'Injection of identical script' );</script>" ) );
fixture.html( valueObj( "<script type='text/javascript'>QUnit.assert.ok( true, 'Injection of identical script' );</script>" ) );
fixture.html( valueObj( "<script type='text/javascript'>QUnit.assert.ok( true, 'Injection of identical script' );</script>" ) );
fixture.html( valueObj( "foo <form><script type='text/javascript'>QUnit.assert.ok( true, 'Injection of identical script (trac-975)' );</script></form>" ) );
jQuery.scriptorder = 0;
fixture.html( valueObj( [
"<script>",
"QUnit.assert.equal( jQuery('#scriptorder').length, 1,'Execute after html' );",
"QUnit.assert.equal( jQuery.scriptorder++, 0, 'Script is executed in order' );",
"</script>",
"<span id='scriptorder'><script>QUnit.assert.equal( jQuery.scriptorder++, 1, 'Script (nested) is executed in order');</script></span>",
"<script>QUnit.assert.equal( jQuery.scriptorder++, 2, 'Script (unnested) is executed in order' );</script>"
].join( "" ) ) );
fixture.html( valueObj( fixture.text() ) );
assert.ok( /^[^<]*[^<\s][^<]*$/.test( fixture.html() ), "Replace html with text" );
}
QUnit.test( "html(String|Number)", function( assert ) {
testHtml( manipulationBareObj, assert );
} );
QUnit.test( "html(Function)", function( assert ) {
testHtml( manipulationFunctionReturningObj, assert );
} );
QUnit[
// Support: Edge 16-18+
// Edge sometimes doesn't execute module scripts so skip the test there.
( QUnit.moduleTypeSupported && !/edge\//i.test( navigator.userAgent ) ) ?
"test" :
"skip"
]( "html(script type module)", function( assert ) {
assert.expect( 4 );
var done = assert.async(),
$fixture = jQuery( "#qunit-fixture" );
$fixture.html(
[
"<script type='module'>QUnit.assert.ok( true, 'evaluated: module' );</script>",
"<script type='module' src='" + url( "module.js" ) + "'></script>",
"<div>",
"<script type='module'>QUnit.assert.ok( true, 'evaluated: inner module' );</script>",
"<script type='module' src='" + url( "inner_module.js" ) + "'></script>",
"</div>"
].join( "" )
);
// Allow asynchronous script execution to generate assertions
setTimeout( function() {
done();
}, 1000 );
} );
QUnit[
// Support: IE 9-11 only, Android 4.0-4.4 only, iOS 7-10 only
// `nomodule` scripts should be executed by legacy browsers only.
// iOS 10 supports `<script type="module">` but doesn't support the nomodule attribute
// so let's skip it here; sites supporting it must handle `nomodule` in a custom way anyway.
!/iphone os 10_/i.test( navigator.userAgent ) ?
"test" :
"skip"
]( "html(script nomodule)", function( assert ) {
assert.expect( QUnit.moduleTypeSupported ? 0 : 4 );
var done = assert.async(),
$fixture = jQuery( "#qunit-fixture" );
$fixture.html(
[
"<script nomodule>QUnit.assert.ok( !QUnit.moduleTypeSupported, 'evaluated: nomodule script' );</script>",
"<script nomodule src='" + url( "nomodule.js" ) + "'></script>",
"<div>",
"<script nomodule>QUnit.assert.ok( !QUnit.moduleTypeSupported, 'evaluated: inner nomodule script' );</script>",
"<script nomodule src='" + url( "inner_nomodule.js" ) + "'></script>",
"</div>"
].join( "" )
);
// Allow asynchronous script execution to generate assertions
setTimeout( function() {
done();
}, 1000 );
} );
QUnit.test( "html(self-removing script) (gh-5377)", function( assert ) {
assert.expect( 2 );
var $fixture = jQuery( "#qunit-fixture" );
$fixture.html(
[
"<script id='gh5377-1'>",
"(function removeScript() {",
"var id = 'gh5377-1';",
"var script = document.currentScript || document.getElementById(id);",
"script.parentNode.removeChild( script );",
"QUnit.assert.ok( true, 'removed document.currentScript' );",
"})();",
"</script>",
"<div>",
"<script id='gh5377-2'>",
"(function removeInnerScript() {",
"var id = 'gh5377-2';",
"var innerScript = document.currentScript || document.getElementById(id);",
"innerScript.parentNode.removeChild( innerScript );",
"QUnit.assert.ok( true, 'removed inner document.currentScript' );",
"})();",
"</script>",
"</div>"
].join( "\n" )
);
} );
QUnit.test( "html(Function) with incoming value -- direct selection", function( assert ) {
assert.expect( 4 );
var els, actualhtml, pass;
els = jQuery( "#foo > p" );
actualhtml = els.map( function() {
return jQuery( this ).html();
} );
els.html( function( i, val ) {
assert.equal( val, actualhtml[ i ], "Make sure the incoming value is correct." );
return "<b>test</b>";
} );
pass = true;
els.each( function() {
if ( this.childNodes.length !== 1 ) {
pass = false;
}
} );
assert.ok( pass, "Set HTML" );
} );
QUnit.test( "html(Function) with incoming value -- jQuery.contents()", function( assert ) {
assert.expect( 14 );
var actualhtml, j, $div, $div2, insert;
j = jQuery( "#nonnodes" ).contents();
actualhtml = j.map( function() {
return jQuery( this ).html();
} );
j.html( function( i, val ) {
assert.equal( val, actualhtml[ i ], "Make sure the incoming value is correct." );
return "<b>bold</b>";
} );
// Handle the case where no comment is in the document
if ( j.length === 2 ) {
assert.equal( null, null, "Make sure the incoming value is correct." );
}
assert.equal( j.html().replace( / xmlns="[^"]+"/g, "" ).toLowerCase(), "<b>bold</b>", "Check node,textnode,comment with html()" );
$div = jQuery( "<div></div>" );
assert.equal( $div.html( function( i, val ) {
assert.equal( val, "", "Make sure the incoming value is correct." );
return 5;
} ).html(), "5", "Setting a number as html" );
assert.equal( $div.html( function( i, val ) {
assert.equal( val, "5", "Make sure the incoming value is correct." );
return 0;
} ).html(), "0", "Setting a zero as html" );
$div2 = jQuery( "<div></div>" );
insert = "&lt;div&gt;hello1&lt;/div&gt;";
assert.equal( $div2.html( function( i, val ) {
assert.equal( val, "", "Make sure the incoming value is correct." );
return insert;
} ).html().replace( />/g, "&gt;" ), insert, "Verify escaped insertion." );
assert.equal( $div2.html( function( i, val ) {
assert.equal( val.replace( />/g, "&gt;" ), insert, "Make sure the incoming value is correct." );
return "x" + insert;
} ).html().replace( />/g, "&gt;" ), "x" + insert, "Verify escaped insertion." );
assert.equal( $div2.html( function( i, val ) {
assert.equal( val.replace( />/g, "&gt;" ), "x" + insert, "Make sure the incoming value is correct." );
return " " + insert;
} ).html().replace( />/g, "&gt;" ), " " + insert, "Verify escaped insertion." );
} );
QUnit.test( "clone()/html() don't expose jQuery/Sizzle expandos (trac-12858)", function( assert ) {
assert.expect( 2 );
var $content = jQuery( "<div><b><i>text</i></b></div>" ).appendTo( "#qunit-fixture" ),
expected = /^<b><i>text<\/i><\/b>$/i;
// Attach jQuery and Sizzle data (the latter with a non-qSA nth-child)
try {
$content.find( ":nth-child(1):lt(4)" ).data( "test", true );
// But don't break on a non-Sizzle build
} catch ( _ ) {
$content.find( "*" ).data( "test", true );
}
assert.ok( expected.test( $content.clone( false )[ 0 ].innerHTML ), "clone()" );
assert.ok( expected.test( $content.html() ), "html()" );
} );
QUnit.test( "remove() no filters", function( assert ) {
assert.expect( 2 );
var first = jQuery( "#ap" ).children().first();
first.data( "foo", "bar" );
jQuery( "#ap" ).children().remove();
assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" );
assert.equal( jQuery( "#ap" ).children().length, 0, "Check remove" );
} );
QUnit.test( "remove() with filters", function( assert ) {
assert.expect( 8 );
var markup, div;
jQuery( "#ap" ).children().remove( "a" );
assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" );
assert.equal( jQuery( "#ap" ).children().length, 1, "Check filtered remove" );
jQuery( "#ap" ).children().remove( "a, code" );
assert.equal( jQuery( "#ap" ).children().length, 0, "Check multi-filtered remove" );
// Positional and relative selectors
markup = "<div><span>1</span><span>2</span><span>3</span><span>4</span></div>";
div = jQuery( markup );
div.children().remove( "span:nth-child(2n)" );
assert.equal( div.text(), "13", "relative selector in remove" );
if ( QUnit.jQuerySelectorsPos ) {
div = jQuery( markup );
div.children().remove( "span:first" );
assert.equal( div.text(), "234", "positional selector in remove" );
div = jQuery( markup );
div.children().remove( "span:last" );
assert.equal( div.text(), "123", "positional selector in remove" );
} else {
assert.ok( "skip", "Positional selectors are not supported" );
assert.ok( "skip", "Positional selectors are not supported" );
}
// using contents will get comments regular, text, and comment nodes
// Handle the case where no comment is in the document
assert.ok( jQuery( "#nonnodes" ).contents().length >= 2, "Check node,textnode,comment remove works" );
jQuery( "#nonnodes" ).contents().remove();
assert.equal( jQuery( "#nonnodes" ).contents().length, 0, "Check node,textnode,comment remove works" );
} );
QUnit.test( "remove() event cleaning ", function( assert ) {
assert.expect( 1 );
var count, first, cleanUp;
count = 0;
first = jQuery( "#ap" ).children().first();
cleanUp = first.on( "click", function() {
count++;
} ).remove().appendTo( "#qunit-fixture" ).trigger( "click" );
assert.strictEqual( 0, count, "Event handler has been removed" );
// Clean up detached data
cleanUp.remove();
} );
QUnit.test( "remove() in document order trac-13779", function( assert ) {
assert.expect( 1 );
var last,
cleanData = jQuery.cleanData;
jQuery.cleanData = function( nodes ) {
last = jQuery.text( nodes[ 0 ] );
cleanData.call( this, nodes );
};
jQuery( "#qunit-fixture" ).append(
jQuery.parseHTML(
"<div class='removal-fixture'>1</div>" +
"<div class='removal-fixture'>2</div>" +
"<div class='removal-fixture'>3</div>"
)
);
jQuery( ".removal-fixture" ).remove();
assert.equal( last, 3, "The removal fixtures were removed in document order" );
jQuery.cleanData = cleanData;
} );
QUnit.test( "detach() no filters", function( assert ) {
assert.expect( 3 );
var first = jQuery( "#ap" ).children().first();
first.data( "foo", "bar" );
jQuery( "#ap" ).children().detach();
assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" );
assert.equal( jQuery( "#ap" ).children().length, 0, "Check remove" );
assert.equal( first.data( "foo" ), "bar" );
first.remove();
} );
QUnit.test( "detach() with filters", function( assert ) {
assert.expect( 8 );
var markup, div;
jQuery( "#ap" ).children().detach( "a" );
assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" );
assert.equal( jQuery( "#ap" ).children().length, 1, "Check filtered remove" );
jQuery( "#ap" ).children().detach( "a, code" );
assert.equal( jQuery( "#ap" ).children().length, 0, "Check multi-filtered remove" );
// Positional and relative selectors
markup = "<div><span>1</span><span>2</span><span>3</span><span>4</span></div>";
div = jQuery( markup );
div.children().detach( "span:nth-child(2n)" );
assert.equal( div.text(), "13", "relative selector in detach" );
if ( QUnit.jQuerySelectorsPos ) {
div = jQuery( markup );
div.children().detach( "span:first" );
assert.equal( div.text(), "234", "positional selector in detach" );
div = jQuery( markup );
div.children().detach( "span:last" );
assert.equal( div.text(), "123", "positional selector in detach" );
} else {
assert.ok( "skip", "Positional selectors are not supported" );
assert.ok( "skip", "Positional selectors are not supported" );
}
// using contents will get comments regular, text, and comment nodes
// Handle the case where no comment is in the document
assert.ok( jQuery( "#nonnodes" ).contents().length >= 2, "Check node,textnode,comment remove works" );
jQuery( "#nonnodes" ).contents().detach();
assert.equal( jQuery( "#nonnodes" ).contents().length, 0, "Check node,textnode,comment remove works" );
} );
QUnit.test( "detach() event cleaning ", function( assert ) {
assert.expect( 1 );
var count, first, cleanUp;
count = 0;
first = jQuery( "#ap" ).children().first();
cleanUp = first.on( "click", function() {
count++;
} ).detach().appendTo( "#qunit-fixture" ).trigger( "click" );
assert.strictEqual( 1, count, "Event handler has not been removed" );
// Clean up detached data
cleanUp.remove();
} );
QUnit.test( "empty()", function( assert ) {
assert.expect( 3 );
assert.equal( jQuery( "#ap" ).children().empty().text().length, 0, "Check text is removed" );
assert.equal( jQuery( "#ap" ).children().length, 4, "Check elements are not removed" );
// using contents will get comments regular, text, and comment nodes
var j = jQuery( "#nonnodes" ).contents();
j.empty();
assert.equal( j.html(), "", "Check node,textnode,comment empty works" );
} );
QUnit.test( "jQuery.cleanData", function( assert ) {
assert.expect( 14 );
var type, pos, div, child;
type = "remove";
// Should trigger 4 remove event
div = getDiv().remove();
// Should both do nothing
pos = "Outer";
div.trigger( "click" );
pos = "Inner";
div.children().trigger( "click" );
type = "empty";
div = getDiv();
child = div.children();
// Should trigger 2 remove event
div.empty();
// Should trigger 1
pos = "Outer";
div.trigger( "click" );
// Should do nothing
pos = "Inner";
child.trigger( "click" );
// Should trigger 2
div.remove();
type = "html";
div = getDiv();
child = div.children();
// Should trigger 2 remove event
div.html( "<div></div>" );
// Should trigger 1
pos = "Outer";
div.trigger( "click" );
// Should do nothing
pos = "Inner";
child.trigger( "click" );
// Should trigger 2
div.remove();
function getDiv() {
var div = jQuery( "<div class='outer'><div class='inner'></div></div>" ).on( "click", function() {
assert.ok( true, type + " " + pos + " Click event fired." );
} ).on( "focus", function() {
assert.ok( true, type + " " + pos + " Focus event fired." );
} ).find( "div" ).on( "click", function() {
assert.ok( false, type + " " + pos + " Click event fired." );
} ).on( "focus", function() {
assert.ok( false, type + " " + pos + " Focus event fired." );
} ).end().appendTo( "body" );
div[ 0 ].detachEvent = div[ 0 ].removeEventListener = function( t ) {
assert.ok( true, type + " Outer " + t + " event unbound" );
};
div[ 0 ].firstChild.detachEvent = div[ 0 ].firstChild.removeEventListener = function( t ) {
assert.ok( true, type + " Inner " + t + " event unbound" );
};
return div;
}
} );
QUnit.test( "jQuery.cleanData eliminates all private data (gh-2127)", function( assert ) {
assert.expect( 3 );
var div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" );
jQuery._data( div[ 0 ], "gh-2127", "testing" );
assert.ok( !jQuery.isEmptyObject( jQuery._data( div[ 0 ] ) ), "Ensure some private data exists" );
div.remove();
assert.ok( !jQuery.hasData( div[ 0 ] ), "Removed element hasData should return false" );
assert.ok( jQuery.isEmptyObject( jQuery._data( div[ 0 ] ) ),
"Private data is empty after node is removed" );
div.remove();
} );
QUnit.test( "jQuery.cleanData eliminates all public data", function( assert ) {
assert.expect( 3 );
var key,
div = jQuery( "<div></div>" );
div.data( "some", "data" );
assert.ok( !jQuery.isEmptyObject( jQuery.data( div[ 0 ] ) ), "Ensure some public data exists" );
div.remove();
assert.ok( !jQuery.hasData( div[ 0 ] ), "Removed element hasData should return false" );
// Make sure the expando is gone
for ( key in div[ 0 ] ) {
if ( /^jQuery/.test( key ) ) {
assert.strictEqual( div[ 0 ][ key ], undefined, "Expando was not removed when there was no more data" );
}
}
} );
QUnit.test( "domManip plain-text caching (trac-6779)", function( assert ) {
assert.expect( 1 );
// DOM manipulation fails if added text matches an Object method
var i,
$f = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ),
bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ];
for ( i = 0; i < bad.length; i++ ) {
try {
$f.append( bad[ i ] );
} catch ( _ ) {}
}
assert.equal( $f.text(), bad.join( "" ), "Cached strings that match Object properties" );
$f.remove();
} );
QUnit.test( "domManip executes scripts containing html comments or CDATA (trac-9221)", function( assert ) {
assert.expect( 4 );
jQuery( [
"<script type='text/javascript'>",
"<!--",
"QUnit.assert.ok( true, '<!-- handled' );",
"//-->",
"</script>"
].join( "\n" ) ).appendTo( "#qunit-fixture" );
jQuery( [
"<script type='text/javascript'>",
"<![CDATA[",
"QUnit.assert.ok( true, '<![CDATA[ handled' );",
"//]]>",
"</script>"
].join( "\n" ) ).appendTo( "#qunit-fixture" );
jQuery( [
"<script type='text/javascript'>",
"<!--//--><![CDATA[//><!--",
"QUnit.assert.ok( true, '<!--//--><![CDATA[//><!-- (Drupal case) handled' );",
"//--><!]]>",
"</script>"
].join( "\n" ) ).appendTo( "#qunit-fixture" );
// ES2015 in Annex B requires HTML-style comment delimiters (`<!--` & `-->`) to act as
// single-line comment delimiters; i.e. they should be treated as `//`.
// See gh-4904
jQuery( [
"<script type='text/javascript'>",
"<!-- Same-line HTML comment",
"QUnit.assert.ok( true, '<!-- Same-line HTML comment' );",
"-->",
"</script>"
].join( "\n" ) ).appendTo( "#qunit-fixture" );
} );
testIframe(
"domManip tolerates window-valued document[0] in IE9/10 (trac-12266)",
"manipulation/iframe-denied.html",
function( assert, jQuery, window, document, test ) {
assert.expect( 1 );
assert.ok( test.status, test.description );
}
);
testIframe(
"domManip executes scripts in iframes in the iframes' context",
"manipulation/scripts-context.html",
function( assert, framejQuery, frameWindow, frameDocument ) {
assert.expect( 2 );
jQuery( frameDocument.body ).append( "<script>window.scriptTest = true;<\x2fscript>" );
assert.ok( !window.scriptTest, "script executed in iframe context" );
assert.ok( frameWindow.scriptTest, "script executed in iframe context" );
}
);
testIframe(
"domManip executes external scripts in iframes in the iframes' context",
"manipulation/scripts-context.html",
function( assert, framejQuery, frameWindow, frameDocument ) {
assert.expect( 2 );
Globals.register( "finishTest" );
return new Promise( function( resolve ) {
window.finishTest = resolve;
jQuery( frameDocument.body ).append(
"<script src='" + url( "manipulation/set-global-scripttest.js" ) + "'></script>" );
assert.ok( !window.scriptTest, "script executed in iframe context" );
assert.ok( frameWindow.scriptTest, "script executed in iframe context" );
} );
},
// The AJAX module is needed for jQuery._evalUrl.
QUnit[ includesModule( "ajax" ) ? "test" : "skip" ]
);
QUnit.test( "jQuery.clone - no exceptions for object elements trac-9587", function( assert ) {
assert.expect( 1 );
try {
jQuery( "#no-clone-exception" ).clone();
assert.ok( true, "cloned with no exceptions" );
} catch ( e ) {
assert.ok( false, e.message );
}
} );
QUnit.test( "Cloned, detached HTML5 elems (trac-10667, trac-10670)", function( assert ) {
assert.expect( 7 );
var $clone,
$section = jQuery( "<section>" ).appendTo( "#qunit-fixture" );
// First clone
$clone = $section.clone();
// This branch tests a known behavior in modern browsers that should never fail.
// Included for expected test count symmetry (expecting 1)
assert.equal( $clone[ 0 ].nodeName, "SECTION", "detached clone nodeName matches 'SECTION'" );
// Bind an event
$section.on( "click", function() {
assert.ok( true, "clone fired event" );
} );
// Second clone (will have an event bound)
$clone = $section.clone( true );
// Trigger an event from the first clone
$clone.trigger( "click" );
$clone.off( "click" );
// Add a child node with text to the original
$section.append( "<p>Hello</p>" );
// Third clone (will have child node and text)
$clone = $section.clone( true );
assert.equal( $clone.find( "p" ).text(), "Hello", "Assert text in child of clone" );
// Trigger an event from the third clone
$clone.trigger( "click" );
$clone.off( "click" );
// Add attributes to copy
$section.attr( {
"class": "foo bar baz",
"title": "This is a title"
} );
// Fourth clone (will have newly added attributes)
$clone = $section.clone( true );
assert.equal( $clone.attr( "class" ), $section.attr( "class" ), "clone and element have same class attribute" );
assert.equal( $clone.attr( "title" ), $section.attr( "title" ), "clone and element have same title attribute" );
// Remove the original
$section.remove();
// Clone the clone
$section = $clone.clone( true );
// Remove the clone
$clone.remove();
// Trigger an event from the clone of the clone
$section.trigger( "click" );
// Unbind any remaining events
$section.off( "click" );
$clone.off( "click" );
} );
QUnit.test( "Guard against exceptions when clearing safeChildNodes", function( assert ) {
assert.expect( 1 );
var div;
try {
div = jQuery( "<div></div><hr/><code></code><b></b>" );
} catch ( _ ) {}
assert.ok( div && div.jquery, "Created nodes safely, guarded against exceptions on safeChildNodes[ -1 ]" );
} );
QUnit.test( "Ensure oldIE creates a new set on appendTo (trac-8894)", function( assert ) {
assert.expect( 5 );
assert.strictEqual( jQuery( "<div></div>" ).clone().addClass( "test" ).appendTo( "<div></div>" ).end().end().hasClass( "test" ), false, "Check jQuery.fn.appendTo after jQuery.clone" );
assert.strictEqual( jQuery( "<div></div>" ).find( "p" ).end().addClass( "test" ).appendTo( "<div></div>" ).end().end().hasClass( "test" ), false, "Check jQuery.fn.appendTo after jQuery.fn.find" );
assert.strictEqual( jQuery( "<div></div>" ).text( "test" ).addClass( "test" ).appendTo( "<div></div>" ).end().end().hasClass( "test" ), false, "Check jQuery.fn.appendTo after jQuery.fn.text" );
assert.strictEqual( jQuery( "<bdi></bdi>" ).clone().addClass( "test" ).appendTo( "<div></div>" ).end().end().hasClass( "test" ), false, "Check jQuery.fn.appendTo after clone html5 element" );
assert.strictEqual( jQuery( "<p></p>" ).appendTo( "<div></div>" ).end().length, jQuery( "<p>test</p>" ).appendTo( "<div></div>" ).end().length, "Elements created with createElement and with createDocumentFragment should be treated alike" );
} );
QUnit.test( "html() - script exceptions bubble (trac-11743)", function( assert ) {
assert.expect( 2 );
var done = assert.async(),
onerror = window.onerror;
setTimeout( function() {
window.onerror = onerror;
done();
}, 1000 );
window.onerror = function() {
assert.ok( true, "Exception thrown" );
if ( includesModule( "ajax" ) ) {
window.onerror = function() {
assert.ok( true, "Exception thrown in remote script" );
};
jQuery( "#qunit-fixture" ).html( "<script src='" + baseURL + "badcall.js'></script>" );
assert.ok( true, "Exception ignored" );
} else {
assert.ok( true, "No jQuery.ajax" );
}
};
jQuery( "#qunit-fixture" ).html( "<script>undefined();</script>" );
} );
QUnit.test( "checked state is cloned with clone()", function( assert ) {
assert.expect( 2 );
var elem = jQuery.parseHTML( "<input type='checkbox' checked='checked'/>" )[ 0 ];
elem.checked = false;
assert.equal( jQuery( elem ).clone().attr( "id", "clone" )[ 0 ].checked, false, "Checked false state correctly cloned" );
elem = jQuery.parseHTML( "<input type='checkbox'/>" )[ 0 ];
elem.checked = true;
assert.equal( jQuery( elem ).clone().attr( "id", "clone" )[ 0 ].checked, true, "Checked true state correctly cloned" );
} );
QUnit.test( "manipulate mixed jQuery and text (trac-12384, trac-12346)", function( assert ) {
assert.expect( 2 );
var div = jQuery( "<div>a</div>" ).append( "&nbsp;", jQuery( "<span>b</span>" ), "&nbsp;", jQuery( "<span>c</span>" ) ),
nbsp = String.fromCharCode( 160 );
assert.equal( div.text(), "a" + nbsp + "b" + nbsp + "c", "Appending mixed jQuery with text nodes" );
div = jQuery( "<div><div></div></div>" )
.find( "div" )
.after( "<p>a</p>", "<p>b</p>" )
.parent();
assert.equal( div.find( "*" ).length, 3, "added 2 paragraphs after inner div" );
} );
QUnit.test( "script evaluation (trac-11795)", function( assert ) {
assert.expect( 13 );
var scriptsIn, scriptsOut,
fixture = jQuery( "#qunit-fixture" ).empty(),
objGlobal = ( function() {
return this;
} )(),
isOk = objGlobal.ok,
notOk = function() {
var args = arguments;
args[ 0 ] = !args[ 0 ];
return isOk.apply( this, args );
};
objGlobal.ok = notOk;
scriptsIn = jQuery( [
"<script type='something/else'>QUnit.assert.ok( false, 'evaluated: non-script' );</script>",
"<script type='text/javascript'>QUnit.assert.ok( true, 'evaluated: text/javascript' );</script>",
"<script type='text/ecmascript'>QUnit.assert.ok( true, 'evaluated: text/ecmascript' );</script>",
"<script>QUnit.assert.ok( true, 'evaluated: no type' );</script>",
"<div>",
"<script type='something/else'>QUnit.assert.ok( false, 'evaluated: inner non-script' );</script>",
"<script type='text/javascript'>QUnit.assert.ok( true, 'evaluated: inner text/javascript' );</script>",
"<script type='text/ecmascript'>QUnit.assert.ok( true, 'evaluated: inner text/ecmascript' );</script>",
"<script>QUnit.assert.ok( true, 'evaluated: inner no type' );</script>",
"</div>"
].join( "" ) );
scriptsIn.appendTo( jQuery( "<div class='detached'></div>" ) );
objGlobal.ok = isOk;
scriptsOut = fixture.append( scriptsIn ).find( "script" );
assert.equal( scriptsOut[ 0 ].type, "something/else", "Non-evaluated type." );
assert.equal( scriptsOut[ 1 ].type, "text/javascript", "Evaluated type." );
assert.deepEqual( scriptsOut.get(), fixture.find( "script" ).get(), "All script tags remain." );
objGlobal.ok = notOk;
scriptsOut = scriptsOut.add( scriptsOut.clone() ).appendTo( fixture.find( "div" ) );
assert.deepEqual( fixture.find( "div script" ).get(), scriptsOut.get(), "Scripts cloned without reevaluation" );
fixture.append( scriptsOut.detach() );
assert.deepEqual( fixture.children( "script" ).get(), scriptsOut.get(), "Scripts detached without reevaluation" );
objGlobal.ok = isOk;
if ( includesModule( "ajax" ) ) {
Globals.register( "testBar" );
jQuery( "#qunit-fixture" ).append( "<script src='" + url( "mock.php?action=testbar" ) + "'></script>" );
assert.strictEqual( window.testBar, "bar", "Global script evaluation" );
} else {
assert.ok( true, "No jQuery.ajax" );
assert.ok( true, "No jQuery.ajax" );
}
} );
QUnit[ includesModule( "ajax" ) ? "test" : "skip" ]( "jQuery._evalUrl (trac-12838)", function( assert ) {
assert.expect( 5 );
var message, expectedArgument,
ajax = jQuery.ajax,
evalUrl = jQuery._evalUrl;
message = "jQuery.ajax implementation";
expectedArgument = 1;
jQuery.ajax = function( input ) {
assert.equal( ( input.url || input ).slice( -1 ), expectedArgument, message );
expectedArgument++;
};
jQuery( "#qunit-fixture" ).append( "<script src='1'></script><script src='2'></script>" );
assert.equal( expectedArgument, 3, "synchronous execution" );
message = "custom implementation";
expectedArgument = 3;
jQuery._evalUrl = jQuery.ajax;
jQuery.ajax = function( options ) {
assert.strictEqual( options, {}, "Unexpected call to jQuery.ajax" );
};
jQuery( "#qunit-fixture" ).append( "<script src='3'></script><script src='4'></script>" );
jQuery.ajax = ajax;
jQuery._evalUrl = evalUrl;
} );
QUnit.test( "jQuery.htmlPrefilter (gh-1747)", function( assert ) {
assert.expect( 5 );
var expectedArgument,
invocations = 0,
done = assert.async(),
htmlPrefilter = jQuery.htmlPrefilter,
fixture = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ),
poison = "<script>jQuery.htmlPrefilter.assert.ok( false, 'script not executed' );</script>";
jQuery.htmlPrefilter = function( html ) {
invocations++;
assert.equal( html, expectedArgument, "Expected input" );
// Remove <script> and <del> elements
return htmlPrefilter.apply( this, arguments )
.replace( /<(script|del)(?=[\s>])[\w\W]*?<\/\1\s*>/ig, "" );
};
jQuery.htmlPrefilter.assert = assert;
expectedArgument = "A-" + poison + "B-" + poison + poison + "C-";
fixture.html( expectedArgument );
expectedArgument = "D-" + poison + "E-" + "<del></del><div>" + poison + poison + "</div>" + "F-";
fixture.append( expectedArgument );
expectedArgument = poison;
fixture.find( "div" ).replaceWith( expectedArgument );
assert.equal( invocations, 3, "htmlPrefilter invoked for all DOM manipulations" );
assert.equal( fixture.html(), "A-B-C-D-E-F-", "htmlPrefilter modified HTML" );
// Allow asynchronous script execution to generate assertions
setTimeout( function() {
jQuery.htmlPrefilter = htmlPrefilter;
done();
}, 100 );
} );
QUnit.test( "insertAfter, insertBefore, etc do not work when destination is original element. Element is removed (trac-4087)", function( assert ) {
assert.expect( 10 );
jQuery.each( [
"appendTo",
"prependTo",
"insertBefore",
"insertAfter",
"replaceAll"
], function( index, name ) {
jQuery( [
"<ul id='test4087-complex'><li class='test4087'><div>c1</div>h1</li><li><div>c2</div>h2</li></ul>",
"<div id='test4087-simple'><div class='test4087-1'>1<div class='test4087-2'>2</div><div class='test4087-3'>3</div></div></div>",
"<div id='test4087-multiple'><div class='test4087-multiple'>1</div><div class='test4087-multiple'>2</div></div>"
].join( "" ) ).appendTo( "#qunit-fixture" );
// complex case based on https://jsfiddle.net/pbramos/gZ7vB/
jQuery( "#test4087-complex div" )[ name ]( "#test4087-complex li:last-child div:last-child" );
assert.equal( jQuery( "#test4087-complex li:last-child div" ).length, name === "replaceAll" ? 1 : 2, name + " a node to itself, complex case." );
// simple case
jQuery( ".test4087-1" )[ name ]( ".test4087-1" );
assert.equal( jQuery( ".test4087-1" ).length, 1, name + " a node to itself, simple case." );
// clean for next test
jQuery( "#test4087-complex" ).remove();
jQuery( "#test4087-simple" ).remove();
jQuery( "#test4087-multiple" ).remove();
} );
} );
QUnit.test( "Index for function argument should be received (trac-13094)", function( assert ) {
assert.expect( 2 );
var i = 0;
jQuery( "<div></div><div></div>" ).before( function( index ) {
assert.equal( index, i++, "Index should be correct" );
} );
} );
QUnit.test( "Make sure jQuery.fn.remove can work on elements in documentFragment", function( assert ) {
assert.expect( 1 );
var fragment = document.createDocumentFragment(),
div = fragment.appendChild( document.createElement( "div" ) );
jQuery( div ).remove();
assert.equal( fragment.childNodes.length, 0, "div element was removed from documentFragment" );
} );
QUnit.test( "Make sure specific elements with content created correctly (trac-13232)", function( assert ) {
assert.expect( 20 );
var results = [],
args = [],
elems = {
thead: "<tr><td>thead</td></tr>",
tbody: "<tr><td>tbody</td></tr>",
tfoot: "<tr><td>tfoot</td></tr>",
colgroup: "<col span='5'></col>",
caption: "caption",
tr: "<td>tr</td>",
th: "th",
td: "<div>td</div>",
optgroup: "<option>optgroup</option>",
option: "option"
};
jQuery.each( elems, function( name, value ) {
var html = "<" + name + ">" + value + "</" + name + ">";
assert.ok( jQuery.parseHTML( "<" + name + ">" + value + "</" + name + ">" )[ 0 ].nodeName.toLowerCase() === name, name + " is created correctly" );
results.push( name );
args.push( html );
} );
jQuery.fn.append.apply( jQuery( "<div></div>" ), args ).children().each( function( i ) {
assert.ok( this.nodeName.toLowerCase() === results[ i ] );
} );
} );
QUnit.test( "Validate creation of multiple quantities of certain elements (trac-13818)", function( assert ) {
assert.expect( 22 );
var tags = [ "thead", "tbody", "tfoot", "colgroup", "col", "caption", "tr", "th", "td", "optgroup", "option" ];
jQuery.each( tags, function( index, tag ) {
jQuery( "<" + tag + "></" + tag + "><" + tag + "></" + tag + ">" ).each( function() {
assert.ok( this.nodeName.toLowerCase() === tag, tag + " elements created correctly" );
} );
} );
} );
QUnit.test( "Make sure tr element will be appended to tbody element of table when present", function( assert ) {
assert.expect( 1 );
var html,
table = document.createElement( "table" );
table.appendChild( document.createElement( "tbody" ) );
document.getElementById( "qunit-fixture" ).appendChild( table );
jQuery( table ).append( "<tr><td>test</td></tr>" );
// Lowercase and replace spaces to remove possible browser inconsistencies
html = table.innerHTML.toLowerCase().replace( /\s/g, "" );
assert.strictEqual( html, "<tbody><tr><td>test</td></tr></tbody>" );
} );
QUnit.test( "Make sure tr elements will be appended to tbody element of table when present", function( assert ) {
assert.expect( 1 );
var html,
table = document.createElement( "table" );
table.appendChild( document.createElement( "tbody" ) );
document.getElementById( "qunit-fixture" ).appendChild( table );
jQuery( table ).append( "<tr><td>1</td></tr><tr><td>2</td></tr>" );
// Lowercase and replace spaces to remove possible browser inconsistencies
html = table.innerHTML.toLowerCase().replace( /\s/g, "" );
assert.strictEqual( html, "<tbody><tr><td>1</td></tr><tr><td>2</td></tr></tbody>" );
} );
QUnit.test( "Make sure tfoot element will not be appended to tbody element of table when present", function( assert ) {
assert.expect( 1 );
var html,
table = document.createElement( "table" );
table.appendChild( document.createElement( "tbody" ) );
document.getElementById( "qunit-fixture" ).appendChild( table );
jQuery( table ).append( "<tfoot></tfoot>" );
// Lowercase and replace spaces to remove possible browser inconsistencies
html = table.innerHTML.toLowerCase().replace( /\s/g, "" );
assert.strictEqual( html, "<tbody></tbody><tfoot></tfoot>" );
} );
QUnit.test( "Make sure document fragment will be appended to tbody element of table when present", function( assert ) {
assert.expect( 1 );
var html,
fragment = document.createDocumentFragment(),
table = document.createElement( "table" ),
tr = document.createElement( "tr" ),
td = document.createElement( "td" );
table.appendChild( document.createElement( "tbody" ) );
document.getElementById( "qunit-fixture" ).appendChild( table );
fragment.appendChild( tr );
tr.appendChild( td );
td.innerHTML = "test";
jQuery( table ).append( fragment );
// Lowercase and replace spaces to remove possible browser inconsistencies
html = table.innerHTML.toLowerCase().replace( /\s/g, "" );
assert.strictEqual( html, "<tbody><tr><td>test</td></tr></tbody>" );
} );
QUnit.test( "Make sure col element is appended correctly", function( assert ) {
assert.expect( 1 );
var table = jQuery( "<table cellpadding='0'><tr><td>test</td></tr></table>" );
jQuery( table ).appendTo( "#qunit-fixture" );
jQuery( "<col width='150'></col>" ).prependTo( table );
assert.strictEqual( table.find( "td" ).width(), 150 );
} );
QUnit.test( "Make sure tr is not appended to the wrong tbody (gh-3439)", function( assert ) {
assert.expect( 1 );
var htmlOut,
htmlIn =
"<thead><tr><td>" +
"<table><tbody><tr><td>nested</td></tr></tbody></table>" +
"</td></tr></thead>",
newRow = "<tr><td>added</td></tr>",
htmlExpected = htmlIn.replace( "</thead>", "</thead>" + newRow ),
table = supportjQuery( "<table></table>" ).html( htmlIn ).appendTo( "#qunit-fixture" )[ 0 ];
jQuery( table ).append( newRow );
// Lowercase and replace spaces to remove possible browser inconsistencies
htmlOut = table.innerHTML.toLowerCase().replace( /\s/g, "" );
assert.strictEqual( htmlOut, htmlExpected );
} );
[ true, false ].forEach( function( adoptedCase ) {
QUnit[
typeof HTMLTemplateElement === "function" ?
"test" :
"skip"
]( "Manip within <template /> content moved back & forth doesn't throw - " + (
adoptedCase ? "explicitly adopted" : "not explicitly adopted"
) + " (gh-5147)",
function( assert ) {
assert.expect( 1 );
var fragment, diva, divb,
div = jQuery( "" +
"<div>\n" +
" <div><div class='a'></div></div>\n" +
" <div><div class='b'></div></div>\n" +
"</div>" +
"" ),
template = jQuery( "<template></template>" );
jQuery( "#qunit-fixture" )
.append( div )
.append( template );
fragment = template[ 0 ].content;
diva = div.find( ".a" );
divb = div.find( ".b" );
if ( adoptedCase ) {
document.adoptNode( fragment );
}
fragment.appendChild( div.children()[ 0 ] );
fragment.appendChild( div.children()[ 0 ] );
diva.insertBefore( divb );
assert.strictEqual( diva.siblings( ".b" ).length, 1,
"Insertion worked" );
}
);
} );
QUnit.test( "Make sure tags with single-character names are found (gh-4124)", function( assert ) {
assert.expect( 1 );
var htmlOut,
htmlIn = "<p>foo<!--<td>--></p>",
$el = jQuery( "<div></div>" );
$el.html( htmlIn );
// Lowercase and replace spaces to remove possible browser inconsistencies
htmlOut = $el[ 0 ].innerHTML.toLowerCase().replace( /\s/g, "" );
assert.strictEqual( htmlOut, htmlIn );
} );
// The AJAX module is needed for jQuery._evalUrl.
QUnit[ includesModule( "ajax" ) ? "test" : "skip" ]( "Insert script with data-URI (gh-1887)", function( assert ) {
assert.expect( 1 );
Globals.register( "testFoo" );
Globals.register( "testSrcFoo" );
var script = document.createElement( "script" ),
fixture = document.getElementById( "qunit-fixture" ),
done = assert.async();
script.src = "data:text/javascript,testSrcFoo = 'foo';";
fixture.appendChild( script );
jQuery( fixture ).append( "<script src=\"data:text/javascript,testFoo = 'foo';\"></script>" );
setTimeout( function() {
if ( window.testSrcFoo === "foo" ) {
assert.strictEqual( window.testFoo, window.testSrcFoo, "data-URI script executed" );
} else {
assert.ok( true, "data-URI script is not supported by this environment" );
}
done();
}, 100 );
} );
QUnit.test( "Ignore content from unsuccessful responses (gh-4126)", function( assert ) {
assert.expect( 1 );
var globalEval = jQuery.globalEval;
jQuery.globalEval = function( _code ) {
assert.ok( false, "no attempt to evaluate code from an unsuccessful response" );
};
try {
jQuery( "#qunit-fixture" ).append(
"<script src='" + url( "mock.php?action=error" ) + "'></script>" );
assert.ok( true, "no error thrown from embedding script with unsuccessful-response src" );
} catch ( e ) {
throw e;
} finally {
jQuery.globalEval = globalEval;
}
} );
testIframe(
"Check if CSP nonce is preserved",
"mock.php?action=cspNonce",
function( assert ) {
var done = assert.async();
assert.expect( 1 );
supportjQuery.get( baseURL + "support/csp.log" ).done( function( data ) {
assert.equal( data, "", "No log request should be sent" );
supportjQuery.get( baseURL + "mock.php?action=cspClean" ).done( done );
} );
},
// Support: Edge 18+, iOS 7-9 only, Android 4.0-4.4 only
// Edge doesn't support nonce in non-inline scripts.
// See https://web.archive.org/web/20171203124125/https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/13246371/
// Old iOS & Android Browser versions support script-src but not nonce, making this test
// impossible to run. Browsers not supporting CSP at all are not a problem as they'll skip
// script-src restrictions completely.
QUnit[ /\bedge\/|iphone os [789]|android 4\./i.test( navigator.userAgent ) ? "skip" : "test" ]
);
testIframe(
"Check if CSP nonce is preserved for external scripts with src attribute",
"mock.php?action=cspNonce&test=external",
function( assert ) {
var done = assert.async();
assert.expect( 1 );
supportjQuery.get( baseURL + "support/csp.log" ).done( function( data ) {
assert.equal( data, "", "No log request should be sent" );
supportjQuery.get( baseURL + "mock.php?action=cspClean" ).done( done );
} );
},
// The AJAX module is needed for jQuery._evalUrl.
// Support: Edge 18+, iOS 7-9 only, Android 4.0-4.4 only
// Edge doesn't support nonce in non-inline scripts.
// See https://web.archive.org/web/20171203124125/https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/13246371/
// Old iOS & Android Browser versions support script-src but not nonce, making this test
// impossible to run. Browsers not supporting CSP at all are not a problem as they'll skip
// script-src restrictions completely.
QUnit[ includesModule( "ajax" ) && !/\bedge\/|iphone os [789]|android 4\./i.test( navigator.userAgent ) ? "test" : "skip" ]
);
testIframe(
"jQuery.globalEval supports nonce",
"mock.php?action=cspNonce&test=globaleval",
function( assert ) {
var done = assert.async();
assert.expect( 1 );
supportjQuery.get( baseURL + "support/csp.log" ).done( function( data ) {
assert.equal( data, "", "No log request should be sent" );
supportjQuery.get( baseURL + "mock.php?action=cspClean" ).done( done );
} );
},
// Support: Edge 18+, iOS 7-9 only, Android 4.0-4.4 only
// Edge doesn't support nonce in non-inline scripts.
// See https://web.archive.org/web/20171203124125/https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/13246371/
// Old iOS & Android Browser versions support script-src but not nonce, making this test
// impossible to run. Browsers not supporting CSP at all are not a problem as they'll skip
// script-src restrictions completely.
QUnit[ /\bedge\/|iphone os [789]|android 4\./i.test( navigator.userAgent ) ? "skip" : "test" ]
);
QUnit.test( "Sanitized HTML doesn't get unsanitized", function( assert ) {
var container,
counter = 0,
oldIos = /iphone os (?:8|9|10|11|12)_/i.test( navigator.userAgent ),
assertCount = oldIos ? 12 : 13,
done = assert.async( assertCount );
assert.expect( assertCount );
Globals.register( "xss" );
window.xss = sinon.spy();
container = jQuery( "<div></div>" );
container.appendTo( "#qunit-fixture" );
function test( htmlString ) {
var currCounter = counter,
div = jQuery( "<div></div>" );
counter++;
div.appendTo( container );
div.html( htmlString );
setTimeout( function() {
assert.ok( window.xss.withArgs( currCounter ).notCalled,
"Insecure code wasn't executed, input: " + htmlString );
done();
}, 1000 );
}
// Note: below test cases need to invoke the xss function with consecutive
// decimal parameters for the assertion messages to be correct.
// Thanks to Masato Kinugawa from Cure53 for providing the following test cases.
test( "<img alt=\"<x\" title=\"/><img src=url404 onerror=xss(0)>\">" );
test( "<img alt=\"\n<x\" title=\"/>\n<img src=url404 onerror=xss(1)>\">" );
test( "<style><style/><img src=url404 onerror=xss(2)>" );
test( "<xmp><xmp/><img src=url404 onerror=xss(3)>" );
test( "<title><title /><img src=url404 onerror=xss(4)>" );
test( "<iframe><iframe/><img src=url404 onerror=xss(5)>" );
test( "<noframes><noframes/><img src=url404 onerror=xss(6)>" );
test( "<noscript><noscript/><img src=url404 onerror=xss(7)>" );
test( "<foo\" alt=\"\" title=\"/><img src=url404 onerror=xss(8)>\">" );
test( "<img alt=\"<x\" title=\"\" src=\"/><img src=url404 onerror=xss(9)>\">" );
test( "<noscript/><img src=url404 onerror=xss(10)>" );
test( "<option><style></option></select><img src=url404 onerror=xss(11)></style>" );
// Support: iOS 8 - 12 only.
// Old iOS parses `<noembed>` tags differently, executing this code. This is no
// different to native behavior on that OS, though, so just accept it.
if ( !oldIos ) {
test( "<noembed><noembed/><img src=url404 onerror=xss(12)>" );
}
} );