Skip to content

Commit

Permalink
Filter out !important property in keyframes for stylo.
Browse files Browse the repository at this point in the history
  • Loading branch information
Hiroyuki Ikezoe committed Sep 20, 2017
1 parent c6381c6 commit a940999
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 6 deletions.
39 changes: 39 additions & 0 deletions components/style/properties/declaration_block.rs
Expand Up @@ -112,6 +112,40 @@ impl<'a> DoubleEndedIterator for DeclarationImportanceIterator<'a> {
}
}

/// Iterator over `PropertyDeclaration` for Importance::Normal.
pub struct NormalDeclarationIterator<'a>(DeclarationImportanceIterator<'a>);

impl<'a> NormalDeclarationIterator<'a> {
/// Constructor
pub fn new(declarations: &'a [PropertyDeclaration], important: &'a SmallBitVec) -> Self {
NormalDeclarationIterator(
DeclarationImportanceIterator::new(declarations, important)
)
}
}

impl<'a> Iterator for NormalDeclarationIterator<'a> {
type Item = &'a PropertyDeclaration;

fn next(&mut self) -> Option<Self::Item> {
loop {
let next = self.0.iter.next();
match next {
Some((decl, importance)) => {
if !importance {
return Some(decl);
}
},
None => return None,
}
}
}

fn size_hint(&self) -> (usize, Option<usize>) {
self.0.iter.size_hint()
}
}

/// Iterator for AnimationValue to be generated from PropertyDeclarationBlock.
pub struct AnimationValueIterator<'a, 'cx, 'cx_a:'cx> {
iter: DeclarationImportanceIterator<'a>,
Expand Down Expand Up @@ -208,6 +242,11 @@ impl PropertyDeclarationBlock {
DeclarationImportanceIterator::new(&self.declarations, &self.declarations_importance)
}

/// Iterate over `PropertyDeclaration` for Importance::Normal
pub fn normal_declaration_iter(&self) -> NormalDeclarationIterator {
NormalDeclarationIterator::new(&self.declarations, &self.declarations_importance)
}

/// Return an iterator of (AnimatableLonghand, AnimationValue).
pub fn to_animation_value_iter<'a, 'cx, 'cx_a:'cx>(&'a self,
context: &'cx mut Context<'cx_a>,
Expand Down
10 changes: 7 additions & 3 deletions components/style/stylesheets/keyframes_rule.rs
Expand Up @@ -375,9 +375,13 @@ fn get_animated_properties(keyframes: &[Arc<Locked<Keyframe>>], guard: &SharedRw
for keyframe in keyframes {
let keyframe = keyframe.read_with(&guard);
let block = keyframe.block.read_with(guard);
for (declaration, importance) in block.declaration_importance_iter() {
assert!(!importance.important());

// CSS Animations spec clearly defines that properties with !important
// in keyframe rules are invalid and ignored, but it's still ambiguous
// whether we should drop the !important properties or retain the
// properties when they are set via CSSOM. So we assume there might
// be properties with !important in keyframe rules here.
// See the spec issue https://github.com/w3c/csswg-drafts/issues/1824
for declaration in block.normal_declaration_iter() {
if let Some(property) = AnimatableLonghand::from_declaration(declaration) {
// Skip the 'display' property because although it is animatable from SMIL,
// it should not be animatable from CSS Animations or Web Animations.
Expand Down
5 changes: 2 additions & 3 deletions ports/geckolib/glue.rs
Expand Up @@ -3596,10 +3596,9 @@ pub extern "C" fn Servo_StyleSet_GetKeyframesForName(raw_data: RawServoStyleSetB
},
KeyframesStepValue::Declarations { ref block } => {
let guard = block.read_with(&guard);
// Filter out non-animatable properties.
// Filter out non-animatable properties and properties with !important.
let animatable =
guard.declarations()
.iter()
guard.normal_declaration_iter()
.filter(|declaration| declaration.is_animatable());

for declaration in animatable {
Expand Down

0 comments on commit a940999

Please sign in to comment.