diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2016-11-28 16:33:47 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2016-11-28 16:50:38 +0100 |
commit | f1d49d3773846a65cb403af4e041660fad3117be (patch) | |
tree | ae2fde379903ccffe40c7629a4027e25c9a783d7 /components/script/dom/cssrulelist.rs | |
parent | 0714e2291cbb0ff888f817dd75414882e9309e8f (diff) | |
download | servo-f1d49d3773846a65cb403af4e041660fad3117be.tar.gz servo-f1d49d3773846a65cb403af4e041660fad3117be.zip |
Make CSSRule always keep a pointer to its parent stylesheet
even when the parentStylesheet IDL attribute returns null.
Diffstat (limited to 'components/script/dom/cssrulelist.rs')
-rw-r--r-- | components/script/dom/cssrulelist.rs | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index 0f2212319dc..643cce9a944 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -34,7 +34,7 @@ impl From<RulesMutateError> for Error { #[dom_struct] pub struct CSSRuleList { reflector_: Reflector, - sheet: MutNullableHeap<JS<CSSStyleSheet>>, + parent_stylesheet: JS<CSSStyleSheet>, #[ignore_heap_size_of = "Arc"] rules: RulesSource, dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>> @@ -47,7 +47,7 @@ pub enum RulesSource { impl CSSRuleList { #[allow(unrooted_must_root)] - pub fn new_inherited(sheet: Option<&CSSStyleSheet>, rules: RulesSource) -> CSSRuleList { + pub fn new_inherited(parent_stylesheet: &CSSStyleSheet, rules: RulesSource) -> CSSRuleList { let dom_rules = match rules { RulesSource::Rules(ref rules) => { rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect() @@ -59,16 +59,16 @@ impl CSSRuleList { CSSRuleList { reflector_: Reflector::new(), - sheet: MutNullableHeap::new(sheet), + parent_stylesheet: JS::from_ref(parent_stylesheet), rules: rules, dom_rules: DOMRefCell::new(dom_rules), } } #[allow(unrooted_must_root)] - pub fn new(window: &Window, sheet: Option<&CSSStyleSheet>, + pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, rules: RulesSource) -> Root<CSSRuleList> { - reflect_dom_object(box CSSRuleList::new_inherited(sheet, rules), + reflect_dom_object(box CSSRuleList::new_inherited(parent_stylesheet, rules), window, CSSRuleListBinding::Wrap) } @@ -89,9 +89,8 @@ impl CSSRuleList { let new_rule = css_rules.insert_rule(rule, doc.url().clone(), index, nested)?; - let sheet = self.sheet.get(); - let sheet = sheet.as_ref().map(|sheet| &**sheet); - let dom_rule = CSSRule::new_specific(&window, sheet, new_rule); + let parent_stylesheet = &*self.parent_stylesheet; + let dom_rule = CSSRule::new_specific(&window, parent_stylesheet, new_rule); self.dom_rules.borrow_mut().insert(index, MutNullableHeap::new(Some(&*dom_rule))); Ok((idx)) } @@ -129,17 +128,16 @@ impl CSSRuleList { pub fn item(&self, idx: u32) -> Option<Root<CSSRule>> { self.dom_rules.borrow().get(idx as usize).map(|rule| { rule.or_init(|| { - let sheet = self.sheet.get(); - let sheet = sheet.as_ref().map(|sheet| &**sheet); + let parent_stylesheet = &self.parent_stylesheet; match self.rules { RulesSource::Rules(ref rules) => { CSSRule::new_specific(self.global().as_window(), - sheet, + parent_stylesheet, rules.0.read()[idx as usize].clone()) } RulesSource::Keyframes(ref rules) => { Root::upcast(CSSKeyframeRule::new(self.global().as_window(), - sheet, + parent_stylesheet, rules.read() .keyframes[idx as usize] .clone())) |