Bug 1356779 - Test that there are multiple prefixed/non-prefixed @keyframes for servo. r?emilio draft
authorHiroyuki Ikezoe <hikezoe@mozilla.com>
Thu, 20 Apr 2017 15:46:11 +0900
changeset 565649 f674d28bd0cc4a54e8ea360522b39da003709a70
parent 565648 ce510ff4ddcb41629b27421a494df6b55d0dceca
child 625053 34d686939defdef4a1de7d01aaaed57b48e9c0f3
push id54936
push userhikezoe@mozilla.com
push dateThu, 20 Apr 2017 06:46:28 +0000
reviewersemilio
bugs1356779
milestone55.0a1
Bug 1356779 - Test that there are multiple prefixed/non-prefixed @keyframes for servo. r?emilio MozReview-Commit-ID: IJwK2JTSikq
servo/tests/unit/style/keyframes.rs
--- 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);
+}