jquery core: SHOULD fix #2802. Caching document.defaultView, instead of defaultView...
[jquery.git] / src / core.js
index 8743f05..511180a 100644 (file)
@@ -579,8 +579,11 @@ jQuery.extend = jQuery.fn.extend = function() {
                                        continue;
 
                                // Recurse if we're merging object values
-                               if ( deep && copy && typeof copy == "object" && src && !copy.nodeType )
-                                       target[ name ] = jQuery.extend( deep, src, copy );
+                               if ( deep && copy && typeof copy == "object" && !copy.nodeType )
+                                       target[ name ] = jQuery.extend( deep, 
+                                               // Never move original objects, clone them
+                                               src || ( copy.length != null ? [ ] : { } )
+                                       , copy );
 
                                // Don't bring in undefined values
                                else if ( copy !== undefined )
@@ -593,11 +596,10 @@ jQuery.extend = jQuery.fn.extend = function() {
 };
 
 var expando = "jQuery" + now(), uuid = 0, windowData = {},
-
-// exclude the following css properties to add px
+       // exclude the following css properties to add px
        exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
-// cache getComputedStyle
-       getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
+       // cache defaultView
+       defaultView = document.defaultView || {};
 
 jQuery.extend({
        noConflict: function( deep ) {
@@ -612,7 +614,7 @@ jQuery.extend({
        // See test/unit/core.js for details concerning this function.
        isFunction: function( fn ) {
                return !!fn && typeof fn != "string" && !fn.nodeName &&
-                       fn.constructor != Array && /function/i.test( fn + "" );
+                       fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
        },
 
        // check if an element is in a (or is an) XML document
@@ -827,8 +829,8 @@ jQuery.extend({
                        if ( !jQuery.browser.safari )
                                return false;
 
-                       // getComputedStyle is cached
-                       var ret = getComputedStyle( elem, null );
+                       // defaultView is cached
+                       var ret = defaultView.getComputedStyle( elem, null );
                        return !ret || ret.getPropertyValue("color") == "";
                }
 
@@ -854,7 +856,7 @@ jQuery.extend({
                if ( !force && style && style[ name ] )
                        ret = style[ name ];
 
-               else if ( getComputedStyle ) {
+               else if ( defaultView.getComputedStyle ) {
 
                        // Only "float" is needed here
                        if ( name.match( /float/i ) )
@@ -862,7 +864,7 @@ jQuery.extend({
 
                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
 
-                       var computedStyle = getComputedStyle( elem, null );
+                       var computedStyle = defaultView.getComputedStyle( elem, null );
 
                        if ( computedStyle && !color( elem ) )
                                ret = computedStyle.getPropertyValue( name );
@@ -1356,3 +1358,8 @@ jQuery.each([ "Height", "Width" ], function(i, name){
                                        this.css( type, size.constructor == String ? size : size + "px" );
        };
 });
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+       return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}
\ No newline at end of file