Skip to content

Commit 2b5f5d5

Browse files
committed
CSS: Avoid filling jQuery.cssProps
Fixes jquerygh-3986 Closes jquerygh-4005 Avoids filling jQuery.cssProps by introducing a second internal prop cache. This allows jQuery Migrate to detect external usage.
1 parent b95e0da commit 2b5f5d5

File tree

3 files changed

+48
-39
lines changed

3 files changed

+48
-39
lines changed

src/css.js

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ define( [
1313
"./css/adjustCSS",
1414
"./css/addGetHookIf",
1515
"./css/support",
16+
"./css/finalPropName",
1617

1718
"./core/init",
1819
"./core/ready",
1920
"./selector" // contains
2021
], function( jQuery, pnum, access, camelCase, document, rcssNum, rnumnonpx, cssExpand,
21-
getStyles, swap, curCSS, adjustCSS, addGetHookIf, support ) {
22+
getStyles, swap, curCSS, adjustCSS, addGetHookIf, support, finalPropName ) {
2223

2324
"use strict";
2425

@@ -33,40 +34,7 @@ var
3334
cssNormalTransform = {
3435
letterSpacing: "0",
3536
fontWeight: "400"
36-
},
37-
38-
cssPrefixes = [ "Webkit", "Moz", "ms" ],
39-
emptyStyle = document.createElement( "div" ).style;
40-
41-
// Return a css property mapped to a potentially vendor prefixed property
42-
function vendorPropName( name ) {
43-
44-
// Shortcut for names that are not vendor prefixed
45-
if ( name in emptyStyle ) {
46-
return name;
47-
}
48-
49-
// Check for vendor prefixed names
50-
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
51-
i = cssPrefixes.length;
52-
53-
while ( i-- ) {
54-
name = cssPrefixes[ i ] + capName;
55-
if ( name in emptyStyle ) {
56-
return name;
57-
}
58-
}
59-
}
60-
61-
// Return a property mapped along what jQuery.cssProps suggests or to
62-
// a vendor prefixed property.
63-
function finalPropName( name ) {
64-
var ret = jQuery.cssProps[ name ];
65-
if ( !ret ) {
66-
ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
67-
}
68-
return ret;
69-
}
37+
};
7038

7139
function setPositiveNumber( elem, value, subtract ) {
7240

src/css/finalPropName.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
define( [ "../var/document" ], function( document ) {
2+
3+
"use strict";
4+
5+
var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6+
emptyStyle = document.createElement( "div" ).style,
7+
vendorProps = {};
8+
9+
// Return a vendor-prefixed property or undefined
10+
function vendorPropName( name ) {
11+
12+
// Check for vendor prefixed names
13+
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
14+
i = cssPrefixes.length;
15+
16+
while ( i-- ) {
17+
name = cssPrefixes[ i ] + capName;
18+
if ( name in emptyStyle ) {
19+
return name;
20+
}
21+
}
22+
}
23+
24+
// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
25+
function finalPropName( name ) {
26+
var final = jQuery.cssProps[ name ] || vendorProps[ name ];
27+
28+
if ( final ) {
29+
return final;
30+
}
31+
if ( name in emptyStyle ) {
32+
return name;
33+
}
34+
return vendorProps[ name ] = vendorPropName( name ) || name;
35+
}
36+
37+
return finalPropName;
38+
39+
} );

src/effects/Tween.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
define( [
22
"../core",
3+
"../css/finalPropName",
4+
35
"../css"
4-
], function( jQuery ) {
6+
], function( jQuery, finalPropName ) {
57

68
"use strict";
79

@@ -84,9 +86,9 @@ Tween.propHooks = {
8486
// Use .style if available and use plain properties where available.
8587
if ( jQuery.fx.step[ tween.prop ] ) {
8688
jQuery.fx.step[ tween.prop ]( tween );
87-
} else if ( tween.elem.nodeType === 1 &&
88-
( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
89-
jQuery.cssHooks[ tween.prop ] ) ) {
89+
} else if ( tween.elem.nodeType === 1 && (
90+
jQuery.cssHooks[ tween.prop ] ||
91+
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
9092
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
9193
} else {
9294
tween.elem[ tween.prop ] = tween.now;

0 commit comments

Comments
 (0)