Commits

Dave Methvin committed 20be650 Merge

Merge branch 'x8908'

Comments (0)

Files changed (4)

 
 			// 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 ) {
+
 				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
 				// Fixes bug #5509
 				try {
 	};
 });
 
+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 ) {
 			clone;
 
 		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-			clone = elem.cloneNode( true );
+			// 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;
 		}
 	}
 
+	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,

test/unit/manipulation.js

 	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: "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( "<div />" );
+		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 ),
+			"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 ),
+			"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);