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 | |
parent | 52a3a71be3d025f080bb5fe4603f517a5523aa5d (diff) | |
download | servo-53c99662bce82d9975c1a91e66cfdf1197ff53a2.tar.gz servo-53c99662bce82d9975c1a91e66cfdf1197ff53a2.zip |
Make parent stylesheet optional for CSSRules
-rw-r--r-- | components/script/dom/cssfontfacerule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssgroupingrule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/csskeyframerule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/csskeyframesrule.rs | 15 | ||||
-rw-r--r-- | components/script/dom/cssmediarule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssnamespacerule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssrule.rs | 9 | ||||
-rw-r--r-- | components/script/dom/cssrulelist.rs | 19 | ||||
-rw-r--r-- | components/script/dom/cssstylerule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssstylesheet.rs | 2 | ||||
-rw-r--r-- | components/script/dom/cssviewportrule.rs | 4 |
11 files changed, 41 insertions, 32 deletions
diff --git a/components/script/dom/cssfontfacerule.rs b/components/script/dom/cssfontfacerule.rs index 18371c89c45..60022b7ba8f 100644 --- a/components/script/dom/cssfontfacerule.rs +++ b/components/script/dom/cssfontfacerule.rs @@ -22,7 +22,7 @@ pub struct CSSFontFaceRule { } impl CSSFontFaceRule { - fn new_inherited(parent: &CSSStyleSheet, fontfacerule: Arc<RwLock<FontFaceRule>>) -> CSSFontFaceRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, fontfacerule: Arc<RwLock<FontFaceRule>>) -> CSSFontFaceRule { CSSFontFaceRule { cssrule: CSSRule::new_inherited(parent), fontfacerule: fontfacerule, @@ -30,7 +30,7 @@ impl CSSFontFaceRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, fontfacerule: Arc<RwLock<FontFaceRule>>) -> Root<CSSFontFaceRule> { reflect_dom_object(box CSSFontFaceRule::new_inherited(parent, fontfacerule), window, diff --git a/components/script/dom/cssgroupingrule.rs b/components/script/dom/cssgroupingrule.rs index 3558686ea74..34d7a9d15b6 100644 --- a/components/script/dom/cssgroupingrule.rs +++ b/components/script/dom/cssgroupingrule.rs @@ -15,14 +15,14 @@ pub struct CSSGroupingRule { } impl CSSGroupingRule { - pub fn new_inherited(parent: &CSSStyleSheet) -> CSSGroupingRule { + pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSGroupingRule { CSSGroupingRule { cssrule: CSSRule::new_inherited(parent), } } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet) -> Root<CSSGroupingRule> { + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>) -> Root<CSSGroupingRule> { reflect_dom_object(box CSSGroupingRule::new_inherited(parent), window, CSSGroupingRuleBinding::Wrap) diff --git a/components/script/dom/csskeyframerule.rs b/components/script/dom/csskeyframerule.rs index 1cebaf706a7..6062c40ca25 100644 --- a/components/script/dom/csskeyframerule.rs +++ b/components/script/dom/csskeyframerule.rs @@ -21,7 +21,7 @@ pub struct CSSKeyframeRule { } impl CSSKeyframeRule { - fn new_inherited(parent: &CSSStyleSheet, keyframerule: Arc<RwLock<Keyframe>>) -> CSSKeyframeRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, keyframerule: Arc<RwLock<Keyframe>>) -> CSSKeyframeRule { CSSKeyframeRule { cssrule: CSSRule::new_inherited(parent), keyframerule: keyframerule, @@ -29,7 +29,7 @@ impl CSSKeyframeRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, keyframerule: Arc<RwLock<Keyframe>>) -> Root<CSSKeyframeRule> { reflect_dom_object(box CSSKeyframeRule::new_inherited(parent, keyframerule), window, diff --git a/components/script/dom/csskeyframesrule.rs b/components/script/dom/csskeyframesrule.rs index 5a14f2c3acd..79cd7ce3e6f 100644 --- a/components/script/dom/csskeyframesrule.rs +++ b/components/script/dom/csskeyframesrule.rs @@ -27,7 +27,7 @@ pub struct CSSKeyframesRule { } impl CSSKeyframesRule { - fn new_inherited(parent: &CSSStyleSheet, keyframesrule: Arc<RwLock<KeyframesRule>>) -> CSSKeyframesRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, keyframesrule: Arc<RwLock<KeyframesRule>>) -> CSSKeyframesRule { CSSKeyframesRule { cssrule: CSSRule::new_inherited(parent), keyframesrule: keyframesrule, @@ -36,7 +36,7 @@ impl CSSKeyframesRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, keyframesrule: Arc<RwLock<KeyframesRule>>) -> Root<CSSKeyframesRule> { reflect_dom_object(box CSSKeyframesRule::new_inherited(parent, keyframesrule), window, @@ -44,10 +44,13 @@ impl CSSKeyframesRule { } fn rulelist(&self) -> Root<CSSRuleList> { - self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(), - // temporary unwrap - &self.upcast::<CSSRule>().GetParentStyleSheet().unwrap(), - RulesSource::Keyframes(self.keyframesrule.clone()))) + self.rulelist.or_init(|| { + let sheet = self.upcast::<CSSRule>().GetParentStyleSheet(); + let sheet = sheet.as_ref().map(|s| &**s); + CSSRuleList::new(self.global().as_window(), + sheet, + RulesSource::Keyframes(self.keyframesrule.clone())) + }) } } diff --git a/components/script/dom/cssmediarule.rs b/components/script/dom/cssmediarule.rs index a8d8649b31f..d6eef1319f7 100644 --- a/components/script/dom/cssmediarule.rs +++ b/components/script/dom/cssmediarule.rs @@ -23,7 +23,7 @@ pub struct CSSMediaRule { } impl CSSMediaRule { - fn new_inherited(parent: &CSSStyleSheet, mediarule: Arc<RwLock<MediaRule>>) -> CSSMediaRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, mediarule: Arc<RwLock<MediaRule>>) -> CSSMediaRule { CSSMediaRule { cssrule: CSSGroupingRule::new_inherited(parent), mediarule: mediarule, @@ -31,7 +31,7 @@ impl CSSMediaRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, mediarule: Arc<RwLock<MediaRule>>) -> Root<CSSMediaRule> { reflect_dom_object(box CSSMediaRule::new_inherited(parent, mediarule), window, diff --git a/components/script/dom/cssnamespacerule.rs b/components/script/dom/cssnamespacerule.rs index 04c4431df77..e7de369584d 100644 --- a/components/script/dom/cssnamespacerule.rs +++ b/components/script/dom/cssnamespacerule.rs @@ -22,7 +22,7 @@ pub struct CSSNamespaceRule { } impl CSSNamespaceRule { - fn new_inherited(parent: &CSSStyleSheet, namespacerule: Arc<RwLock<NamespaceRule>>) -> CSSNamespaceRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, namespacerule: Arc<RwLock<NamespaceRule>>) -> CSSNamespaceRule { CSSNamespaceRule { cssrule: CSSRule::new_inherited(parent), namespacerule: namespacerule, @@ -30,7 +30,7 @@ impl CSSNamespaceRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, namespacerule: Arc<RwLock<NamespaceRule>>) -> Root<CSSNamespaceRule> { reflect_dom_object(box CSSNamespaceRule::new_inherited(parent, namespacerule), window, diff --git a/components/script/dom/cssrule.rs b/components/script/dom/cssrule.rs index 2a2e3cf3165..7b1edcab045 100644 --- a/components/script/dom/cssrule.rs +++ b/components/script/dom/cssrule.rs @@ -28,15 +28,15 @@ pub struct CSSRule { impl CSSRule { #[allow(unrooted_must_root)] - pub fn new_inherited(parent: &CSSStyleSheet) -> CSSRule { + pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSRule { CSSRule { reflector_: Reflector::new(), - parent: MutNullableHeap::new(Some(parent)), + parent: MutNullableHeap::new(parent), } } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet) -> Root<CSSRule> { + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>) -> Root<CSSRule> { reflect_dom_object(box CSSRule::new_inherited(parent), window, CSSRuleBinding::Wrap) @@ -64,7 +64,7 @@ impl CSSRule { // Given a StyleCssRule, create a new instance of a derived class of // CSSRule based on which rule it is - pub fn new_specific(window: &Window, parent: &CSSStyleSheet, + pub fn new_specific(window: &Window, parent: Option<&CSSStyleSheet>, rule: StyleCssRule) -> Root<CSSRule> { // be sure to update the match in as_specific when this is updated match rule { @@ -81,6 +81,7 @@ impl CSSRule { pub fn disown(&self) { self.parent.set(None); // 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) } } 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())) diff --git a/components/script/dom/cssstylerule.rs b/components/script/dom/cssstylerule.rs index 30726018ca9..7d776655147 100644 --- a/components/script/dom/cssstylerule.rs +++ b/components/script/dom/cssstylerule.rs @@ -22,7 +22,7 @@ pub struct CSSStyleRule { } impl CSSStyleRule { - fn new_inherited(parent: &CSSStyleSheet, stylerule: Arc<RwLock<StyleRule>>) -> CSSStyleRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, stylerule: Arc<RwLock<StyleRule>>) -> CSSStyleRule { CSSStyleRule { cssrule: CSSRule::new_inherited(parent), stylerule: stylerule, @@ -30,7 +30,7 @@ impl CSSStyleRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, stylerule: Arc<RwLock<StyleRule>>) -> Root<CSSStyleRule> { reflect_dom_object(box CSSStyleRule::new_inherited(parent, stylerule), window, diff --git a/components/script/dom/cssstylesheet.rs b/components/script/dom/cssstylesheet.rs index c8f801a0417..8ebe11b8d98 100644 --- a/components/script/dom/cssstylesheet.rs +++ b/components/script/dom/cssstylesheet.rs @@ -44,7 +44,7 @@ impl CSSStyleSheet { fn rulelist(&self) -> Root<CSSRuleList> { self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(), - self, + Some(self), RulesSource::Rules(self.style_stylesheet .rules.clone()))) } diff --git a/components/script/dom/cssviewportrule.rs b/components/script/dom/cssviewportrule.rs index f534c535a64..b324b0c64f5 100644 --- a/components/script/dom/cssviewportrule.rs +++ b/components/script/dom/cssviewportrule.rs @@ -22,7 +22,7 @@ pub struct CSSViewportRule { } impl CSSViewportRule { - fn new_inherited(parent: &CSSStyleSheet, viewportrule: Arc<RwLock<ViewportRule>>) -> CSSViewportRule { + fn new_inherited(parent: Option<&CSSStyleSheet>, viewportrule: Arc<RwLock<ViewportRule>>) -> CSSViewportRule { CSSViewportRule { cssrule: CSSRule::new_inherited(parent), viewportrule: viewportrule, @@ -30,7 +30,7 @@ impl CSSViewportRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: &CSSStyleSheet, + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, viewportrule: Arc<RwLock<ViewportRule>>) -> Root<CSSViewportRule> { reflect_dom_object(box CSSViewportRule::new_inherited(parent, viewportrule), window, |