Browse Source

css: do not raise exception on css error

mattias 2 years ago
parent
commit
49a13b1e6f
1 changed files with 31 additions and 2 deletions
  1. 31 2
      src/fresnel.dom.pas

+ 31 - 2
src/fresnel.dom.pas

@@ -496,6 +496,7 @@ type
     FHeight: TFresnelLength;
     FWidth: TFresnelLength;
     FMaxPreferredWidth: TFresnelLength;
+    procedure CSSResolverLog(Sender: TObject; Entry: TCSSResolverLogEntry);
   protected
     function GetDPI(IsHorizontal: boolean): TFresnelLength; override;
     function GetHeight: TFresnelLength; virtual;
@@ -710,6 +711,12 @@ end;
 
 { TFresnelViewport }
 
+procedure TFresnelViewport.CSSResolverLog(Sender: TObject;
+  Entry: TCSSResolverLogEntry);
+begin
+  debugln(['TFresnelViewport.CSSResolverLog ','['+IntToStr(Entry.ID)+'] '+Entry.Msg+' at '+CSSResolver.GetElPos(Entry.PosEl)]);
+end;
+
 function TFresnelViewport.GetDPI(IsHorizontal: boolean): TFresnelLength;
 begin
   Result:=FDPI[IsHorizontal];
@@ -990,6 +997,7 @@ begin
 
   FCSSResolver:=TCSSResolver.Create(nil);
   FCSSResolver.OwnsStyle:=false;
+  FCSSResolver.OnLog:=@CSSResolverLog;
   FStylesheet:=TStringList.Create(false);
   FStylesheet.FPOAttachObserver(Self);
 end;
@@ -1936,15 +1944,36 @@ procedure TFresnelElement.SetStyle(const AValue: string);
 var
   ss: TStringStream;
   aParser: TCSSParser;
+  NewStyleElements: TCSSElement;
 begin
   if FStyle=AValue then Exit;
   FStyle:=AValue;
-  FreeAndNil(FStyleElements);
   aParser:=nil;
   ss:=TStringStream.Create(Style);
   try
+    NewStyleElements:=nil;
     aParser:=TCSSParser.Create(ss);
-    FStyleElements:=aParser.ParseInline;
+    try
+      NewStyleElements:=aParser.ParseInline;
+    except
+      on CSSE: ECSSException do begin
+        debugln(['TFresnelElement.SetStyle ',Name,':',ClassName,' ',CSSE.Message]);
+        exit;
+      end;
+      on FresnelE: EFresnel do begin
+        debugln(['TFresnelElement.SetStyle ',Name,':',ClassName,' ',FresnelE.Message]);
+        exit;
+      end;
+    end;
+    if (FStyleElements=nil) then
+    begin
+      if NewStyleElements=nil then exit;
+    end else begin
+      if (NewStyleElements<>nil)
+          and FStyleElements.Equals(NewStyleElements) then exit;
+    end;
+    FreeAndNil(FStyleElements);
+    FStyleElements:=NewStyleElements;
   finally
     aParser.Free;
   end;