@@ -8,7 +8,7 @@ use crate::prefixes::Feature;
88use crate :: printer:: Printer ;
99use crate :: properties:: Property ;
1010use crate :: targets:: Browsers ;
11- use crate :: traits:: { Parse , PropertyHandler , ToCss , Zero } ;
11+ use crate :: traits:: { IsCompatible , Parse , PropertyHandler , ToCss , Zero } ;
1212use crate :: values:: color:: { ColorFallbackKind , CssColor } ;
1313use crate :: values:: length:: Length ;
1414use crate :: vendor_prefix:: VendorPrefix ;
@@ -124,10 +124,21 @@ impl ToCss for BoxShadow {
124124 }
125125}
126126
127+ impl IsCompatible for BoxShadow {
128+ fn is_compatible ( & self , browsers : Browsers ) -> bool {
129+ self . color . is_compatible ( browsers)
130+ && self . x_offset . is_compatible ( browsers)
131+ && self . y_offset . is_compatible ( browsers)
132+ && self . blur . is_compatible ( browsers)
133+ && self . spread . is_compatible ( browsers)
134+ }
135+ }
136+
127137#[ derive( Default ) ]
128138pub ( crate ) struct BoxShadowHandler {
129139 targets : Option < Browsers > ,
130140 box_shadows : Option < ( SmallVec < [ BoxShadow ; 1 ] > , VendorPrefix ) > ,
141+ flushed : bool ,
131142}
132143
133144impl BoxShadowHandler {
@@ -148,9 +159,15 @@ impl<'i> PropertyHandler<'i> for BoxShadowHandler {
148159 ) -> bool {
149160 match property {
150161 Property :: BoxShadow ( box_shadows, prefix) => {
162+ if self . box_shadows . is_some ( )
163+ && matches ! ( context. targets, Some ( browsers) if !box_shadows. is_compatible( browsers) )
164+ {
165+ self . flush ( dest) ;
166+ }
167+
151168 if let Some ( ( val, prefixes) ) = & mut self . box_shadows {
152169 if val != box_shadows && !prefixes. contains ( * prefix) {
153- self . finalize ( dest, context ) ;
170+ self . flush ( dest) ;
154171 self . box_shadows = Some ( ( box_shadows. clone ( ) , * prefix) ) ;
155172 } else {
156173 * val = box_shadows. clone ( ) ;
@@ -161,11 +178,12 @@ impl<'i> PropertyHandler<'i> for BoxShadowHandler {
161178 }
162179 }
163180 Property :: Unparsed ( unparsed) if matches ! ( unparsed. property_id, PropertyId :: BoxShadow ( _) ) => {
164- self . finalize ( dest, context ) ;
181+ self . flush ( dest) ;
165182
166183 let mut unparsed = unparsed. clone ( ) ;
167184 context. add_unparsed_fallbacks ( & mut unparsed) ;
168- dest. push ( Property :: Unparsed ( unparsed) )
185+ dest. push ( Property :: Unparsed ( unparsed) ) ;
186+ self . flushed = true ;
169187 }
170188 _ => return false ,
171189 }
@@ -174,14 +192,21 @@ impl<'i> PropertyHandler<'i> for BoxShadowHandler {
174192 }
175193
176194 fn finalize ( & mut self , dest : & mut DeclarationList , _: & mut PropertyHandlerContext < ' i , ' _ > ) {
195+ self . flush ( dest) ;
196+ self . flushed = false ;
197+ }
198+ }
199+
200+ impl BoxShadowHandler {
201+ fn flush < ' i > ( & mut self , dest : & mut DeclarationList ) {
177202 if self . box_shadows . is_none ( ) {
178203 return ;
179204 }
180205
181206 let box_shadows = std:: mem:: take ( & mut self . box_shadows ) ;
182207
183208 if let Some ( ( box_shadows, prefixes) ) = box_shadows {
184- if let Some ( targets) = self . targets {
209+ if let ( Some ( targets) , false ) = ( self . targets , self . flushed ) {
185210 let mut prefixes = if prefixes. contains ( VendorPrefix :: None ) {
186211 Feature :: BoxShadow . prefixes_for ( targets)
187212 } else {
@@ -237,5 +262,7 @@ impl<'i> PropertyHandler<'i> for BoxShadowHandler {
237262 dest. push ( Property :: BoxShadow ( box_shadows, prefixes) )
238263 }
239264 }
265+
266+ self . flushed = true ;
240267 }
241268}
0 commit comments