Test Failed
Branch master (45c182)
by Julien
04:02
created

resources/assets/jquery/src/css.js   F

Complexity

Total Complexity 85
Complexity/F 4.72

Size

Lines of Code 426
Function Count 18

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 85
dl 0
loc 426
rs 2.6017
c 1
b 0
f 0
cc 0
nc 67108864
mnd 3
bc 55
fnc 18
bpm 3.0555
cpm 4.7222
noi 8

How to fix   Complexity   

Complexity

Complex classes like resources/assets/jquery/src/css.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
define( [
2
	"./core",
3
	"./var/pnum",
4
	"./core/access",
5
	"./css/var/rmargin",
6
	"./var/document",
7
	"./var/rcssNum",
8
	"./css/var/rnumnonpx",
9
	"./css/var/cssExpand",
10
	"./css/var/getStyles",
11
	"./css/var/swap",
12
	"./css/curCSS",
13
	"./css/adjustCSS",
14
	"./css/addGetHookIf",
15
	"./css/support",
16
17
	"./core/init",
18
	"./core/ready",
19
	"./selector" // contains
20
], function( jQuery, pnum, access, rmargin, document, rcssNum, rnumnonpx, cssExpand,
21
	getStyles, swap, curCSS, adjustCSS, addGetHookIf, support ) {
22
23
"use strict";
24
25
var
26
27
	// Swappable if display is none or starts with table
28
	// except "table", "table-cell", or "table-caption"
29
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
30
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
31
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
32
	cssNormalTransform = {
33
		letterSpacing: "0",
34
		fontWeight: "400"
35
	},
36
37
	cssPrefixes = [ "Webkit", "Moz", "ms" ],
38
	emptyStyle = document.createElement( "div" ).style;
39
40
// Return a css property mapped to a potentially vendor prefixed property
41
function vendorPropName( name ) {
42
43
	// Shortcut for names that are not vendor prefixed
44
	if ( name in emptyStyle ) {
45
		return name;
46
	}
47
48
	// Check for vendor prefixed names
49
	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
50
		i = cssPrefixes.length;
51
52
	while ( i-- ) {
53
		name = cssPrefixes[ i ] + capName;
54
		if ( name in emptyStyle ) {
55
			return name;
56
		}
57
	}
58
}
59
60
function setPositiveNumber( elem, value, subtract ) {
61
62
	// Any relative (+/-) values have already been
63
	// normalized at this point
64
	var matches = rcssNum.exec( value );
65
	return matches ?
66
67
		// Guard against undefined "subtract", e.g., when used as in cssHooks
68
		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
69
		value;
70
}
71
72
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
73
	var i,
74
		val = 0;
75
76
	// If we already have the right measurement, avoid augmentation
77
	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
78
		i = 4;
79
80
	// Otherwise initialize for horizontal or vertical properties
81
	} else {
82
		i = name === "width" ? 1 : 0;
83
	}
84
85
	for ( ; i < 4; i += 2 ) {
86
87
		// Both box models exclude margin, so add it if we want it
88
		if ( extra === "margin" ) {
89
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
90
		}
91
92
		if ( isBorderBox ) {
93
94
			// border-box includes padding, so remove it if we want content
95
			if ( extra === "content" ) {
96
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
97
			}
98
99
			// At this point, extra isn't border nor margin, so remove border
100
			if ( extra !== "margin" ) {
101
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
102
			}
103
		} else {
104
105
			// At this point, extra isn't content, so add padding
106
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
107
108
			// At this point, extra isn't content nor padding, so add border
109
			if ( extra !== "padding" ) {
110
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
111
			}
112
		}
113
	}
114
115
	return val;
116
}
117
118
function getWidthOrHeight( elem, name, extra ) {
119
120
	// Start with offset property, which is equivalent to the border-box value
121
	var val,
122
		valueIsBorderBox = true,
123
		styles = getStyles( elem ),
124
		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
125
126
	// Support: IE <=11 only
127
	// Running getBoundingClientRect on a disconnected node
128
	// in IE throws an error.
129
	if ( elem.getClientRects().length ) {
130
		val = elem.getBoundingClientRect()[ name ];
131
	}
132
133
	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
134
	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
135
	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
136
	if ( val <= 0 || val == null ) {
137
138
		// Fall back to computed then uncomputed css if necessary
139
		val = curCSS( elem, name, styles );
140
		if ( val < 0 || val == null ) {
141
			val = elem.style[ name ];
142
		}
143
144
		// Computed unit is not pixels. Stop here and return.
145
		if ( rnumnonpx.test( val ) ) {
146
			return val;
147
		}
148
149
		// Check for style in case a browser which returns unreliable values
150
		// for getComputedStyle silently falls back to the reliable elem.style
151
		valueIsBorderBox = isBorderBox &&
152
			( support.boxSizingReliable() || val === elem.style[ name ] );
153
154
		// Normalize "", auto, and prepare for extra
155
		val = parseFloat( val ) || 0;
156
	}
157
158
	// Use the active box-sizing model to add/subtract irrelevant styles
159
	return ( val +
160
		augmentWidthOrHeight(
161
			elem,
162
			name,
163
			extra || ( isBorderBox ? "border" : "content" ),
164
			valueIsBorderBox,
165
			styles
166
		)
167
	) + "px";
168
}
169
170
jQuery.extend( {
171
172
	// Add in style property hooks for overriding the default
173
	// behavior of getting and setting a style property
174
	cssHooks: {
175
		opacity: {
176
			get: function( elem, computed ) {
177
				if ( computed ) {
178
179
					// We should always get a number back from opacity
180
					var ret = curCSS( elem, "opacity" );
181
					return ret === "" ? "1" : ret;
182
				}
183
			}
184
		}
185
	},
186
187
	// Don't automatically add "px" to these possibly-unitless properties
188
	cssNumber: {
189
		"animationIterationCount": true,
190
		"columnCount": true,
191
		"fillOpacity": true,
192
		"flexGrow": true,
193
		"flexShrink": true,
194
		"fontWeight": true,
195
		"lineHeight": true,
196
		"opacity": true,
197
		"order": true,
198
		"orphans": true,
199
		"widows": true,
200
		"zIndex": true,
201
		"zoom": true
202
	},
203
204
	// Add in properties whose names you wish to fix before
205
	// setting or getting the value
206
	cssProps: {
207
		"float": "cssFloat"
208
	},
209
210
	// Get and set the style property on a DOM Node
211
	style: function( elem, name, value, extra ) {
212
213
		// Don't set styles on text and comment nodes
214
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
215
			return;
216
		}
217
218
		// Make sure that we're working with the right name
219
		var ret, type, hooks,
220
			origName = jQuery.camelCase( name ),
221
			style = elem.style;
222
223
		name = jQuery.cssProps[ origName ] ||
224
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
225
226
		// Gets hook for the prefixed version, then unprefixed version
227
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
228
229
		// Check if we're setting a value
230
		if ( value !== undefined ) {
231
			type = typeof value;
232
233
			// Convert "+=" or "-=" to relative numbers (#7345)
234
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
235
				value = adjustCSS( elem, name, ret );
236
237
				// Fixes bug #9237
238
				type = "number";
239
			}
240
241
			// Make sure that null and NaN values aren't set (#7116)
242
			if ( value == null || value !== value ) {
243
				return;
244
			}
245
246
			// If a number was passed in, add the unit (except for certain CSS properties)
247
			if ( type === "number" ) {
248
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
249
			}
250
251
			// background-* props affect original clone's values
252
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
253
				style[ name ] = "inherit";
254
			}
255
256
			// If a hook was provided, use that value, otherwise just set the specified value
257
			if ( !hooks || !( "set" in hooks ) ||
258
				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
259
260
				style[ name ] = value;
261
			}
262
263
		} else {
264
265
			// If a hook was provided get the non-computed value from there
266
			if ( hooks && "get" in hooks &&
267
				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
268
269
				return ret;
270
			}
271
272
			// Otherwise just get the value from the style object
273
			return style[ name ];
274
		}
