aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/csskeyframesrule.rs7
-rw-r--r--components/script/dom/cssrule.rs20
-rw-r--r--components/script/dom/cssrulelist.rs11
-rw-r--r--components/script/dom/mod.rs2
4 files changed, 32 insertions, 8 deletions
diff --git a/components/script/dom/csskeyframesrule.rs b/components/script/dom/csskeyframesrule.rs
index 79cd7ce3e6f..444ae8a5424 100644
--- a/components/script/dom/csskeyframesrule.rs
+++ b/components/script/dom/csskeyframesrule.rs
@@ -55,7 +55,8 @@ impl CSSKeyframesRule {
}
impl CSSKeyframesRuleMethods for CSSKeyframesRule {
- fn CssRules(&self) -> Root<CSSRuleList> {
+ // https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-cssrules
+ fn CssRules(&self) -> Root<CSSRuleList> {
self.rulelist()
}
}
@@ -69,4 +70,8 @@ impl SpecificCSSRule for CSSKeyframesRule {
fn get_css(&self) -> DOMString {
self.keyframesrule.read().to_css_string().into()
}
+
+ fn deparent_children(&self) {
+ self.rulelist.get().map(|list| list.deparent_all());
+ }
}
diff --git a/components/script/dom/cssrule.rs b/components/script/dom/cssrule.rs
index 7b1edcab045..ca1e52b77f0 100644
--- a/components/script/dom/cssrule.rs
+++ b/components/script/dom/cssrule.rs
@@ -9,8 +9,8 @@ use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::cssfontfacerule::CSSFontFaceRule;
-use dom::csskeyframesrule::CSSKeyframesRule;
use dom::csskeyframerule::CSSKeyframeRule;
+use dom::csskeyframesrule::CSSKeyframesRule;
use dom::cssmediarule::CSSMediaRule;
use dom::cssnamespacerule::CSSNamespaceRule;
use dom::cssstylerule::CSSStyleRule;
@@ -78,10 +78,18 @@ impl CSSRule {
}
/// Sets owner sheet/rule to null
- pub fn disown(&self) {
- self.parent.set(None);
+ pub fn detach(&self) {
+ self.deparent();
// should set parent rule to None when we add parent rule support
- // Should we disown children as well? (https://github.com/w3c/csswg-drafts/issues/722)
+ }
+
+ /// Sets owner sheet to null (and does the same for all children)
+ pub fn deparent(&self) {
+ self.parent.set(None);
+ // https://github.com/w3c/csswg-drafts/issues/722
+ // Spec doesn't ask us to do this, but it makes sense
+ // and browsers implement this behavior
+ self.as_specific().deparent_children();
}
}
@@ -110,4 +118,8 @@ impl CSSRuleMethods for CSSRule {
pub trait SpecificCSSRule {
fn ty(&self) -> u16;
fn get_css(&self) -> DOMString;
+ /// Remove CSSStyleSheet parent from all transitive children
+ fn deparent_children(&self) {
+ // most CSSRules do nothing here
+ }
}
diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs
index ebdea9f2ca0..f7969aeb984 100644
--- a/components/script/dom/cssrulelist.rs
+++ b/components/script/dom/cssrulelist.rs
@@ -9,8 +9,8 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::error::{Error, ErrorResult, Fallible};
use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
-use dom::cssrule::CSSRule;
use dom::csskeyframerule::CSSKeyframeRule;
+use dom::cssrule::CSSRule;
use dom::cssstylesheet::CSSStyleSheet;
use dom::window::Window;
use parking_lot::RwLock;
@@ -166,10 +166,17 @@ impl CSSRuleList {
let mut dom_rules = self.dom_rules.borrow_mut();
css_rules.0.write().remove(index);
- dom_rules[index].get().map(|r| r.disown());
+ dom_rules[index].get().map(|r| r.detach());
dom_rules.remove(index);
Ok(())
}
+
+ // Remove parent stylesheets from all children
+ pub fn deparent_all(&self) {
+ for rule in self.dom_rules.borrow().iter() {
+ rule.get().map(|r| Root::upcast(r).deparent());
+ }
+ }
}
impl CSSRuleListMethods for CSSRuleList {
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 5895e0c08cb..23209d89e07 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -244,8 +244,8 @@ pub mod crypto;
pub mod css;
pub mod cssfontfacerule;
pub mod cssgroupingrule;
-pub mod csskeyframesrule;
pub mod csskeyframerule;
+pub mod csskeyframesrule;
pub mod cssmediarule;
pub mod cssnamespacerule;
pub mod cssrule;