diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2016-11-16 17:31:37 -0800 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2016-11-23 09:32:40 -0800 |
commit | 53c99662bce82d9975c1a91e66cfdf1197ff53a2 (patch) | |
tree | 6cd50acdb6edc9da4d7b43e4e7c5547536e88082 /components/script/dom/cssrulelist.rs | |
parent | 52a3a71be3d025f080bb5fe4603f517a5523aa5d (diff) | |
download | servo-53c99662bce82d9975c1a91e66cfdf1197ff53a2.tar.gz servo-53c99662bce82d9975c1a91e66cfdf1197ff53a2.zip |
Make parent stylesheet optional for CSSRules
Diffstat (limited to 'components/script/dom/cssrulelist.rs')
-rw-r--r-- | components/script/dom/cssrulelist.rs | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index 902f3c8a189..ebdea9f2ca0 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -24,7 +24,7 @@ no_jsmanaged_fields!(RulesSource); #[dom_struct] pub struct CSSRuleList { reflector_: Reflector, - sheet: JS<CSSStyleSheet>, + sheet: MutNullableHeap<JS<CSSStyleSheet>>, #[ignore_heap_size_of = "Arc"] rules: RulesSource, dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>> @@ -37,7 +37,7 @@ pub enum RulesSource { impl CSSRuleList { #[allow(unrooted_must_root)] - pub fn new_inherited(sheet: &CSSStyleSheet, rules: RulesSource) -> CSSRuleList { + pub fn new_inherited(sheet: Option<&CSSStyleSheet>, rules: RulesSource) -> CSSRuleList { let dom_rules = match rules { RulesSource::Rules(ref rules) => { rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect() @@ -49,14 +49,15 @@ impl CSSRuleList { CSSRuleList { reflector_: Reflector::new(), - sheet: JS::from_ref(sheet), + sheet: MutNullableHeap::new(sheet), rules: rules, dom_rules: DOMRefCell::new(dom_rules), } } #[allow(unrooted_must_root)] - pub fn new(window: &Window, sheet: &CSSStyleSheet, rules: RulesSource) -> Root<CSSRuleList> { + pub fn new(window: &Window, sheet: Option<&CSSStyleSheet>, + rules: RulesSource) -> Root<CSSRuleList> { reflect_dom_object(box CSSRuleList::new_inherited(sheet, rules), window, CSSRuleListBinding::Wrap) @@ -132,7 +133,9 @@ impl CSSRuleList { }; insert(&mut css_rules.0.write(), index, new_rule.clone()); - let dom_rule = CSSRule::new_specific(&window, &self.sheet, new_rule); + let sheet = self.sheet.get(); + let sheet = sheet.as_ref().map(|sheet| &**sheet); + let dom_rule = CSSRule::new_specific(&window, sheet, new_rule); insert(&mut self.dom_rules.borrow_mut(), index, MutNullableHeap::new(Some(&*dom_rule))); Ok((idx)) @@ -174,15 +177,17 @@ impl CSSRuleListMethods for CSSRuleList { 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); match self.rules { RulesSource::Rules(ref rules) => { CSSRule::new_specific(self.global().as_window(), - &self.sheet, + sheet, rules.0.read()[idx as usize].clone()) } RulesSource::Keyframes(ref rules) => { Root::upcast(CSSKeyframeRule::new(self.global().as_window(), - &self.sheet, + sheet, rules.read() .keyframes[idx as usize] .clone())) |