style: Order keyframe rules by layer

@counter-style/@font-face/@scroll-timeline need similar fixes, but tests
for those haven't been synced yet so waiting for that before writing
them.

Differential Revision: https://phabricator.services.mozilla.com/D126616
This commit is contained in:
Emilio Cobos Álvarez 2023-05-27 15:03:43 +02:00 committed by Oriol Brufau
parent 6785ffea7b
commit b0a356e3b3
2 changed files with 32 additions and 15 deletions

View file

@ -2265,23 +2265,35 @@ impl CascadeData {
self.rules_source_order += 1;
},
CssRule::Keyframes(ref keyframes_rule) => {
use hashglobe::hash_map::Entry;
let keyframes_rule = keyframes_rule.read_with(guard);
debug!("Found valid keyframes rule: {:?}", *keyframes_rule);
// Don't let a prefixed keyframes animation override a non-prefixed one.
let needs_insertion = keyframes_rule.vendor_prefix.is_none() ||
self.animations
.get(keyframes_rule.name.as_atom())
.map_or(true, |rule| rule.vendor_prefix.is_some());
if needs_insertion {
let animation = KeyframesAnimation::from_keyframes(
&keyframes_rule.keyframes,
keyframes_rule.vendor_prefix.clone(),
guard,
);
debug!("Found valid keyframe animation: {:?}", animation);
self.animations
.try_insert(keyframes_rule.name.as_atom().clone(), animation)?;
match self.animations.try_entry(keyframes_rule.name.as_atom().clone())? {
Entry::Vacant(e) => {
e.insert(KeyframesAnimation::from_keyframes(
&keyframes_rule.keyframes,
keyframes_rule.vendor_prefix.clone(),
current_layer_order,
guard,
));
},
Entry::Occupied(mut e) => {
// Don't let a prefixed keyframes animation override
// a non-prefixed one on the same layer.
let needs_insert =
current_layer_order > e.get().layer_order ||
(current_layer_order == e.get().layer_order &&
(keyframes_rule.vendor_prefix.is_none() || e.get().vendor_prefix.is_some()));
if needs_insert {
e.insert(KeyframesAnimation::from_keyframes(
&keyframes_rule.keyframes,
keyframes_rule.vendor_prefix.clone(),
current_layer_order,
guard,
));
}
},
}
},
#[cfg(feature = "gecko")]