Bug Tracker

Changeset 3841

Show
Ignore:
Timestamp:
11/17/07 04:25:22 (1 year ago)
Author:
davidserduke
Message:

Fix #1907 where the never-ending loop prevention used a coersion comparison which sometimes dropped values incorrectly. Also fixed a bug where on deep copies the target copied over itself (i = 2 addition). Last made code handle the case when a property might have a string in it that should be overwritten by an object.

Location:
trunk/jquery
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/jquery/src/core.js

    r3839 r3841  
    517517        deep = target; 
    518518        target = arguments[1] || {}; 
     519        // skip the boolean and the target 
     520        i = 2; 
    519521    } 
     522 
     523    // Handle case when target is a string or something (possible in deep copy) 
     524    if ( typeof target != "object" ) 
     525        target = {}; 
    520526 
    521527    // extend jQuery itself if only one argument is passed 
     
    531537            for ( var name in options ) { 
    532538                // Prevent never-ending loop 
    533                 if ( target == options[ name ] ) 
     539                if ( target === options[ name ] ) 
    534540                    continue; 
    535541 
    536542                // Recurse if we're merging object values 
    537543                if ( deep && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType ) 
    538                     jQuery.extend( target[ name ], options[ name ] ); 
     544                    target[ name ] = jQuery.extend( target[ name ], options[ name ] ); 
    539545 
    540546                // Don't bring in undefined values 
  • trunk/jquery/test/unit/core.js

    r3839 r3841  
    812812 
    813813test("$.extend(Object, Object)", function() { 
    814     expect(11); 
     814    expect(14); 
    815815 
    816816    var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, 
     
    836836    isObj( deep2.foo, deep2copy.foo, "Check if not deep2: options must not be modified" ); 
    837837    equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" ); 
     838 
     839    var target = {}; 
     840    var recursive = { foo:target, bar:5 }; 
     841    jQuery.extend(true, target, recursive); 
     842    isObj( target, { bar:5 }, "Check to make sure a recursive obj doesn't go never-ending loop by not copying it over" ); 
     843 
     844    var ret = jQuery.extend(true, { foo: [] }, { foo: [0] } ); // 1907 
     845    ok( ret.foo.length == 1, "Check to make sure a value with coersion 'false' copies over when necessary to fix #1907" ); 
     846 
     847    var ret = jQuery.extend(true, { foo: "1,2,3" }, { foo: [1, 2, 3] } ); 
     848    ok( typeof ret.foo != "string", "Check to make sure values equal with coersion (but not actually equal) overwrite correctly" ); 
    838849 
    839850    var defaults = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" },