Skip to content

Commit

Permalink
Fix #12199. Handle iteration over inherited properties in oldIE. Close
Browse files Browse the repository at this point in the history
  • Loading branch information
bjohn465 authored and dmethvin committed Apr 4, 2013
1 parent df7847b commit 58b8535
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 13 deletions.
1 change: 1 addition & 0 deletions AUTHORS.txt
Expand Up @@ -162,3 +162,4 @@ Jean Boussier <jean.boussier@gmail.com>
Adam Coulombe <me@adam.co>
Andrew Plummer <plummer.andrew@gmail.com>
Dmitry Gusev <dmitry.gusev@gmail.com>
Brandon Johnson <bjohn465+github@gmail.com>
12 changes: 10 additions & 2 deletions src/core.js
Expand Up @@ -453,6 +453,8 @@ jQuery.extend({
},

isPlainObject: function( obj ) {
var key;

// Must be an Object.
// 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
Expand All @@ -472,10 +474,16 @@ jQuery.extend({
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,
// if last one is own, then all properties are own.

var key;
for ( key in obj ) {}

return key === undefined || core_hasOwn.call( obj, key );
Expand Down
7 changes: 7 additions & 0 deletions src/support.js
Expand Up @@ -141,6 +141,13 @@ jQuery.support = (function( support ) {
div.cloneNode( true ).style.backgroundClip = "";
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
jQuery(function() {
var container, marginDiv, tds,
Expand Down
12 changes: 11 additions & 1 deletion test/unit/core.js
Expand Up @@ -296,7 +296,7 @@ test("type", function() {
});

asyncTest("isPlainObject", function() {
expect(15);
expect(16);

var pass, iframe, doc,
fn = function() {};
Expand Down Expand Up @@ -330,6 +330,16 @@ asyncTest("isPlainObject", function() {
// Again, instantiated objects shouldn't be matched
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
ok( !jQuery.isPlainObject( document.createElement("div") ), "DOM Element" );

Expand Down
29 changes: 19 additions & 10 deletions test/unit/support.js
Expand Up @@ -80,7 +80,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true,
"ajax":true,
"cors":true,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": false
};
} else if ( /opera.*version\/12\.1/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -113,7 +114,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true,
"ajax":true,
"cors":true,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": false
};
} else if ( /msie 10\.0/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -146,7 +148,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true,
"ajax":true,
"cors":true,
"clearCloneStyle": false
"clearCloneStyle": false,
"ownLast": false
};
} else if ( /msie 9\.0/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -179,7 +182,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true,
"ajax":true,
"cors":false,
"clearCloneStyle": false
"clearCloneStyle": false,
"ownLast": false
};
} else if ( /msie 8\.0/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -212,7 +216,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":false,
"ajax":true,
"cors":false,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": true
};
} else if ( /msie 7\.0/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -245,7 +250,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"submitBubbles": false,
"tbody": false,
"style": false,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": true
};
} else if ( /msie 6\.0/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -278,7 +284,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":false,
"ajax":true,
"cors":false,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": true
};
} else if ( /5\.1\.1 safari/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -311,7 +318,8 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true,
"ajax":true,
"cors":true,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": false
};
} else if ( /firefox/i.test( userAgent ) ) {
expected = {
Expand Down Expand Up @@ -344,13 +352,14 @@ testIframeWithCallback( "box-sizing does not affect jQuery.support.shrinkWrapBlo
"reliableHiddenOffsets":true,
"ajax":true,
"cors":true,
"clearCloneStyle": true
"clearCloneStyle": true,
"ownLast": false
};
}

if ( expected ) {
test("Verify that the support tests resolve as expected per browser", function() {
expect( 30 );
expect( 31 );

for ( var i in expected ) {
if ( jQuery.ajax || i !== "ajax" && i !== "cors" ) {
Expand Down

0 comments on commit 58b8535

Please sign in to comment.