| ( function() { | |
| if ( !includesModule( "wrap" ) ) { | |
| return; | |
| } | |
| QUnit.module( "wrap", { | |
| afterEach: moduleTeardown | |
| } ); | |
| // See test/unit/manipulation.js for explanation about these 2 functions | |
| function manipulationBareObj( value ) { | |
| return value; | |
| } | |
| function manipulationFunctionReturningObj( value ) { | |
| return function() { | |
| return value; | |
| }; | |
| } | |
| function testWrap( val, assert ) { | |
| assert.expect( 18 ); | |
| var defaultText, result, j, i, cacheLength; | |
| defaultText = "Try them out:"; | |
| result = jQuery( "#first" ).wrap( val( "<div class='red'><span></span></div>" ) ).text(); | |
| assert.equal( | |
| defaultText, result, "Check for wrapping of on-the-fly html" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" | |
| ); | |
| result = jQuery( "#first" ).wrap( val( document.getElementById( "empty" ) ) ).parent(); | |
| assert.ok( | |
| result.is( "ol" ), "Check for element wrapping" | |
| ); | |
| assert.equal( | |
| result.text(), defaultText, "Check for element wrapping" | |
| ); | |
| jQuery( "#check1" ).on( "click", function() { | |
| var checkbox = this; | |
| assert.ok( | |
| checkbox.checked, "Checkbox's state is erased after wrap() action, see trac-769" | |
| ); | |
| jQuery( checkbox ).wrap( val( "<div id='c1' style='display:none;'></div>" ) ); | |
| assert.ok( | |
| checkbox.checked, "Checkbox's state is erased after wrap() action, see trac-769" | |
| ); | |
| } ).prop( "checked", false )[ 0 ].click(); | |
| // using contents will get comments regular, text, and comment nodes | |
| j = jQuery( "#nonnodes" ).contents(); | |
| j.wrap( val( "<i></i>" ) ); | |
| assert.equal( | |
| jQuery( "#nonnodes > i" ).length, 3, | |
| "Check node,textnode,comment wraps ok" | |
| ); | |
| assert.equal( | |
| jQuery( "#nonnodes > i" ).text(), j.text(), | |
| "Check node,textnode,comment wraps doesn't hurt text" | |
| ); | |
| j = jQuery( "<label></label>" ).wrap( val( "<li></li>" ) ); | |
| assert.equal( | |
| j[ 0 ] .nodeName.toUpperCase(), "LABEL", "Element is a label" | |
| ); | |
| assert.equal( | |
| j[ 0 ].parentNode.nodeName.toUpperCase(), "LI", "Element has been wrapped" | |
| ); | |
| // Wrap an element containing a text node | |
| j = jQuery( "<span></span>" ).wrap( "<div>test</div>" ); | |
| assert.equal( | |
| j[ 0 ].previousSibling.nodeType, 3, "Make sure the previous node is a text element" | |
| ); | |
| assert.equal( | |
| j[ 0 ].parentNode.nodeName.toUpperCase(), "DIV", "And that we're in the div element." | |
| ); | |
| // Try to wrap an element with multiple elements (should fail) | |
| j = jQuery( "<div><span></span></div>" ).children().wrap( "<p></p><div></div>" ); | |
| assert.equal( | |
| j[ 0 ].parentNode.parentNode.childNodes.length, 1, | |
| "There should only be one element wrapping." | |
| ); | |
| assert.equal( | |
| j.length, 1, "There should only be one element (no cloning)." | |
| ); | |
| assert.equal( | |
| j[ 0 ].parentNode.nodeName.toUpperCase(), "P", "The span should be in the paragraph." | |
| ); | |
| // Wrap an element with a jQuery set | |
| j = jQuery( "<span></span>" ).wrap( jQuery( "<div></div>" ) ); | |
| assert.equal( | |
| j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works." | |
| ); | |
| // Wrap an element with a jQuery set and event | |
| result = jQuery( "<div></div>" ).on( "click", function() { | |
| assert.ok( | |
| true, "Event triggered." | |
| ); | |
| // Remove handlers on detached elements | |
| result.off(); | |
| jQuery( this ).off(); | |
| } ); | |
| j = jQuery( "<span></span>" ).wrap( result ); | |
| assert.equal( | |
| j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works." | |
| ); | |
| j.parent().trigger( "click" ); | |
| } | |
| QUnit.test( "wrap(String|Element)", function( assert ) { | |
| testWrap( manipulationBareObj, assert ); | |
| } ); | |
| QUnit.test( "wrap(Function)", function( assert ) { | |
| testWrap( manipulationFunctionReturningObj, assert ); | |
| } ); | |
| QUnit.test( "wrap(Function) with index (trac-10177)", function( assert ) { | |
| var expectedIndex = 0, | |
| targets = jQuery( "#qunit-fixture p" ); | |
| assert.expect( targets.length ); | |
| targets.wrap( function( i ) { | |
| assert.equal( | |
| i, expectedIndex, | |
| "Check if the provided index (" + i + ") is as expected (" + expectedIndex + ")" | |
| ); | |
| expectedIndex++; | |
| return "<div id='wrap_index_'" + i + "'></div>"; | |
| } ); | |
| } ); | |
| QUnit.test( "wrap(String) consecutive elements (trac-10177)", function( assert ) { | |
| var targets = jQuery( "#qunit-fixture p" ); | |
| assert.expect( targets.length * 2 ); | |
| targets.wrap( "<div class='wrapper'></div>" ); | |
| targets.each( function() { | |
| var $this = jQuery( this ); | |
| assert.ok( | |
| $this.parent().is( ".wrapper" ), "Check each elements parent is correct (.wrapper)" | |
| ); | |
| assert.equal( | |
| $this.siblings().length, 0, "Each element should be wrapped individually" | |
| ); | |
| } ); | |
| } ); | |
| QUnit.test( "wrapAll(String)", function( assert ) { | |
| assert.expect( 5 ); | |
| var prev, p, result; | |
| prev = jQuery( "#firstp" )[ 0 ].previousSibling; | |
| p = jQuery( "#firstp,#first" )[ 0 ].parentNode; | |
| result = jQuery( "#firstp,#first" ).wrapAll( "<div class='red'><div class='tmp'></div></div>" ); | |
| assert.equal( | |
| result.parent().length, 1, "Check for wrapping of on-the-fly html" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" | |
| ); | |
| assert.ok( | |
| jQuery( "#firstp" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).parent().parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).parent().parent()[ 0 ].parentNode, p, "Correct Parent" | |
| ); | |
| } ); | |
| QUnit.test( "wrapAll(Function)", function( assert ) { | |
| assert.expect( 5 ); | |
| var prev = jQuery( "#firstp" )[ 0 ].previousSibling, | |
| p = jQuery( "#firstp,#first" )[ 0 ].parentNode, | |
| result = jQuery( "#firstp,#first" ).wrapAll( function() { | |
| return "<div class='red'><div class='tmp'></div></div>"; | |
| } ); | |
| assert.equal( | |
| result.parent().length, 1, "Check for wrapping of on-the-fly html" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" | |
| ); | |
| assert.ok( | |
| jQuery( "#firstp" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).parent().parent().parent().is( p ), "Correct Parent" | |
| ); | |
| assert.strictEqual( | |
| jQuery( "#first" ).parent().parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" | |
| ); | |
| } ); | |
| QUnit.test( "wrapAll(Function) check execution characteristics", function( assert ) { | |
| assert.expect( 3 ); | |
| var i = 0; | |
| jQuery( "non-existent" ).wrapAll( function() { | |
| i++; | |
| return ""; | |
| } ); | |
| assert.ok( | |
| !i, "should not execute function argument if target element does not exist" | |
| ); | |
| jQuery( "#firstp" ).wrapAll( function( index ) { | |
| assert.strictEqual( | |
| this, jQuery( "#firstp" )[ 0 ], "context must be the first found element" | |
| ); | |
| assert.strictEqual( | |
| index, undefined, "index argument should not be included in function execution" | |
| ); | |
| } ); | |
| } ); | |
| QUnit.test( "wrapAll(Element)", function( assert ) { | |
| assert.expect( 3 ); | |
| var prev, p; | |
| prev = jQuery( "#firstp" )[ 0 ].previousSibling; | |
| p = jQuery( "#first" )[ 0 ].parentNode; | |
| jQuery( "#firstp,#first" ).wrapAll( document.getElementById( "empty" ) ); | |
| assert.equal( | |
| jQuery( "#first" ).parent()[ 0 ], jQuery( "#firstp" ).parent()[ 0 ], "Same Parent" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).parent()[ 0 ].parentNode, p, "Correct Parent" | |
| ); | |
| } ); | |
| QUnit.test( "wrapInner(String)", function( assert ) { | |
| assert.expect( 6 ); | |
| var num; | |
| num = jQuery( "#first" ).children().length; | |
| jQuery( "#first" ).wrapInner( "<div class='red'><div id='tmp'></div></div>" ); | |
| assert.equal( | |
| jQuery( "#first" ).children().length, 1, "Only one child" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).children().is( ".red" ), "Verify Right Element" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).children().children().children().length, num, "Verify Elements Intact" | |
| ); | |
| num = jQuery( "#first" ).html( "foo<div>test</div><div>test2</div>" ).children().length; | |
| jQuery( "#first" ).wrapInner( "<div class='red'><div id='tmp'></div></div>" ); | |
| assert.equal( | |
| jQuery( "#first" ).children().length, 1, "Only one child" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).children().is( ".red" ), "Verify Right Element" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).children().children().children().length, num, "Verify Elements Intact" | |
| ); | |
| } ); | |
| QUnit.test( "wrapInner(Element)", function( assert ) { | |
| assert.expect( 5 ); | |
| var num, | |
| div = jQuery( "<div></div>" ); | |
| num = jQuery( "#first" ).children().length; | |
| jQuery( "#first" ).wrapInner( document.getElementById( "empty" ) ); | |
| assert.equal( | |
| jQuery( "#first" ).children().length, 1, "Only one child" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).children().is( "#empty" ), "Verify Right Element" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).children().children().length, num, "Verify Elements Intact" | |
| ); | |
| div.wrapInner( "<span></span>" ); | |
| assert.equal( | |
| div.children().length, 1, "The contents were wrapped." | |
| ); | |
| assert.equal( | |
| div.children()[ 0 ].nodeName.toLowerCase(), "span", "A span was inserted." | |
| ); | |
| } ); | |
| QUnit.test( "wrapInner(Function) returns String", function( assert ) { | |
| assert.expect( 6 ); | |
| var num, | |
| val = manipulationFunctionReturningObj; | |
| num = jQuery( "#first" ).children().length; | |
| jQuery( "#first" ).wrapInner( val( "<div class='red'><div id='tmp'></div></div>" ) ); | |
| assert.equal( | |
| jQuery( "#first" ).children().length, 1, "Only one child" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).children().is( ".red" ), "Verify Right Element" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).children().children().children().length, num, "Verify Elements Intact" | |
| ); | |
| num = jQuery( "#first" ).html( "foo<div>test</div><div>test2</div>" ).children().length; | |
| jQuery( "#first" ).wrapInner( val( "<div class='red'><div id='tmp'></div></div>" ) ); | |
| assert.equal( | |
| jQuery( "#first" ).children().length, 1, "Only one child" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).children().is( ".red" ), "Verify Right Element" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).children().children().children().length, num, "Verify Elements Intact" | |
| ); | |
| } ); | |
| QUnit.test( "wrapInner(Function) returns Element", function( assert ) { | |
| assert.expect( 5 ); | |
| var num, | |
| val = manipulationFunctionReturningObj, | |
| div = jQuery( "<div></div>" ); | |
| num = jQuery( "#first" ).children().length; | |
| jQuery( "#first" ).wrapInner( val( document.getElementById( "empty" ) ) ); | |
| assert.equal( | |
| jQuery( "#first" ).children().length, 1, "Only one child" | |
| ); | |
| assert.ok( | |
| jQuery( "#first" ).children().is( "#empty" ), "Verify Right Element" | |
| ); | |
| assert.equal( | |
| jQuery( "#first" ).children().children().length, num, "Verify Elements Intact" | |
| ); | |
| div.wrapInner( val( "<span></span>" ) ); | |
| assert.equal( | |
| div.children().length, 1, "The contents were wrapped." | |
| ); | |
| assert.equal( | |
| div.children()[ 0 ].nodeName.toLowerCase(), "span", "A span was inserted." | |
| ); | |
| } ); | |
| QUnit.test( "unwrap()", function( assert ) { | |
| assert.expect( 9 ); | |
| jQuery( "body" ).append( | |
| " <div id='unwrap' style='display: none;'> <div id='unwrap1'>" + | |
| " <span class='unwrap'>a</span> <span class='unwrap'>b</span> </div> <div id='unwrap2'>" + | |
| " <span class='unwrap'>c</span> <span class='unwrap'>d</span> </div> <div id='unwrap3'>" + | |
| " <b><span class='unwrap unwrap3'>e</span></b>" + | |
| " <b><span class='unwrap unwrap3'>f</span></b> </div> </div>" | |
| ); | |
| var abcd = jQuery( "#unwrap1 > span, #unwrap2 > span" ).get(), | |
| abcdef = jQuery( "#unwrap span" ).get(); | |
| assert.equal( | |
| jQuery( "#unwrap1 span" ).add( "#unwrap2 span:first-child" ).unwrap().length, 3, | |
| "make #unwrap1 and #unwrap2 go away" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "#unwrap > span" ).get(), abcd, "all four spans should still exist" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "#unwrap3 span" ).unwrap().get(), jQuery( "#unwrap3 > span" ).get(), | |
| "make all b in #unwrap3 go away" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "#unwrap3 span" ).unwrap().get(), jQuery( "#unwrap > span.unwrap3" ).get(), | |
| "make #unwrap3 go away" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "#unwrap" ).children().get(), abcdef, "#unwrap only contains 6 child spans" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "#unwrap > span" ).unwrap().get(), jQuery( "body > span.unwrap" ).get(), | |
| "make the 6 spans become children of body" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "body > span.unwrap" ).unwrap().get(), jQuery( "body > span.unwrap" ).get(), | |
| "can't unwrap children of body" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "body > span.unwrap" ).unwrap().get(), abcdef, "can't unwrap children of body" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "body > span.unwrap" ).get(), abcdef, "body contains 6 .unwrap child spans" | |
| ); | |
| jQuery( "body > span.unwrap" ).remove(); | |
| } ); | |
| QUnit.test( "unwrap( selector )", function( assert ) { | |
| assert.expect( 5 ); | |
| jQuery( "body" ).append( | |
| " <div id='unwrap' style='display: none;'> <div id='unwrap1'>" + | |
| "<span class='unwrap'>a</span> <span class='unwrap'>b</span> </div>" + | |
| " <div id='unwrap2'> <span class='unwrap'>c</span> <span class='unwrap'>d</span>" + | |
| " </div> </div>" | |
| ); | |
| // Shouldn't unwrap, no match | |
| jQuery( "#unwrap1 span" ) .unwrap( "#unwrap2" ); | |
| assert.equal( | |
| jQuery( "#unwrap1" ).length, 1, "still wrapped" | |
| ); | |
| // Shouldn't unwrap, no match | |
| jQuery( "#unwrap1 span" ) .unwrap( "span" ); | |
| assert.equal( | |
| jQuery( "#unwrap1" ).length, 1, "still wrapped" | |
| ); | |
| // Unwraps | |
| jQuery( "#unwrap1 span" ) .unwrap( "#unwrap1" ); | |
| assert.equal( | |
| jQuery( "#unwrap1" ).length, 0, "unwrapped match" | |
| ); | |
| // Check return values | |
| assert.deepEqual( | |
| jQuery( "#unwrap2 span" ).get(), jQuery( "#unwrap2 span" ).unwrap( "quote" ).get(), | |
| "return on unmatched unwrap" | |
| ); | |
| assert.deepEqual( | |
| jQuery( "#unwrap2 span" ).get(), jQuery( "#unwrap2 span" ).unwrap( "#unwrap2" ).get(), | |
| "return on matched unwrap" | |
| ); | |
| jQuery( "body > span.unwrap" ).remove(); | |
| } ); | |
| QUnit.test( "jQuery(<tag>) & wrap[Inner/All]() handle unknown elems (trac-10667)", function( assert ) { | |
| assert.expect( 2 ); | |
| var $wraptarget = jQuery( "<div id='wrap-target'>Target</div>" ).appendTo( "#qunit-fixture" ), | |
| $section = jQuery( "<section>" ).appendTo( "#qunit-fixture" ); | |
| $wraptarget.wrapAll( "<aside style='background-color:green'></aside>" ); | |
| assert.notEqual( | |
| $wraptarget.parent( "aside" ).get( 0 ).style.backgroundColor, "transparent", | |
| "HTML5 elements created with wrapAll inherit styles" | |
| ); | |
| assert.notEqual( | |
| $section.get( 0 ).style.backgroundColor, "transparent", | |
| "HTML5 elements create with jQuery( string ) inherit styles" | |
| ); | |
| } ); | |
| QUnit.test( "wrapping scripts (trac-10470)", function( assert ) { | |
| assert.expect( 2 ); | |
| var script = document.createElement( "script" ); | |
| script.text = script.textContent = | |
| "QUnit.assert.ok( !document.eval10470, 'script evaluated once' ); document.eval10470 = true;"; | |
| document.eval10470 = false; | |
| jQuery( "#qunit-fixture" ).empty()[ 0 ].appendChild( script ); | |
| jQuery( "#qunit-fixture script" ).wrap( "<b></b>" ); | |
| assert.strictEqual( | |
| script.parentNode, jQuery( "#qunit-fixture > b" )[ 0 ], "correctly wrapped" | |
| ); | |
| jQuery( script ).remove(); | |
| } ); | |
| } )(); |