]> source.dussan.org Git - jquery.git/commitdiff
Core: Restore 1.x isPlainObject constructor checks 2999/head
authorRichard Gibson <richard.gibson@gmail.com>
Fri, 11 Mar 2016 15:48:00 +0000 (10:48 -0500)
committerTimmy Willison <timmywillisn@gmail.com>
Mon, 14 Mar 2016 15:43:36 +0000 (11:43 -0400)
- Guard isPlainObject against inherited scalar constructors

Fixes gh-2982
Close gh-2985

src/core.js
test/unit/core.js

index 967fa8e26cff8d2cadf294c23605a24a8847f6f6..713c1a3cd09e3abc481f0074f99a5525e0cf17ea 100644 (file)
@@ -233,8 +233,10 @@ jQuery.extend( {
                        return false;
                }
 
+               // Not own constructor property must be Object
                if ( obj.constructor &&
-                               !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+                               !hasOwn.call( obj, "constructor" ) &&
+                               !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
                        return false;
                }
 
index e33f653588bba073187d57d78c5e95974b5310d4..3e71e6551077a4156c92fa2b90b940bfaf3ec5a2 100644 (file)
@@ -268,7 +268,8 @@ QUnit.test( "type for `Symbol`", function( assert ) {
 } );
 
 QUnit.asyncTest( "isPlainObject", function( assert ) {
-       assert.expect( 19 );
+
+       assert.expect( 22 );
 
        var pass, iframe, doc, parentObj, childObj, deep,
                fn = function() {};
@@ -276,6 +277,10 @@ QUnit.asyncTest( "isPlainObject", function( assert ) {
        // The use case that we want to match
        assert.ok( jQuery.isPlainObject( {} ), "{}" );
        assert.ok( jQuery.isPlainObject( new window.Object() ), "new Object" );
+       assert.ok( jQuery.isPlainObject( { constructor: fn } ),
+               "plain object with constructor property" );
+       assert.ok( jQuery.isPlainObject( { constructor: "foo" } ),
+               "plain object with primitive constructor property" );
 
        parentObj = { foo: "bar" };
        childObj = Object.create( parentObj );
@@ -310,6 +315,10 @@ QUnit.asyncTest( "isPlainObject", function( assert ) {
        // Again, instantiated objects shouldn't be matched
        assert.ok( !jQuery.isPlainObject( new fn() ), "new fn" );
 
+       // Instantiated objects with primitive constructors shouldn't be matched
+       fn.prototype.constructor = "foo";
+       assert.ok( !jQuery.isPlainObject( new fn() ), "new fn with primitive constructor" );
+
        // Deep object
        deep = { "foo": { "baz": true }, "foo2": document };
        assert.ok( jQuery.isPlainObject( deep ), "Object with objects is still plain" );