275
	},
276
277
	css: function( elem, name, extra, styles ) {
278
		var val, num, hooks,
279
			origName = jQuery.camelCase( name );
280
281
		// Make sure that we're working with the right name
282
		name = jQuery.cssProps[ origName ] ||
283
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
284
285
		// Try prefixed name followed by the unprefixed name
286
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
287
288
		// If a hook was provided get the computed value from there
289
		if ( hooks && "get" in hooks ) {
290
			val = hooks.get( elem, true, extra );
291
		}
292
293
		// Otherwise, if a way to get the computed value exists, use that
294
		if ( val === undefined ) {
295
			val = curCSS( elem, name, styles );
296
		}
297
298
		// Convert "normal" to computed value
299
		if ( val === "normal" && name in cssNormalTransform ) {
300
			val = cssNormalTransform[ name ];
301
		}
302
303
		// Make numeric if forced or a qualifier was provided and val looks numeric
304
		if ( extra === "" || extra ) {
305
			num = parseFloat( val );
306
			return extra === true || isFinite( num ) ? num || 0 : val;
307
		}
308
		return val;
309
	}
310
} );
311
312
jQuery.each( [ "height", "width" ], function( i, name ) {
313
	jQuery.cssHooks[ name ] = {
314
		get: function( elem, computed, extra ) {
315
			if ( computed ) {
316
317
				// Certain elements can have dimension info if we invisibly show them
318
				// but it must have a current display style that would benefit
319
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
320
321
					// Support: Safari 8+
322
					// Table columns in Safari have non-zero offsetWidth & zero
323
					// getBoundingClientRect().width unless display is changed.
324
					// Support: IE <=11 only
325
					// Running getBoundingClientRect on a disconnected node
326
					// in IE throws an error.
327
					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
328
						swap( elem, cssShow, function() {
329
							return getWidthOrHeight( elem, name, extra );
330
						} ) :
331
						getWidthOrHeight( elem, name, extra );
332
			}
333
		},
334
335
		set: function( elem, value, extra ) {
336
			var matches,
337
				styles = extra && getStyles( elem ),
338
				subtract = extra && augmentWidthOrHeight(
339
					elem,
340
					name,
341
					extra,
342
					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
343
					styles
344
				);
345
346
			// Convert to pixels if value adjustment is needed
347
			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
348
				( matches[ 3 ] || "px" ) !== "px" ) {
349
350
				elem.style[ name ] = value;
351
				value = jQuery.css( elem, name );
352
			}
353
354
			return setPositiveNumber( elem, value, subtract );
355
		}
356
	};
357
} );
358
359
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
360
	function( elem, computed ) {
361
		if ( computed ) {
362
			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
363
				elem.getBoundingClientRect().left -
364
					swap( elem, { marginLeft: 0 }, function() {
365
						return elem.getBoundingClientRect().left;
366
					} )
367
				) + "px";
368
		}
