From 2d94575fa8124933e47924909766b9eaedfc2bba Mon Sep 17 00:00:00 2001 From: mattias Date: Wed, 19 Oct 2022 16:43:52 +0100 Subject: [PATCH] fcl-css: added attribute value check --- packages/fcl-css/src/fpcssresolver.pas | 33 +++++++++++++++++++++++++ packages/fcl-css/tests/tccssresolver.pp | 10 ++++++++ 2 files changed, 43 insertions(+) diff --git a/packages/fcl-css/src/fpcssresolver.pas b/packages/fcl-css/src/fpcssresolver.pas index 76f86a4d9f..baed4ae933 100644 --- a/packages/fcl-css/src/fpcssresolver.pas +++ b/packages/fcl-css/src/fpcssresolver.pas @@ -198,6 +198,7 @@ type function GetCSSEmpty: boolean; function GetCSSDepth: integer; procedure SetCSSValue(AttrID: TCSSNumericalID; Value: TCSSElement); + function CheckCSSValue(AttrID: TCSSNumericalID; Value: TCSSElement): boolean; end; type @@ -249,10 +250,18 @@ type Next, Prev: TCSSElResolverData; end; + TCSSValueValidity = ( + cvvNone, + cvvValid, + cvvInvalid + ); + TCSSValueValidities = set of TCSSValueValidity; + TCSSIdentifierData = class(TCSSElResolverData) public NumericalID: TCSSNumericalID; Kind: TCSSNumericalIDKind; + ValueValid: TCSSValueValidity; end; TCSSValueData = class(TCSSElResolverData) @@ -385,6 +394,7 @@ type function PosWord(const SearchWord, Words: TCSSString): integer; virtual; function GetSiblingCount(aNode: ICSSNode): integer; virtual; procedure MergeProperty(El: TCSSElement; Specifity: TCSSSpecifity); virtual; + function CheckAttrValueValidity(AttrID: TCSSNumericalID; aKey, aValue: TCSSElement): boolean; virtual; function ResolveIdentifier(El: TCSSIdentifierElement; Kind: TCSSNumericalIDKind): TCSSNumericalID; virtual; function ResolveCall(El: TCSSCallElement): TCSSNumericalID; virtual; procedure AddElData(El: TCSSElement; ElData: TCSSElResolverData); virtual; @@ -1674,9 +1684,13 @@ begin begin if CompAttr^.Specifity>Specifity then exit; + if not CheckAttrValueValidity(AttrID,aKey,aValue) then + exit; CompAttr^.Specifity:=Specifity; CompAttr^.Value:=aValue; end else begin + if not CheckAttrValueValidity(AttrID,aKey,aValue) then + exit; AddComputedAttribute(AttrID,Specifity,aValue); end; end; @@ -1686,6 +1700,25 @@ begin Log(etError,20220908230855,'Unknown CSS property',El); end; +function TCSSResolver.CheckAttrValueValidity(AttrID: TCSSNumericalID; aKey, + aValue: TCSSElement): boolean; +var + Data: TCSSIdentifierData; +begin + if not (aKey.CustomData is TCSSIdentifierData) then + raise Exception.Create('TCSSResolver.CheckAttrValueValidity 20221019173901'); + Data:=TCSSIdentifierData(aKey.CustomData); + case Data.ValueValid of + cvvValid: exit(true); + cvvInvalid: exit(false); + end; + Result:=FNode.CheckCSSValue(AttrID,aValue); + if Result then + Data.ValueValid:=cvvValid + else + Data.ValueValid:=cvvInvalid; +end; + function TCSSResolver.ResolveIdentifier(El: TCSSIdentifierElement; Kind: TCSSNumericalIDKind): TCSSNumericalID; var diff --git a/packages/fcl-css/tests/tccssresolver.pp b/packages/fcl-css/tests/tccssresolver.pp index 655108a26a..7bfd14667e 100644 --- a/packages/fcl-css/tests/tccssresolver.pp +++ b/packages/fcl-css/tests/tccssresolver.pp @@ -90,6 +90,8 @@ type function GetCSSTypeID: TCSSNumericalID; class function GetAttributeInitialValue(Attr: TDemoNodeAttribute): string; virtual; function HasCSSClass(const aClassName: TCSSString): boolean; virtual; + function CheckCSSValue(AttrID: TCSSNumericalID; Value: TCSSElement + ): boolean; virtual; procedure SetCSSValue(AttrID: TCSSNumericalID; Value: TCSSElement); virtual; function GetCSSParent: ICSSNode; virtual; function GetCSSIndex: integer; virtual; @@ -1569,6 +1571,14 @@ begin Result:=false; end; +function TDemoNode.CheckCSSValue(AttrID: TCSSNumericalID; Value: TCSSElement + ): boolean; +begin + if (AttrIDord(High(TDemoNodeAttribute))+DemoAttrIDBase) then + exit(false); + Result:=Value<>nil; +end; + procedure TDemoNode.SetCSSValue(AttrID: TCSSNumericalID; Value: TCSSElement); var Attr: TDemoNodeAttribute;