1/** 2 * For jQuery versions less than 3.4.0, this replaces the jQuery.extend 3 * function with the one from jQuery 3.4.0, slightly modified (documented 4 * below) to be compatible with older jQuery versions and browsers. 5 * 6 * This provides the Object.prototype pollution vulnerability fix to Drupal 7 * installations running older jQuery versions, including the versions shipped 8 * with Drupal core and https://www.drupal.org/project/jquery_update. 9 * 10 * @see https://github.com/jquery/jquery/pull/4333 11 */ 12 13(function (jQuery) { 14 15// Do not override jQuery.extend() if the jQuery version is already >=3.4.0. 16var versionParts = jQuery.fn.jquery.split('.'); 17var majorVersion = parseInt(versionParts[0]); 18var minorVersion = parseInt(versionParts[1]); 19var patchVersion = parseInt(versionParts[2]); 20var isPreReleaseVersion = (patchVersion.toString() !== versionParts[2]); 21if ( 22 (majorVersion > 3) || 23 (majorVersion === 3 && minorVersion > 4) || 24 (majorVersion === 3 && minorVersion === 4 && patchVersion > 0) || 25 (majorVersion === 3 && minorVersion === 4 && patchVersion === 0 && !isPreReleaseVersion) 26) { 27 return; 28} 29 30/** 31 * This is almost verbatim copied from jQuery 3.4.0. 32 * 33 * Only two minor changes have been made: 34 * - The call to isFunction() is changed to jQuery.isFunction(). 35 * - The two calls to Array.isArray() is changed to jQuery.isArray(). 36 * 37 * The above two changes ensure compatibility with all older jQuery versions 38 * (1.4.4 - 3.3.1) and older browser versions (e.g., IE8). 39 */ 40jQuery.extend = jQuery.fn.extend = function() { 41 var options, name, src, copy, copyIsArray, clone, 42 target = arguments[ 0 ] || {}, 43 i = 1, 44 length = arguments.length, 45 deep = false; 46 47 // Handle a deep copy situation 48 if ( typeof target === "boolean" ) { 49 deep = target; 50 51 // Skip the boolean and the target 52 target = arguments[ i ] || {}; 53 i++; 54 } 55 56 // Handle case when target is a string or something (possible in deep copy) 57 if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { 58 target = {}; 59 } 60 61 // Extend jQuery itself if only one argument is passed 62 if ( i === length ) { 63 target = this; 64 i--; 65 } 66 67 for ( ; i < length; i++ ) { 68 69 // Only deal with non-null/undefined values 70 if ( ( options = arguments[ i ] ) != null ) { 71 72 // Extend the base object 73 for ( name in options ) { 74 copy = options[ name ]; 75 76 // Prevent Object.prototype pollution 77 // Prevent never-ending loop 78 if ( name === "__proto__" || target === copy ) { 79 continue; 80 } 81 82 // Recurse if we're merging plain objects or arrays 83 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 84 ( copyIsArray = jQuery.isArray( copy ) ) ) ) { 85 src = target[ name ]; 86 87 // Ensure proper type for the source value 88 if ( copyIsArray && !jQuery.isArray( src ) ) { 89 clone = []; 90 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 91 clone = {}; 92 } else { 93 clone = src; 94 } 95 copyIsArray = false; 96 97 // Never move original objects, clone them 98 target[ name ] = jQuery.extend( deep, clone, copy ); 99 100 // Don't bring in undefined values 101 } else if ( copy !== undefined ) { 102 target[ name ] = copy; 103 } 104 } 105 } 106 } 107 108 // Return the modified object 109 return target; 110}; 111 112})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.