From 96ea9960f742607da53a21cfa029bc0dc3dbf1ae Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Wed, 14 Feb 2024 22:34:49 -0500 Subject: [PATCH] Merge @keyframes with same name and prefixes --- src/lib.rs | 33 +++++++++++++++++++++++++++++++++ src/rules/mod.rs | 9 +++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7e034ac6..d22bbf33 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7257,6 +7257,39 @@ mod tests { ..Browsers::default() }, ); + + minify_test( + r#" + @keyframes test { + 100% { + background: blue + } + } + + @keyframes test { + 100% { + background: red + } + } + "#, + "@keyframes test{to{background:red}}", + ); + minify_test( + r#" + @keyframes test { + 100% { + background: blue + } + } + + @-webkit-keyframes test { + 100% { + background: red + } + } + "#, + "@keyframes test{to{background:#00f}}@-webkit-keyframes test{to{background:red}}", + ); } #[test] diff --git a/src/rules/mod.rs b/src/rules/mod.rs index 067848e4..89ac3087 100644 --- a/src/rules/mod.rs +++ b/src/rules/mod.rs @@ -519,10 +519,15 @@ impl<'i, T: Clone> CssRuleList<'i, T> { }; } - // If there is an existing rule with the same name and identical keyframes, - // merge the vendor prefixes from this rule into it. + // Merge @keyframes rules with the same name. if let Some(existing_idx) = keyframe_rules.get(&keyframes.name) { if let Some(CssRule::Keyframes(existing)) = &mut rules.get_mut(*existing_idx) { + // If the existing rule has the same vendor prefixes, replace it with this rule. + if existing.vendor_prefix == keyframes.vendor_prefix { + *existing = keyframes.clone(); + continue; + } + // Otherwise, if the keyframes are identical, merge the prefixes. if existing.keyframes == keyframes.keyframes { existing.vendor_prefix |= keyframes.vendor_prefix; set_prefix!(existing);