Make parent stylesheet optional for CSSRules

This commit is contained in:
Manish Goregaokar 2016-11-16 17:31:37 -08:00
parent 52a3a71be3
commit 53c99662bc
11 changed files with 41 additions and 32 deletions

View file

@ -22,7 +22,7 @@ pub struct CSSFontFaceRule {
} }
impl 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 { CSSFontFaceRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
fontfacerule: fontfacerule, fontfacerule: fontfacerule,
@ -30,7 +30,7 @@ impl CSSFontFaceRule {
} }
#[allow(unrooted_must_root)] #[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> { fontfacerule: Arc<RwLock<FontFaceRule>>) -> Root<CSSFontFaceRule> {
reflect_dom_object(box CSSFontFaceRule::new_inherited(parent, fontfacerule), reflect_dom_object(box CSSFontFaceRule::new_inherited(parent, fontfacerule),
window, window,

View file

@ -15,14 +15,14 @@ pub struct CSSGroupingRule {
} }
impl CSSGroupingRule { impl CSSGroupingRule {
pub fn new_inherited(parent: &CSSStyleSheet) -> CSSGroupingRule { pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSGroupingRule {
CSSGroupingRule { CSSGroupingRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
} }
} }
#[allow(unrooted_must_root)] #[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), reflect_dom_object(box CSSGroupingRule::new_inherited(parent),
window, window,
CSSGroupingRuleBinding::Wrap) CSSGroupingRuleBinding::Wrap)

View file

@ -21,7 +21,7 @@ pub struct CSSKeyframeRule {
} }
impl 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 { CSSKeyframeRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
keyframerule: keyframerule, keyframerule: keyframerule,
@ -29,7 +29,7 @@ impl CSSKeyframeRule {
} }
#[allow(unrooted_must_root)] #[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> { keyframerule: Arc<RwLock<Keyframe>>) -> Root<CSSKeyframeRule> {
reflect_dom_object(box CSSKeyframeRule::new_inherited(parent, keyframerule), reflect_dom_object(box CSSKeyframeRule::new_inherited(parent, keyframerule),
window, window,

View file

@ -27,7 +27,7 @@ pub struct CSSKeyframesRule {
} }
impl 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 { CSSKeyframesRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
keyframesrule: keyframesrule, keyframesrule: keyframesrule,
@ -36,7 +36,7 @@ impl CSSKeyframesRule {
} }
#[allow(unrooted_must_root)] #[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> { keyframesrule: Arc<RwLock<KeyframesRule>>) -> Root<CSSKeyframesRule> {
reflect_dom_object(box CSSKeyframesRule::new_inherited(parent, keyframesrule), reflect_dom_object(box CSSKeyframesRule::new_inherited(parent, keyframesrule),
window, window,
@ -44,10 +44,13 @@ impl CSSKeyframesRule {
} }
fn rulelist(&self) -> Root<CSSRuleList> { fn rulelist(&self) -> Root<CSSRuleList> {
self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(), self.rulelist.or_init(|| {
// temporary unwrap let sheet = self.upcast::<CSSRule>().GetParentStyleSheet();
&self.upcast::<CSSRule>().GetParentStyleSheet().unwrap(), let sheet = sheet.as_ref().map(|s| &**s);
RulesSource::Keyframes(self.keyframesrule.clone()))) CSSRuleList::new(self.global().as_window(),
sheet,
RulesSource::Keyframes(self.keyframesrule.clone()))
})
} }
} }

View file

