Fix #12199. Handle iteration over inherited properties in oldIE. Close

gh-1196.
This commit is contained in:
Brandon Johnson 2013-04-04 10:14:05 -04:00 committed by Dave Methvin
parent df7847bc25
commit 58b8535d5d
5 changed files with 48 additions and 13 deletions

View File

@ -162,3 +162,4 @@ Jean Boussier <jean.boussier@gmail.com>
Adam Coulombe <me@adam.co> Adam Coulombe <me@adam.co>
Andrew Plummer <plummer.andrew@gmail.com> Andrew Plummer <plummer.andrew@gmail.com>
Dmitry Gusev <dmitry.gusev@gmail.com> Dmitry Gusev <dmitry.gusev@gmail.com>
Brandon Johnson <bjohn465+github@gmail.com>

View File

@ -453,6 +453,8 @@ jQuery.extend({
}, },
isPlainObject: function( obj ) { isPlainObject: function( obj ) {
var key;
// Must be an Object. // Must be an Object.
// Because of IE, we also have to check the presence of the constructor property. // Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well // Make sure that DOM nodes and window objects don't pass through, as well
@ -472,10 +474,16 @@ jQuery.extend({
return false; return false;
} }
// Support: IE<9
// Handle iteration over inherited properties before own properties.
if ( jQuery.support.ownLast ) {
for ( key in obj ) {
return core_hasOwn.call( obj, key );
}
}
// Own properties are enumerated firstly, so to speed up, // Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own. // if last one is own, then all properties are own.
var key;
for ( key in obj ) {} for ( key in obj ) {}
return key === undefined || core_hasOwn.call( obj, key ); return key === undefined || core_hasOwn.call( obj, key );

View File

@ -141,6 +141,13 @@ jQuery.support = (function( support ) {
div.cloneNode( true ).style.backgroundClip = ""; div.cloneNode( true ).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box"; support.clearCloneStyle = div.style.backgroundClip === "content-box";
// Support: IE<9
// Iteration over object's inherited properties before its own.
for ( i in jQuery( support ) ) {
break;
}
support.ownLast = i !== "0";
// Run tests that need a body at doc ready // Run tests that need a body at doc ready
jQuery(function() { jQuery(function() {
var container, marginDiv, tds, var container, marginDiv, tds,

View File

@ -296,7 +296,7 @@ test("type", function() {
}); });
asyncTest("isPlainObject", function() { asyncTest("isPlainObject", function() {
expect(15); expect(16);
var pass, iframe, doc, var pass, iframe, doc,
fn = function() {}; fn = function() {};
@ -330,6 +330,16 @@ asyncTest("isPlainObject", function() {
// Again, instantiated objects shouldn't be matched // Again, instantiated objects shouldn't be matched
ok( !jQuery.isPlainObject(new fn()), "new fn" ); ok( !jQuery.isPlainObject(new fn()), "new fn" );
// Make it even harder to detect in IE < 9
fn = function() {
this.a = "a";
};
fn.prototype = {
b: "b"
};
ok( !jQuery.isPlainObject(new fn()), "fn (inherited and own properties)");
// DOM Element // DOM Element
ok( !jQuery.isPlainObject( document.createElement("div") ), "DOM Element" ); ok( !jQuery.isPlainObject( document.createElement("div") ), "DOM Element" );

View File

@ -80,7 +80,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true, "reliableHiddenOffsets":true,
"ajax":true, "ajax":true,
"cors":true, "cors":true,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": false
}; };
} else if ( /opera.*version\/12\.1/i.test( userAgent ) ) { } else if ( /opera.*version\/12\.1/i.test( userAgent ) ) {
expected = { expected = {
@ -113,7 +114,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true, "reliableHiddenOffsets":true,
"ajax":true, "ajax":true,
"cors":true, "cors":true,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": false
}; };
} else if ( /msie 10\.0/i.test( userAgent ) ) { } else if ( /msie 10\.0/i.test( userAgent ) ) {
expected = { expected = {
@ -146,7 +148,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true, "reliableHiddenOffsets":true,
"ajax":true, "ajax":true,
"cors":true, "cors":true,
"clearCloneStyle": false "clearCloneStyle": false,
"ownLast": false
}; };
} else if ( /msie 9\.0/i.test( userAgent ) ) { } else if ( /msie 9\.0/i.test( userAgent ) ) {
expected = { expected = {
@ -179,7 +182,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true, "reliableHiddenOffsets":true,
"ajax":true, "ajax":true,
"cors":false, "cors":false,
"clearCloneStyle": false "clearCloneStyle": false,
"ownLast": false
}; };
} else if ( /msie 8\.0/i.test( userAgent ) ) { } else if ( /msie 8\.0/i.test( userAgent ) ) {
expected = { expected = {
@ -212,7 +216,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":false, "reliableHiddenOffsets":false,
"ajax":true, "ajax":true,
"cors":false, "cors":false,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": true
}; };
} else if ( /msie 7\.0/i.test( userAgent ) ) { } else if ( /msie 7\.0/i.test( userAgent ) ) {
expected = { expected = {
@ -245,7 +250,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"submitBubbles": false, "submitBubbles": false,
"tbody": false, "tbody": false,
"style": false, "style": false,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": true
}; };
} else if ( /msie 6\.0/i.test( userAgent ) ) { } else if ( /msie 6\.0/i.test( userAgent ) ) {
expected = { expected = {
@ -278,7 +284,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":false, "reliableHiddenOffsets":false,
"ajax":true, "ajax":true,
"cors":false, "cors":false,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": true
}; };
} else if ( /5\.1\.1 safari/i.test( userAgent ) ) { } else if ( /5\.1\.1 safari/i.test( userAgent ) ) {
expected = { expected = {
@ -311,7 +318,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true, "reliableHiddenOffsets":true,
"ajax":true, "ajax":true,
"cors":true, "cors":true,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": false
}; };
} else if ( /firefox/i.test( userAgent ) ) { } else if ( /firefox/i.test( userAgent ) ) {
expected = { expected = {
@ -344,13 +352,14 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true, "reliableHiddenOffsets":true,
"ajax":true, "ajax":true,
"cors":true, "cors":true,
"clearCloneStyle": true "clearCloneStyle": true,
"ownLast": false
}; };
} }
if ( expected ) { if ( expected ) {
test("Verify that the support tests resolve as expected per browser", function() { test("Verify that the support tests resolve as expected per browser", function() {
expect( 30 ); expect( 31 );
for ( var i in expected ) { for ( var i in expected ) {
if ( jQuery.ajax || i !== "ajax" && i !== "cors" ) { if ( jQuery.ajax || i !== "ajax" && i !== "cors" ) {