--- a/servo/tests/unit/style/keyframes.rs
+++ b/servo/tests/unit/style/keyframes.rs
@@ -223,8 +223,110 @@ fn test_missing_keyframe_in_both_of_init
}
],
properties_changed: vec![TransitionProperty::Width, TransitionProperty::Height],
vendor_prefix: None,
};
assert_eq!(format!("{:#?}", animation), format!("{:#?}", expected));
}
+
+fn same_name_keyframes_test(rules: &str,
+ expected_name: &str,
+ expected_pdb: &PropertyDeclarationBlock) {
+ use euclid::size::TypedSize2D;
+ use media_queries::CSSErrorReporterTest;
+ use servo_atoms::Atom;
+ use servo_url::ServoUrl;
+ use std::marker::PhantomData;
+ use style::media_queries::{Device, MediaList, MediaType};
+ use style::shared_lock::StylesheetGuards;
+ use style::stylesheets::{Origin, Stylesheet};
+ use style::stylist::{ExtraStyleData, Stylist};
+
+ let url = ServoUrl::parse("about::test").unwrap();
+ let lock = SharedRwLock::new();
+ let media = Arc::new(lock.wrap(MediaList::empty()));
+ let stylesheet = Stylesheet::from_str(rules, url.clone(), Origin::UserAgent, media, lock,
+ None, &CSSErrorReporterTest, 0u64);
+ let stylesheets = vec![Arc::new(stylesheet)];
+
+ let guard = stylesheets[0].shared_lock.read();
+ let guards = StylesheetGuards::same(&guard);
+ let mut extra_data = ExtraStyleData {
+ marker: PhantomData,
+ };
+ let device = Device::new(MediaType::Screen, TypedSize2D::new(0., 0.));
+ let mut stylist = Arc::new(Stylist::new(device));
+ Arc::get_mut(&mut stylist).unwrap().update(&stylesheets,
+ &guards,
+ /* ua_sheets = */ None,
+ /* stylesheets_changed = */ true,
+ /* author_style_disabled = */ true,
+ &mut extra_data);
+
+ let animation = stylist.animations().get(&Atom::from(expected_name)).unwrap();
+
+ let shared_lock = SharedRwLock::new();
+ let expected = KeyframesStepValue::Declarations {
+ block: Arc::new(shared_lock.wrap({ expected_pdb.clone() }))
+ };
+
+ assert_eq!(format!("{:#?}", animation.steps[0].value), format!("{:#?}", expected));
+}
+
+#[test]
+fn test_keyframes_with_same_name() {
+ let expected_width =
+ PropertyDeclarationBlock::with_one(
+ PropertyDeclaration::Width(
+ LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(100f32))),
+ Importance::Normal
+ );
+
+ // @-moz-keyframes does not override ealier non-prefixed one.
+ let rules = "\
+ @keyframes foo { from, to { width: 100px } }\
+ @-moz-keyframes foo { from, to { width: 0px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+
+ // @-webkit-keyframes does not override ealier non-prefixed one.
+ let rules = "\
+ @keyframes foo { from, to { width: 100px } }\
+ @-webkit-keyframes foo { from, to { width: 0px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+
+ // non-prefixed @keyframes overrides ealier @-moz-keyframes.
+ let rules = "\
+ @-moz-keyframes foo { from, to { width: 0px } }\
+ @keyframes foo { from, to { width: 100px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+
+ // non-prefixed @keyframes overrides ealier @-webkit-keyframes.
+ let rules = "\
+ @-webkit-keyframes foo { from, to { width: 0px } }\
+ @keyframes foo { from, to { width: 100px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+
+ // later prefixed @keyframes overrides ealier prefixed @keyframes.
+ let rules = "\
+ @-webkit-keyframes foo { from, to { width: 0px } }\
+ @-moz-keyframes foo { from, to { width: 100px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+
+ let rules = "\
+ @-moz-keyframes foo { from, to { width: 0px } }\
+ @-webkit-keyframes foo { from, to { width: 100px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+
+ // non-prefixed @keyframes overrides ealier one.
+ let rules = "\
+ @keyframes foo { from, to { width: 0px } }\
+ @keyframes foo { from, to { width: 100px } }\
+ ";
+ same_name_keyframes_test(rules, "foo", &expected_width);
+}