@ -23,7 +23,7 @@ pub struct CSSMediaRule {
} }
impl 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 { CSSMediaRule {
cssrule: CSSGroupingRule::new_inherited(parent), cssrule: CSSGroupingRule::new_inherited(parent),
mediarule: mediarule, mediarule: mediarule,
@ -31,7 +31,7 @@ impl CSSMediaRule {
} }
#[allow(unrooted_must_root)] #[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> { mediarule: Arc<RwLock<MediaRule>>) -> Root<CSSMediaRule> {
reflect_dom_object(box CSSMediaRule::new_inherited(parent, mediarule), reflect_dom_object(box CSSMediaRule::new_inherited(parent, mediarule),
window, window,

View file

@ -22,7 +22,7 @@ pub struct CSSNamespaceRule {
} }
impl 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 { CSSNamespaceRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
namespacerule: namespacerule, namespacerule: namespacerule,
@ -30,7 +30,7 @@ impl CSSNamespaceRule {
} }
#[allow(unrooted_must_root)] #[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> { namespacerule: Arc<RwLock<NamespaceRule>>) -> Root<CSSNamespaceRule> {
reflect_dom_object(box CSSNamespaceRule::new_inherited(parent, namespacerule), reflect_dom_object(box CSSNamespaceRule::new_inherited(parent, namespacerule),
window, window,

View file

@ -28,15 +28,15 @@ pub struct CSSRule {
impl CSSRule { impl CSSRule {
#[allow(unrooted_must_root)] #[allow(unrooted_must_root)]
pub fn new_inherited(parent: &CSSStyleSheet) -> CSSRule { pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSRule {
CSSRule { CSSRule {
reflector_: Reflector::new(), reflector_: Reflector::new(),
parent: MutNullableHeap::new(Some(parent)), parent: MutNullableHeap::new(parent),
} }
} }
#[allow(unrooted_must_root)] #[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), reflect_dom_object(box CSSRule::new_inherited(parent),
window, window,
CSSRuleBinding::Wrap) CSSRuleBinding::Wrap)
@ -64,7 +64,7 @@ impl CSSRule {
// Given a StyleCssRule, create a new instance of a derived class of // Given a StyleCssRule, create a new instance of a derived class of
// CSSRule based on which rule it is // 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> { rule: StyleCssRule) -> Root<CSSRule> {
// be sure to update the match in as_specific when this is updated // be sure to update the match in as_specific when this is updated
match rule { match rule {
@ -81,6 +81,7 @@ impl CSSRule {
pub fn disown(&self) { pub fn disown(&self) {
self.parent.set(None); self.parent.set(None);
// should set parent rule to None when we add parent rule support // 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)
} }
} }

View file

@ -24,7 +24,7 @@ no_jsmanaged_fields!(RulesSource);
#[dom_struct] #[dom_struct]
pub struct CSSRuleList { pub struct CSSRuleList {
reflector_: Reflector, reflector_: Reflector,
sheet: JS<CSSStyleSheet>, sheet: MutNullableHeap<JS<CSSStyleSheet>>,
#[ignore_heap_size_of = "Arc"] #[ignore_heap_size_of = "Arc"]
rules: RulesSource, rules: RulesSource,
dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>> dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>>
@ -37,7 +37,7 @@ pub enum RulesSource {
impl CSSRuleList { impl CSSRuleList {
#[allow(unrooted_must_root)] #[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 { let dom_rules = match rules {
RulesSource::Rules(ref rules) => { RulesSource::Rules(ref rules) => {
rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect() rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect()
@ -49,14 +49,15 @@ impl CSSRuleList {
CSSRuleList { CSSRuleList {
reflector_: Reflector::new(), reflector_: Reflector::new(),
sheet: JS::from_ref(sheet), sheet: MutNullableHeap::new(sheet),
rules: rules, rules: rules,
dom_rules: DOMRefCell::new(dom_rules), dom_rules: DOMRefCell::new(dom_rules),
} }
} }
#[allow(unrooted_must_root)] #[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), reflect_dom_object(box CSSRuleList::new_inherited(sheet, rules),
window, window,
CSSRuleListBinding::Wrap) CSSRuleListBinding::Wrap)
@ -132,7 +133,9 @@ impl CSSRuleList {
}; };
insert(&mut css_rules.0.write(), index, new_rule.clone()); 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(), insert(&mut self.dom_rules.borrow_mut(),
index, MutNullableHeap::new(Some(&*dom_rule))); index, MutNullableHeap::new(Some(&*dom_rule)));
Ok((idx)) Ok((idx))
@ -174,15 +177,17 @@ impl CSSRuleListMethods for CSSRuleList {
fn Item(&self, idx: u32) -> Option<Root<CSSRule>> { fn Item(&self, idx: u32) -> Option<Root<CSSRule>> {
self.dom_rules.borrow().get(idx as usize).map(|rule| { self.dom_rules.borrow().get(idx as usize).map(|rule| {
rule.or_init(|| { rule.or_init(|| {
let sheet = self.sheet.get();
let sheet = sheet.as_ref().map(|sheet| &**sheet);
match self.rules { match self.rules {
RulesSource::Rules(ref rules) => { RulesSource::Rules(ref rules) => {
CSSRule::new_specific(self.global().as_window(), CSSRule::new_specific(self.global().as_window(),
&self.sheet, sheet,
rules.0.read()[idx as usize].clone()) rules.0.read()[idx as usize].clone())
} }
RulesSource::Keyframes(ref rules) => { RulesSource::Keyframes(ref rules) => {
Root::upcast(CSSKeyframeRule::new(self.global().as_window(), Root::upcast(CSSKeyframeRule::new(self.global().as_window(),
&self.sheet, sheet,
rules.read() rules.read()
.keyframes[idx as usize] .keyframes[idx as usize]
.clone())) .clone()))

View file

@ -22,7 +22,7 @@ pub struct CSSStyleRule {
} }
impl 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 { CSSStyleRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
stylerule: stylerule, stylerule: stylerule,
@ -30,7 +30,7 @@ impl CSSStyleRule {
} }
#[allow(unrooted_must_root)] #[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> { stylerule: Arc<RwLock<StyleRule>>) -> Root<CSSStyleRule> {
reflect_dom_object(box CSSStyleRule::new_inherited(parent, stylerule), reflect_dom_object(box CSSStyleRule::new_inherited(parent, stylerule),
window, window,

View file

@ -44,7 +44,7 @@ impl CSSStyleSheet {
fn rulelist(&self) -> Root<CSSRuleList> { fn rulelist(&self) -> Root<CSSRuleList> {
self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(), self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(),
self, Some(self),
RulesSource::Rules(self.style_stylesheet RulesSource::Rules(self.style_stylesheet
.rules.clone()))) .rules.clone())))
} }

View file

@ -22,7 +22,7 @@ pub struct CSSViewportRule {
} }
impl 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 { CSSViewportRule {
cssrule: CSSRule::new_inherited(parent), cssrule: CSSRule::new_inherited(parent),
viewportrule: viewportrule, viewportrule: viewportrule,
@ -30,7 +30,7 @@ impl CSSViewportRule {
} }
#[allow(unrooted_must_root)] #[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> { viewportrule: Arc<RwLock<ViewportRule>>) -> Root<CSSViewportRule> {
reflect_dom_object(box CSSViewportRule::new_inherited(parent, viewportrule), reflect_dom_object(box CSSViewportRule::new_inherited(parent, viewportrule),
window, window,