From: Elijah Manor Date: Fri, 16 Nov 2012 03:20:07 +0000 (-0500) Subject: Fix #8908. Don't let change to originals affect clones in IE9/10. Close gh-886. X-Git-Tag: 1.9.0b1~103^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5904468b9c49d7d5a780010f44d7e76dd4c81706;p=jquery.git Fix #8908. Don't let change to originals affect clones in IE9/10. Close gh-886. --- 5904468b9c49d7d5a780010f44d7e76dd4c81706 diff --cc src/css.js index 1723223e5,72ee8eef9..eb0aed639 --- a/src/css.js +++ b/src/css.js @@@ -198,6 -204,9 +198,7 @@@ jQuery.extend( // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - // IE9/10 Clearing Cloned Style Clear's Original Style. Fixes bug #8908 - value = !jQuery.support.clearCloneStyle && value === "" && name.match( /backgroundPosition/ ) ? "0% 0%" : value; + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided // Fixes bug #5509 try { @@@ -515,6 -517,6 +516,15 @@@ jQuery.each([ "height", "width" ], func }; }); ++if ( !jQuery.support.clearCloneStyle ) { ++ // #8908, this part for IE9 only; see gh-886 ++ jQuery.cssHooks.backgroundPosition = { ++ set: function( elem, value ) { ++ return value === "" ? "0% 0%" : value; ++ } ++ }; ++} ++ if ( !jQuery.support.opacity ) { jQuery.cssHooks.opacity = { get: function( elem, computed ) { diff --cc src/manipulation.js index b6dd6f086,5057e39f7..473fa5c82 --- a/src/manipulation.js +++ b/src/manipulation.js @@@ -596,8 -588,13 +596,12 @@@ jQuery.extend( clone; if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - // Fixes #8909 - By accessing one of the element's computed styles it breaks the - // connection with the cloned element's styles in IE9/10 - if ( !jQuery.support.clearCloneStyle && elem.nodeType === 1 && window.getComputedStyle ) { ++ // Break the original-clone style connection in IE9/10 (#8909) ++ if ( !jQuery.support.clearCloneStyle && elem.nodeType === 1 ) { + i = ( window.getComputedStyle( elem, null ) || {} ).backgroundPosition; + } + clone = elem.cloneNode( true ); // IE<=8 does not properly clone detached, unknown element nodes } else { fragmentDiv.innerHTML = elem.outerHTML; diff --cc src/support.js index 7629c38e7,9cc46c63e..1001f407a --- a/src/support.js +++ b/src/support.js @@@ -169,6 -170,19 +169,10 @@@ jQuery.support = (function() } } - support.clearCloneStyle = (function() { - var source = document.createElement( "div" ), - styleName = "backgroundClip", - value = "content-box", - clone; - - source.style[ styleName ] = value; - clone = source.cloneNode( true ); - clone.style[ styleName ] = ""; - - return source.style[ styleName ] === value; - })(); ++ div.style.backgroundClip = "content-box"; ++ div.cloneNode( true ).style.backgroundClip = ""; ++ support.clearCloneStyle = div.style.backgroundClip === "content-box"; + // Run tests that need a body at doc ready jQuery(function() { var container, div, tds, marginDiv, diff --cc test/unit/manipulation.js index 6c37e5196,764da0349..19897af74 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@@ -2023,22 -1908,43 +2023,63 @@@ test("checked state is cloned with clon equal( jQuery(elem).clone().attr("id","clone")[0].checked, true, "Checked true state correctly cloned" ); }); + test( "Clearing a Cloned Element's Style Shouldn't Clear the Original Element's Style (#8908)", function() { + expect( 16 ); + + var baseUrl = document.location.href.replace( /([^\/]*)$/, "" ); + var styles = [ + { name: "backgroundAttachment", value: [ "fixed" ], expected: [ "scroll" ] }, + { name: "backgroundColor", value: [ "rgb(255, 0, 0)", "rgb(255,0,0)", "#ff0000" ], expected: [ "transparent" ] }, - { name: "backgroundImage", value: [ 'url("test.png")', 'url(' + baseUrl + 'test.png)', 'url("' + baseUrl + 'test.png")' ], expected: [ "none", 'url("http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif")' ] }, // Firefox returns auto's value ++ { name: "backgroundImage", value: [ "url('test.png')", "url(" + baseUrl + "test.png)", "url(\"" + baseUrl + "test.png\")" ], expected: [ "none", "url(\"http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif\")" ] }, // Firefox returns auto's value + { name: "backgroundPosition", value: [ "5% 5%" ], expected: [ "0% 0%", "-1000px 0px", "-1000px 0%" ] }, + { name: "backgroundRepeat", value: [ "repeat-y" ], expected: [ "repeat", "no-repeat" ] }, // Firefox returns no-repeat + { name: "backgroundClip", value: [ "padding-box" ], expected: [ "border-box" ] }, + { name: "backgroundOrigin", value: [ "content-box" ], expected: [ "padding-box" ] }, + { name: "backgroundSize", value: [ "80px 60px" ], expected: [ "auto auto" ] } + ]; + + jQuery.each( styles, function(index, style) { + var $source, source, $clone; + + style.expected = style.expected.concat( [ "", "auto" ] ); + $source = jQuery( "
" ); + source = $source[ 0 ]; + if ( source.style[ style.name ] === undefined ) { + ok( true, style.name + ": style isn't supported and therefore not an issue" ); + ok( true ); + return true; + } + $source.css( style.name, style.value[0] ); + $clone = $source.clone(); + $clone.css( style.name, "" ); + + ok( ~jQuery.inArray( $source.css( style.name ), style.value ), - "Clearning clone.css() doesn't affect source.css(): " + style.name + ++ "Clearing clone.css() doesn't affect source.css(): " + style.name + + "; result: " + $source.css( style.name ) + + "; expected: " + style.value.join( "," ) ); + ok( ~jQuery.inArray( $clone.css( style.name ), style.expected ), - "The cloned element was reset to it's default value: " + style.name + ++ "Cloned element was reset to its default value: " + style.name + + "; result: " + $clone.css( style.name ) + + "; expected: " + style.expected.join( "," ) ); + }); -}); ++}); ++ +test("manipulate mixed jQuery and text (#12384, #12346)", function() { + expect(2); + + var div = jQuery("
a
").append( " ", jQuery("b"), " ", jQuery("c") ), + nbsp = String.fromCharCode(160); + equal( div.text(), "a" + nbsp + "b" + nbsp+ "c", "Appending mixed jQuery with text nodes" ); + + div = jQuery("
") + .find("div") + .after("

a

", "

b

" ) + .parent(); + equal( div.find("*").length, 3, "added 2 paragraphs after inner div" ); +}); + +testIframeWithCallback( "buildFragment works even if document[0] is iframe's window object in IE9/10 (#12266)", "manipulation/iframe-denied.html", function( test ) { + expect( 1 ); + + ok( test.status, test.description ); +});