aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/csskeyframerule.rs22
-rw-r--r--components/script/dom/cssstyledeclaration.rs16
-rw-r--r--components/script/dom/cssstylerule.rs2
-rw-r--r--components/script/dom/webidls/CSSKeyframeRule.webidl2
-rw-r--r--tests/wpt/metadata/MANIFEST.json6
-rw-r--r--tests/wpt/web-platform-tests/cssom/CSSKeyframeRule.html44
6 files changed, 79 insertions, 13 deletions
diff --git a/components/script/dom/csskeyframerule.rs b/components/script/dom/csskeyframerule.rs
index 78916d339ab..9d245d98343 100644
--- a/components/script/dom/csskeyframerule.rs
+++ b/components/script/dom/csskeyframerule.rs
@@ -2,11 +2,12 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use dom::bindings::codegen::Bindings::CSSKeyframeRuleBinding;
-use dom::bindings::js::Root;
-use dom::bindings::reflector::reflect_dom_object;
+use dom::bindings::codegen::Bindings::CSSKeyframeRuleBinding::{self, CSSKeyframeRuleMethods};
+use dom::bindings::js::{JS, MutNullableJS, Root};
+use dom::bindings::reflector::{DomObject, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::cssrule::{CSSRule, SpecificCSSRule};
+use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner};
use dom::cssstylesheet::CSSStyleSheet;
use dom::window::Window;
use parking_lot::RwLock;
@@ -19,6 +20,7 @@ pub struct CSSKeyframeRule {
cssrule: CSSRule,
#[ignore_heap_size_of = "Arc"]
keyframerule: Arc<RwLock<Keyframe>>,
+ style_decl: MutNullableJS<CSSStyleDeclaration>,
}
impl CSSKeyframeRule {
@@ -27,6 +29,7 @@ impl CSSKeyframeRule {
CSSKeyframeRule {
cssrule: CSSRule::new_inherited(parent_stylesheet),
keyframerule: keyframerule,
+ style_decl: Default::default(),
}
}
@@ -39,6 +42,19 @@ impl CSSKeyframeRule {
}
}
+impl CSSKeyframeRuleMethods for CSSKeyframeRule {
+ // https://drafts.csswg.org/css-animations/#dom-csskeyframerule-style
+ fn Style(&self) -> Root<CSSStyleDeclaration> {
+ self.style_decl.or_init(|| {
+ CSSStyleDeclaration::new(self.global().as_window(),
+ CSSStyleOwner::CSSRule(JS::from_ref(self.global().as_window()),
+ self.keyframerule.read().block.clone()),
+ None,
+ CSSModificationAccess::ReadWrite)
+ })
+ }
+}
+
impl SpecificCSSRule for CSSKeyframeRule {
fn ty(&self) -> u16 {
use dom::bindings::codegen::Bindings::CSSRuleBinding::CSSRuleConstants;
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs
index 7cd63aa12b0..7595fe4bfd5 100644
--- a/components/script/dom/cssstyledeclaration.rs
+++ b/components/script/dom/cssstyledeclaration.rs
@@ -34,9 +34,9 @@ pub struct CSSStyleDeclaration {
#[must_root]
pub enum CSSStyleOwner {
Element(JS<Element>),
- CSSStyleRule(JS<Window>,
- #[ignore_heap_size_of = "Arc"]
- Arc<RwLock<PropertyDeclarationBlock>>),
+ CSSRule(JS<Window>,
+ #[ignore_heap_size_of = "Arc"]
+ Arc<RwLock<PropertyDeclarationBlock>>),
}
impl CSSStyleOwner {
@@ -49,7 +49,7 @@ impl CSSStyleOwner {
None
}
}
- CSSStyleOwner::CSSStyleRule(_, ref pdb) => {
+ CSSStyleOwner::CSSRule(_, ref pdb) => {
Some(pdb.clone())
}
}
@@ -58,7 +58,7 @@ impl CSSStyleOwner {
fn window(&self) -> Root<Window> {
match *self {
CSSStyleOwner::Element(ref el) => window_from_node(&**el),
- CSSStyleOwner::CSSStyleRule(ref window, _) => Root::from_ref(&**window),
+ CSSStyleOwner::CSSRule(ref window, _) => Root::from_ref(&**window),
}
}
@@ -72,7 +72,7 @@ impl CSSStyleOwner {
match *self {
CSSStyleOwner::Element(ref el) =>
el.upcast::<Node>().dirty(NodeDamage::NodeStyleDamaged),
- CSSStyleOwner::CSSStyleRule(ref window, _) =>
+ CSSStyleOwner::CSSRule(ref window, _) =>
window.Document().invalidate_stylesheets(),
}
}
@@ -126,8 +126,8 @@ impl CSSStyleDeclaration {
fn get_computed_style(&self, property: PropertyId) -> DOMString {
match self.owner {
- CSSStyleOwner::CSSStyleRule(..) =>
- panic!("get_computed_style called on CSSStyleDeclaration with a CSSStyleRule owner"),
+ CSSStyleOwner::CSSRule(..) =>
+ panic!("get_computed_style called on CSSStyleDeclaration with a CSSRule owner"),
CSSStyleOwner::Element(ref el) => {
let node = el.upcast::<Node>();
if !node.is_in_doc() {
diff --git a/components/script/dom/cssstylerule.rs b/components/script/dom/cssstylerule.rs
index 3e23864ae61..1eb6e74df8b 100644
--- a/components/script/dom/cssstylerule.rs
+++ b/components/script/dom/cssstylerule.rs
@@ -58,7 +58,7 @@ impl CSSStyleRuleMethods for CSSStyleRule {
fn Style(&self) -> Root<CSSStyleDeclaration> {
self.style_decl.or_init(|| {
CSSStyleDeclaration::new(self.global().as_window(),
- CSSStyleOwner::CSSStyleRule(JS::from_ref(self.global().as_window()),
+ CSSStyleOwner::CSSRule(JS::from_ref(self.global().as_window()),
self.stylerule.read().block.clone()),
None,
CSSModificationAccess::ReadWrite)
diff --git a/components/script/dom/webidls/CSSKeyframeRule.webidl b/components/script/dom/webidls/CSSKeyframeRule.webidl
index 5458440be6d..079b88ef231 100644
--- a/components/script/dom/webidls/CSSKeyframeRule.webidl
+++ b/components/script/dom/webidls/CSSKeyframeRule.webidl
@@ -6,5 +6,5 @@
[Exposed=Window]
interface CSSKeyframeRule : CSSRule {
// attribute DOMString keyText;
- // readonly attribute CSSStyleDeclaration style;
+ readonly attribute CSSStyleDeclaration style;
};
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index f7d01004cf1..46a4e70d852 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -45847,6 +45847,12 @@
"deleted_reftests": {},
"items": {
"testharness": {
+ "cssom/CSSKeyframeRule.html": [
+ {
+ "path": "cssom/CSSKeyframeRule.html",
+ "url": "/cssom/CSSKeyframeRule.html"
+ }
+ ],
"cssom/overflow-serialization.html": [
{
"path": "cssom/overflow-serialization.html",
diff --git a/tests/wpt/web-platform-tests/cssom/CSSKeyframeRule.html b/tests/wpt/web-platform-tests/cssom/CSSKeyframeRule.html
new file mode 100644
index 00000000000..20067f95cd2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom/CSSKeyframeRule.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<meta charset="utf-8">
+<title></title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style type="text/css" id="styleElement">
+ div { animation: 3s slidein; }
+ @keyframes slidein {
+ from {
+ margin-left: 100%;
+ width: 300%;
+ }
+
+ to {
+ margin-left: 0%;
+ width: 100%;
+ }
+ }
+</style>
+<script>
+ var styleSheet = document.getElementById("styleElement").sheet;
+ var keyframesRule = styleSheet.cssRules[1];
+ var fromRule = keyframesRule.cssRules[0];
+ var toRule = keyframesRule.cssRules[1];
+
+ test(function() {
+ assert_equals(keyframesRule.name, "slidein");
+ assert_equals(typeof fromRule.style, "object");
+ assert_equals(fromRule.style.marginLeft, "100%");
+ assert_equals(fromRule.style.width, "300%");
+
+ assert_equals(typeof toRule.style, "object");
+ assert_equals(toRule.style.marginLeft, "0%");
+ assert_equals(toRule.style.width, "100%");
+
+ toRule.style.marginLeft = "-5%";
+ toRule.style.width = "50%";
+
+ assert_equals(fromRule.style.marginLeft, "100%");
+ assert_equals(fromRule.style.width, "300%");
+ assert_equals(toRule.style.marginLeft, "-5%");
+ assert_equals(toRule.style.width, "50%");
+ }, "CSSKeyframeRule: style property");
+</script>