369
	}
370
);
371
372
// These hooks are used by animate to expand properties
373
jQuery.each( {
374
	margin: "",
375
	padding: "",
376
	border: "Width"
377
}, function( prefix, suffix ) {
378
	jQuery.cssHooks[ prefix + suffix ] = {
379
		expand: function( value ) {
380
			var i = 0,
381
				expanded = {},
382
383
				// Assumes a single number if not a string
384
				parts = typeof value === "string" ? value.split( " " ) : [ value ];
385
386
			for ( ; i < 4; i++ ) {
387
				expanded[ prefix + cssExpand[ i ] + suffix ] =
388
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
389
			}
390
391
			return expanded;
392
		}
393
	};
394
395
	if ( !rmargin.test( prefix ) ) {
396
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
397
	}
398
} );
399
400
jQuery.fn.extend( {
401
	css: function( name, value ) {
402
		return access( this, function( elem, name, value ) {
403
			var styles, len,
404
				map = {},
405
				i = 0;
406
407
			if ( jQuery.isArray( name ) ) {
408
				styles = getStyles( elem );
409
				len = name.length;
410
411
				for ( ; i < len; i++ ) {
412
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
413
				}
414
415
				return map;
416
			}
417
418
			return value !== undefined ?
419
				jQuery.style( elem, name, value ) :
420
				jQuery.css( elem, name );
421
		}, name, value, arguments.length > 1 );
422
	}
423
} );
424
425
return jQuery;
426
} );
427