Skip to content

Commit b9624aa

Browse files
committed
Vendor prefixing for filter properties
1 parent 4cabb09 commit b9624aa

File tree

5 files changed

+123
-11
lines changed

5 files changed

+123
-11
lines changed

scripts/build-prefixes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ for (let prop in prefixes) {
3838
continue;
3939
}
4040
let prefix = browsers[name].prefix_exceptions?.[version] || browsers[name].prefix;
41+
42+
// https://github.com/postcss/autoprefixer/blob/main/lib/hacks/backdrop-filter.js#L11
43+
if (prefix === 'ms' && prop === 'backdrop-filter') {
44+
prefix = 'webkit';
45+
}
46+
4147
name = BROWSER_MAPPING[name] || name;
4248
let v = parseVersion(version);
4349
if (v == null) {

src/lib.rs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12357,16 +12357,85 @@ mod tests {
1235712357
minify_test(".foo { filter: drop-shadow(16px 16px 20px yellow); }", ".foo{filter:drop-shadow(16px 16px 20px #ff0)}");
1235812358
minify_test(".foo { filter: contrast(175%) brightness(3%); }", ".foo{filter:contrast(175%)brightness(3%)}");
1235912359

12360+
prefix_test(
12361+
".foo { filter: blur(5px) }",
12362+
indoc! { r#"
12363+
.foo {
12364+
-webkit-filter: blur(5px);
12365+
filter: blur(5px);
12366+
}
12367+
"#},
12368+
Browsers {
12369+
chrome: Some(20 << 16),
12370+
..Browsers::default()
12371+
}
12372+
);
12373+
12374+
prefix_test(
12375+
".foo { filter: blur(5px) }",
12376+
indoc! { r#"
12377+
.foo {
12378+
filter: blur(5px);
12379+
}
12380+
"#},
12381+
Browsers {
12382+
chrome: Some(80 << 16),
12383+
..Browsers::default()
12384+
}
12385+
);
12386+
12387+
prefix_test(
12388+
".foo { backdrop-filter: blur(5px) }",
12389+
indoc! { r#"
12390+
.foo {
12391+
backdrop-filter: blur(5px);
12392+
}
12393+
"#},
12394+
Browsers {
12395+
chrome: Some(80 << 16),
12396+
..Browsers::default()
12397+
}
12398+
);
12399+
12400+
prefix_test(
12401+
".foo { backdrop-filter: blur(5px) }",
12402+
indoc! { r#"
12403+
.foo {
12404+
-webkit-backdrop-filter: blur(5px);
12405+
backdrop-filter: blur(5px);
12406+
}
12407+
"#},
12408+
Browsers {
12409+
safari: Some(15 << 16),
12410+
..Browsers::default()
12411+
}
12412+
);
12413+
12414+
prefix_test(
12415+
".foo { filter: var(--foo) }",
12416+
indoc! { r#"
12417+
.foo {
12418+
-webkit-filter: var(--foo);
12419+
filter: var(--foo);
12420+
}
12421+
"#},
12422+
Browsers {
12423+
chrome: Some(20 << 16),
12424+
..Browsers::default()
12425+
}
12426+
);
12427+
1236012428
prefix_test(
1236112429
".foo { filter: drop-shadow(16px 16px 20px lab(40% 56.6 39)) }",
1236212430
indoc! { r#"
1236312431
.foo {
12432+
-webkit-filter: drop-shadow(16px 16px 20px #b32323);
1236412433
filter: drop-shadow(16px 16px 20px #b32323);
1236512434
filter: drop-shadow(16px 16px 20px lab(40% 56.6 39));
1236612435
}
1236712436
"#},
1236812437
Browsers {
12369-
chrome: Some(4 << 16),
12438+
chrome: Some(20 << 16),
1237012439
..Browsers::default()
1237112440
}
1237212441
);

src/prefixes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ impl Feature {
547547
Feature::BackdropFilter => {
548548
if let Some(version) = browsers.edge {
549549
if version >= 1114112 && version <= 1179648 {
550-
prefixes |= VendorPrefix::Ms;
550+
prefixes |= VendorPrefix::WebKit;
551551
}
552552
}
553553
if let Some(version) = browsers.ios_saf {

src/properties/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -862,8 +862,8 @@ define_properties! {
862862
"mask-box-image-repeat": WebKitMaskBoxImageRepeat(BorderImageRepeat, VendorPrefix) / WebKit unprefixed: false,
863863

864864
// https://drafts.fxtf.org/filter-effects-1/
865-
"filter": Filter(FilterList<'i>),
866-
"backdrop-filter": BackdropFilter(FilterList<'i>),
865+
"filter": Filter(FilterList<'i>, VendorPrefix) / WebKit,
866+
"backdrop-filter": BackdropFilter(FilterList<'i>, VendorPrefix) / WebKit,
867867
}
868868

869869
impl<'i, T: smallvec::Array<Item = V>, V: Parse<'i>> Parse<'i> for SmallVec<T> {

src/properties/prefix_handler.rs

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ define_prefixes! {
9999

100100
macro_rules! define_fallbacks {
101101
(
102-
$( $name: ident, )+
102+
$( $name: ident$(($p: ident))?, )+
103103
) => {
104104
#[derive(Default)]
105105
pub(crate) struct FallbackHandler {
@@ -118,16 +118,30 @@ macro_rules! define_fallbacks {
118118
fn handle_property(&mut self, property: &Property<'i>, dest: &mut DeclarationList<'i>, context: &mut PropertyHandlerContext<'i>) -> bool {
119119
match property {
120120
$(
121-
Property::$name(val) => {
121+
Property::$name(val $(, mut $p)?) => {
122122
let mut val = val.clone();
123123
if let Some(targets) = self.targets {
124+
$(
125+
if $p.contains(VendorPrefix::None) {
126+
$p = Feature::$name.prefixes_for(targets);
127+
}
128+
)?
129+
124130
let fallbacks = val.get_fallbacks(targets);
131+
#[allow(unused_variables)]
132+
let has_fallbacks = !fallbacks.is_empty();
125133
for fallback in fallbacks {
126-
dest.push(Property::$name(fallback.clone()))
134+
dest.push(Property::$name(fallback $(, $p)?))
127135
}
136+
137+
$(
138+
if has_fallbacks && $p.contains(VendorPrefix::None) {
139+
$p = VendorPrefix::None;
140+
}
141+
)?
128142
}
129143

130-
dest.push(Property::$name(val))
144+
dest.push(Property::$name(val $(, $p)?))
131145
}
132146
)+
133147
Property::Custom(custom) => {
@@ -149,8 +163,30 @@ macro_rules! define_fallbacks {
149163

150164
dest.push(Property::Custom(custom))
151165
}
152-
Property::Unparsed(val) if matches!(val.property_id, $( PropertyId::$name | )+ PropertyId::All) => {
153-
let mut unparsed = val.clone();
166+
Property::Unparsed(val) => {
167+
let mut unparsed = match val.property_id {
168+
$(
169+
PropertyId::$name$(($p))? => {
170+
macro_rules! get_prefixed {
171+
($vp: ident) => {
172+
if $vp.contains(VendorPrefix::None) {
173+
val.get_prefixed(self.targets, Feature::$name)
174+
} else {
175+
val.clone()
176+
}
177+
};
178+
() => {
179+
val.clone()
180+
};
181+
}
182+
183+
get_prefixed!($($p)?)
184+
}
185+
)+
186+
PropertyId::All => val.clone(),
187+
_ => return false
188+
};
189+
154190
context.add_unparsed_fallbacks(&mut unparsed);
155191
dest.push(Property::Unparsed(unparsed));
156192
}
@@ -168,7 +204,8 @@ macro_rules! define_fallbacks {
168204
define_fallbacks! {
169205
Color,
170206
TextShadow,
171-
Filter,
207+
Filter(prefix),
208+
BackdropFilter(prefix),
172209
Fill,
173210
Stroke,
174211
CaretColor,

0 commit comments

Comments
 (0)