Skip to content

Commit 9861d52

Browse files
committed
Box shadow compat
1 parent 54aa117 commit 9861d52

File tree

2 files changed

+128
-5
lines changed

2 files changed

+128
-5
lines changed

src/lib.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7620,6 +7620,102 @@ mod tests {
76207620
..Browsers::default()
76217621
},
76227622
);
7623+
7624+
prefix_test(
7625+
r#"
7626+
.foo {
7627+
box-shadow: 0px 0px 22px red;
7628+
box-shadow: 0px 0px max(2cqw, 22px) red;
7629+
}
7630+
"#,
7631+
indoc! {r#"
7632+
.foo {
7633+
box-shadow: 0 0 22px red;
7634+
box-shadow: 0 0 max(2cqw, 22px) red;
7635+
}
7636+
"#
7637+
},
7638+
Browsers {
7639+
safari: Some(14 << 16),
7640+
..Browsers::default()
7641+
},
7642+
);
7643+
prefix_test(
7644+
r#"
7645+
.foo {
7646+
box-shadow: 0px 0px 22px red;
7647+
box-shadow: 0px 0px max(2cqw, 22px) red;
7648+
}
7649+
"#,
7650+
indoc! {r#"
7651+
.foo {
7652+
box-shadow: 0 0 max(2cqw, 22px) red;
7653+
}
7654+
"#
7655+
},
7656+
Browsers {
7657+
safari: Some(16 << 16),
7658+
..Browsers::default()
7659+
},
7660+
);
7661+
7662+
prefix_test(
7663+
r#"
7664+
.foo {
7665+
box-shadow: 0px 0px 22px red;
7666+
box-shadow: 0px 0px 22px lab(40% 56.6 39);
7667+
}
7668+
"#,
7669+
indoc! {r#"
7670+
.foo {
7671+
box-shadow: 0 0 22px red;
7672+
box-shadow: 0 0 22px lab(40% 56.6 39);
7673+
}
7674+
"#
7675+
},
7676+
Browsers {
7677+
safari: Some(14 << 16),
7678+
..Browsers::default()
7679+
},
7680+
);
7681+
prefix_test(
7682+
r#"
7683+
.foo {
7684+
box-shadow: 0px 0px 22px red;
7685+
box-shadow: 0px 0px 22px lab(40% 56.6 39);
7686+
}
7687+
"#,
7688+
indoc! {r#"
7689+
.foo {
7690+
box-shadow: 0 0 22px lab(40% 56.6 39);
7691+
}
7692+
"#
7693+
},
7694+
Browsers {
7695+
safari: Some(16 << 16),
7696+
..Browsers::default()
7697+
},
7698+
);
7699+
7700+
prefix_test(
7701+
r#"
7702+
.foo {
7703+
box-shadow: var(--fallback);
7704+
box-shadow: 0px 0px 22px lab(40% 56.6 39);
7705+
}
7706+
"#,
7707+
indoc! {r#"
7708+
.foo {
7709+
box-shadow: var(--fallback);
7710+
box-shadow: 0 0 22px lab(40% 56.6 39);
7711+
}
7712+
"#
7713+
},
7714+
Browsers {
7715+
safari: Some(16 << 16),
7716+
..Browsers::default()
7717+
},
7718+
);
76237719
}
76247720

76257721
#[test]

src/properties/box_shadow.rs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::prefixes::Feature;
88
use crate::printer::Printer;
99
use crate::properties::Property;
1010
use crate::targets::Browsers;
11-
use crate::traits::{Parse, PropertyHandler, ToCss, Zero};
11+
use crate::traits::{IsCompatible, Parse, PropertyHandler, ToCss, Zero};
1212
use crate::values::color::{ColorFallbackKind, CssColor};
1313
use crate::values::length::Length;
1414
use 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)]
128138
pub(crate) struct BoxShadowHandler {
129139
targets: Option<Browsers>,
130140
box_shadows: Option<(SmallVec<[BoxShadow; 1]>, VendorPrefix)>,
141+
flushed: bool,
131142
}
132143

133144
impl 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

Comments
 (0)