@@ -12,9 +12,16 @@ import { calc } from '@csstools/css-calc';
1212export  {  unsetValue  }  from  './property-shared' ; 
1313
1414const  cssPropertyNames : string [ ]  =  [ ] ; 
15+ const  HAS_OWN  =  Object . prototype . hasOwnProperty ; 
1516const  symbolPropertyMap  =  { } ; 
1617const  cssSymbolPropertyMap  =  { } ; 
1718
19+ // Hoisted regex/constants for hot paths to avoid re-allocation 
20+ const  CSS_VARIABLE_NAME_RE  =  / ^ - - [ ^ , \s ] + ?$ / ; 
21+ const  DIP_RE  =  / ( [ 0 - 9 ] + ( \. [ 0 - 9 ] + ) ? ) d i p \b / g; 
22+ const  UNSET_RE  =  / u n s e t / g; 
23+ const  INFINITY_RE  =  / i n f i n i t y / g; 
24+ 
1825const  inheritableProperties  =  new  Array < InheritedProperty < any ,  any > > ( ) ; 
1926const  inheritableCssProperties  =  new  Array < InheritedCssProperty < any ,  any > > ( ) ; 
2027
@@ -50,7 +57,7 @@ export function _getStyleProperties(): CssProperty<any, any>[] {
5057} 
5158
5259export  function  isCssVariable ( property : string )  { 
53- 	return  / ^ - - [ ^ , \s ] + ? $ / . test ( property ) ; 
60+ 	return  CSS_VARIABLE_NAME_RE . test ( property ) ; 
5461} 
5562
5663export  function  isCssCalcExpression ( value : string )  { 
@@ -119,27 +126,31 @@ export function _evaluateCssCalcExpression(value: string) {
119126	}  else  { 
120127		return  value ; 
121128	} 
129+ 	return  value ; 
122130} 
123131
124132function  _replaceDip ( value : string )  { 
125- 	return  value . replace ( / ( [ 0 - 9 ] + ( \. [ 0 - 9 ] + ) ? ) d i p \b / g ,  '$1' ) ; 
133+ 	return  value . replace ( DIP_RE ,  '$1' ) ; 
126134} 
127135
128136function  _replaceKeywordsWithValues ( value : string )  { 
129137	let  cssValue  =  value ; 
130138	if  ( cssValue . includes ( 'unset' ) )  { 
131- 		cssValue  =  cssValue . replace ( / u n s e t / g ,  '0' ) ; 
139+ 		cssValue  =  cssValue . replace ( UNSET_RE ,  '0' ) ; 
132140	} 
133141	if  ( cssValue . includes ( 'infinity' ) )  { 
134- 		cssValue  =  cssValue . replace ( / i n f i n i t y / g ,  '999999' ) ; 
142+ 		cssValue  =  cssValue . replace ( INFINITY_RE ,  '999999' ) ; 
135143	} 
136144	return  cssValue ; 
137145} 
138146
139147function  getPropertiesFromMap ( map ) : Property < any ,  any > [ ]  |  CssProperty < any ,  any > [ ]  { 
140- 	const  props  =  [ ] ; 
141- 	Object . getOwnPropertySymbols ( map ) . forEach ( ( symbol )  =>  props . push ( map [ symbol ] ) ) ; 
142- 
148+ 	const  symbols  =  Object . getOwnPropertySymbols ( map ) ; 
149+ 	const  len  =  symbols . length ; 
150+ 	const  props  =  new  Array ( len ) ; 
151+ 	for  ( let  i  =  0 ;  i  <  len ;  i ++ )  { 
152+ 		props [ i ]  =  map [ symbols [ i ] ] ; 
153+ 	} 
143154	return  props ; 
144155} 
145156
@@ -240,13 +251,11 @@ export class Property<T extends ViewBase, U> implements TypedPropertyDescriptor<
240251							if  ( this . _suspendedUpdates )  { 
241252								this . _suspendedUpdates [ propertyName ]  =  property ; 
242253							} 
254+ 						}  else  if  ( defaultValueKey  in  this )  { 
255+ 							this [ setNative ] ( this [ defaultValueKey ] ) ; 
256+ 							delete  this [ defaultValueKey ] ; 
243257						}  else  { 
244- 							if  ( defaultValueKey  in  this )  { 
245- 								this [ setNative ] ( this [ defaultValueKey ] ) ; 
246- 								delete  this [ defaultValueKey ] ; 
247- 							}  else  { 
248- 								this [ setNative ] ( defaultValue ) ; 
249- 							} 
258+ 							this [ setNative ] ( defaultValue ) ; 
250259						} 
251260					} 
252261				}  else  { 
@@ -424,13 +433,11 @@ export class CoercibleProperty<T extends ViewBase, U> extends Property<T, U> imp
424433							if  ( this . _suspendedUpdates )  { 
425434								this . _suspendedUpdates [ propertyName ]  =  property ; 
426435							} 
436+ 						}  else  if  ( defaultValueKey  in  this )  { 
437+ 							this [ setNative ] ( this [ defaultValueKey ] ) ; 
438+ 							delete  this [ defaultValueKey ] ; 
427439						}  else  { 
428- 							if  ( defaultValueKey  in  this )  { 
429- 								this [ setNative ] ( this [ defaultValueKey ] ) ; 
430- 								delete  this [ defaultValueKey ] ; 
431- 							}  else  { 
432- 								this [ setNative ] ( defaultValue ) ; 
433- 							} 
440+ 							this [ setNative ] ( defaultValue ) ; 
434441						} 
435442					} 
436443				}  else  { 
@@ -577,7 +584,10 @@ export class CssProperty<T extends Style, U> {
577584		const  propertyName  =  options . name ; 
578585		this . name  =  propertyName ; 
579586
580- 		cssPropertyNames . push ( options . cssName ) ; 
587+ 		// Guard against undefined cssName 
588+ 		if  ( options . cssName )  { 
589+ 			cssPropertyNames . push ( options . cssName ) ; 
590+ 		} 
581591
582592		this . cssName  =  `css:${ options . cssName }  ; 
583593		this . cssLocalName  =  options . cssName ; 
@@ -657,13 +667,11 @@ export class CssProperty<T extends Style, U> {
657667							if  ( view . _suspendedUpdates )  { 
658668								view . _suspendedUpdates [ propertyName ]  =  property ; 
659669							} 
670+ 						}  else  if  ( defaultValueKey  in  this )  { 
671+ 							view [ setNative ] ( this [ defaultValueKey ] ) ; 
672+ 							delete  this [ defaultValueKey ] ; 
660673						}  else  { 
661- 							if  ( defaultValueKey  in  this )  { 
662- 								view [ setNative ] ( this [ defaultValueKey ] ) ; 
663- 								delete  this [ defaultValueKey ] ; 
664- 							}  else  { 
665- 								view [ setNative ] ( defaultValue ) ; 
666- 							} 
674+ 							view [ setNative ] ( defaultValue ) ; 
667675						} 
668676					} 
669677				}  else  { 
@@ -743,13 +751,11 @@ export class CssProperty<T extends Style, U> {
743751							if  ( view . _suspendedUpdates )  { 
744752								view . _suspendedUpdates [ propertyName ]  =  property ; 
745753							} 
754+ 						}  else  if  ( defaultValueKey  in  this )  { 
755+ 							view [ setNative ] ( this [ defaultValueKey ] ) ; 
756+ 							delete  this [ defaultValueKey ] ; 
746757						}  else  { 
747- 							if  ( defaultValueKey  in  this )  { 
748- 								view [ setNative ] ( this [ defaultValueKey ] ) ; 
749- 								delete  this [ defaultValueKey ] ; 
750- 							}  else  { 
751- 								view [ setNative ] ( defaultValue ) ; 
752- 							} 
758+ 							view [ setNative ] ( defaultValue ) ; 
753759						} 
754760					} 
755761				}  else  { 
@@ -856,7 +862,9 @@ export class CssAnimationProperty<T extends Style, U> implements CssAnimationPro
856862		const  propertyName  =  options . name ; 
857863		this . name  =  propertyName ; 
858864
859- 		cssPropertyNames . push ( options . cssName ) ; 
865+ 		if  ( options . cssName )  { 
866+ 			cssPropertyNames . push ( options . cssName ) ; 
867+ 		} 
860868
861869		CssAnimationProperty . properties [ propertyName ]  =  this ; 
862870		if  ( options . cssName  &&  options . cssName  !==  propertyName )  { 
@@ -1143,21 +1151,19 @@ export class InheritedCssProperty<T extends Style, U> extends CssProperty<T, U>
11431151							if  ( view . _suspendedUpdates )  { 
11441152								view . _suspendedUpdates [ propertyName ]  =  property ; 
11451153							} 
1146- 						}  else  { 
1147- 							if  ( unsetNativeValue )  { 
1148- 								if  ( defaultValueKey  in  this )  { 
1149- 									view [ setNative ] ( this [ defaultValueKey ] ) ; 
1150- 									delete  this [ defaultValueKey ] ; 
1151- 								}  else  { 
1152- 									view [ setNative ] ( defaultValue ) ; 
1153- 								} 
1154+ 						}  else  if  ( unsetNativeValue )  { 
1155+ 							if  ( defaultValueKey  in  this )  { 
1156+ 								view [ setNative ] ( this [ defaultValueKey ] ) ; 
1157+ 								delete  this [ defaultValueKey ] ; 
11541158							}  else  { 
1155- 								if  ( ! ( defaultValueKey  in  this ) )  { 
1156- 									this [ defaultValueKey ]  =  view [ getDefault ]  ? view [ getDefault ] ( )  : defaultValue ; 
1157- 								} 
1158- 
1159- 								view [ setNative ] ( value ) ; 
1159+ 								view [ setNative ] ( defaultValue ) ; 
11601160							} 
1161+ 						}  else  { 
1162+ 							if  ( ! ( defaultValueKey  in  this ) )  { 
1163+ 								this [ defaultValueKey ]  =  view [ getDefault ]  ? view [ getDefault ] ( )  : defaultValue ; 
1164+ 							} 
1165+ 
1166+ 							view [ setNative ] ( value ) ; 
11611167						} 
11621168					} 
11631169
@@ -1356,6 +1362,7 @@ export function applyPendingNativeSetters(view: ViewBase): void {
13561362	// TODO: Check what happens if a view was suspended and its value was reset, or set back to default! 
13571363	const  suspendedUpdates  =  view . _suspendedUpdates ; 
13581364	for  ( const  propertyName  in  suspendedUpdates )  { 
1365+ 		if  ( ! HAS_OWN . call ( suspendedUpdates ,  propertyName ) )  continue ; 
13591366		const  property  =  < PropertyInterface > suspendedUpdates [ propertyName ] ; 
13601367		const  setNative  =  property . setNative ; 
13611368		if  ( view [ setNative ] )  { 
@@ -1523,9 +1530,11 @@ export function propagateInheritableCssProperties(parentStyle: Style, childStyle
15231530export  function  getSetProperties ( view : ViewBase ) : [ string ,  any ] [ ]  { 
15241531	const  result  =  [ ] ; 
15251532
1526- 	Object . getOwnPropertyNames ( view ) . forEach ( ( prop )  =>  { 
1533+ 	const  ownProps  =  Object . getOwnPropertyNames ( view ) ; 
1534+ 	for  ( let  i  =  0 ;  i  <  ownProps . length ;  i ++ )  { 
1535+ 		const  prop  =  ownProps [ i ] ; 
15271536		result . push ( [ prop ,  view [ prop ] ] ) ; 
1528- 	} ) ; 
1537+ 	} 
15291538
15301539	const  symbols  =  Object . getOwnPropertySymbols ( view ) ; 
15311540	for  ( const  symbol  of  symbols )  { 
@@ -1545,7 +1554,9 @@ export function getComputedCssValues(view: ViewBase): [string, any][] {
15451554	const  result  =  [ ] ; 
15461555	const  style  =  view . style ; 
15471556	for  ( const  prop  of  cssPropertyNames )  { 
1548- 		result . push ( [ prop ,  style [ prop ] ] ) ; 
1557+ 		if  ( prop  !==  undefined  &&  prop  !==  null )  { 
1558+ 			result . push ( [ prop ,  style [ prop ] ] ) ; 
1559+ 		} 
15491560	} 
15501561
15511562	// Add these to enable box model in chrome-devtools styles tab 
0 commit comments